Вопросы по оптимизации запросов 1С на собеседовании
Мидла и сеньора 1С отличают по тому, понимает ли он, что происходит с запросом в базе. Главный вопрос блока звучит просто: условие на склад поставить в параметр виртуальной таблицы или в ГДЕ. За ним идут срез последних с условием на реквизит, где результаты расходятся, и разговор о плане запроса.
Что спрашивают
- +Параметры виртуальных таблиц: что можно поставить в параметр, почему условие на остаток пишут в ГДЕ, граница МоментВремени
- +Остатки и обороты: какую таблицу брать для ведомости, периодичность, пропущенные дни без движений
- +Срез последних: условие в параметре и в ГДЕ, срез без даты, цена на дату каждой строки продаж
- +Антипаттерны: запрос в цикле, звёздочка, РАЗЛИЧНЫЕ поверх размножения, функция над полем в условии
- +Как запрос 1С становится SQL: имена таблиц в базе, составные поля, технологический журнал
- +Индексы: флаг Индексировать, составной индекс, избирательность и статистика
Из чего состоит тема
Так тема разложена в тренажёре: движок ведёт прогресс по каждой подтеме отдельно и возвращает те, что просели.
- Антипаттерны запросов12
- Индексы и план запроса12
- Как запрос 1С становится SQL12
- Остатки, Обороты, ОстаткиИОбороты12
- Параметры ВТ против ГДЕ12
- Срез последних12
Разборы подтем
Конспект по каждой: что это, как отвечать вслух, на чём валятся, плюс вопросы для самопроверки.
- Параметры виртуальных таблиц 1С против ГДЕ12 вопросов
- Остатки, Обороты и ОстаткиИОбороты в 1С12 вопросов
- Срез последних в 1С12 вопросов
- Медленные запросы 1С: запрос в цикле и другие ошибки12 вопросов
- Как запрос 1С становится SQL12 вопросов
- Индексы и план запроса в 1С12 вопросов
Примеры вопросов с разбором
- Какой антипаттерн чаще всего называют главной причиной тормозов в коде 1С?A)Использование временных таблиц вместо вложенных запросовB)Запрос в циклеC)Сортировка результата запроса по ссылкеD)Использование параметров вместо констант в тексте
показать ответ и разбор
+B)Запрос в цикле// разбор: Запрос внутри цикла по строкам выполняет сотни и тысячи обращений к СУБД, каждое со своим разбором и планом. Почти всегда задачу решает один запрос с временной таблицей или соединением. Временные таблицы и параметры — как раз рекомендованные приёмы.
- Что даёт свойство реквизита «Индексировать»?A)Реквизит становится уникальнымB)Реквизит кэшируется в памяти сервераC)Реквизит доступен для полнотекстового поискаD)Платформа создаёт индекс СУБД по реквизиту
показать ответ и разбор
+D)Платформа создаёт индекс СУБД по реквизиту// разбор: Индекс ускоряет отбор и сортировку по реквизиту, например поиск по артикулу или ИНН. Платформа добавляет в индекс и ссылку, чтобы он был уникальным. Уникальность значений индекс не обеспечивает, а полнотекстовый поиск настраивается отдельно.
- Где выполняется запрос 1С в клиент-серверной базе?A)Переводится в SQL для СУБДB)В памяти сервера 1С целикомC)В отдельном сервисе запросов 1СD)На клиенте, после загрузки таблиц в память
показать ответ и разбор
+A)Переводится в SQL для СУБД// разбор: Сервер 1С транслирует запрос на языке запросов в один или несколько SQL-запросов для MS SQL или PostgreSQL. СУБД выполняет их и возвращает данные. Поэтому производительность упирается в план СУБД, индексы и статистику, а не только в текст запроса 1С.
- Какие поля даёт таблица
Оборотырегистра остатков для ресурса Количество?A)КоличествоНачальныйОстаток и КоличествоКонечныйОстатокB)Только КоличествоОборотC)КоличествоОстатокD)КоличествоПриход, КоличествоРасход, КоличествоОборотпоказать ответ и разбор
+D)КоличествоПриход, КоличествоРасход, КоличествоОборот// разбор: У регистра остатков таблица Обороты раскладывает движения на приход, расход и оборот (приход минус расход) за период. У оборотного регистра есть только Оборот, так как видов движения нет. Начальный и конечный остатки даёт ОстаткиИОбороты.
- Чем отбор
Остатки(, Товар = &Товар)отличается отОстатки() ... ГДЕ Товар = &Товардля регистра накопления?A)Результат тот же, но расчёт ужеB)Результат разный: ГДЕ отбирает ещё до расчёта остатковC)Параметр работает только у регистров сведенийD)В ГДЕ быстреепоказать ответ и разбор
+A)Результат тот же, но расчёт уже// разбор: По ИТС оба запроса вернут одно и то же, но с отбором в ГДЕ система сначала посчитает остатки по всем товарам и только потом отбросит лишние. Условие в параметре виртуальной таблицы уходит внутрь её расчёта, и остаток считается только по нужному товару. Поэтому условия на измерения передают в параметры.
- Что вернёт
СрезПервых(&Дата)периодического регистра сведений?A)Записи только за день &ДатаB)Самую первую запись регистра целикомC)Ближайшую запись с даты по ключуD)Записи до &Дата, как срез последнихпоказать ответ и разбор
+C)Ближайшую запись с даты по ключу// разбор: Срез первых — зеркало среза последних: для каждого сочетания измерений берётся запись с наименьшим периодом, не меньшим даты. Применяют для «следующего значения»: ближайшая плановая цена, следующий график. Без даты — самая ранняя запись по каждому ключу.
- Чем плох
ВЫБРАТЬ *в запросе к документу?A)Читаются все поля, включая ненужныеB)Звёздочка отключает использование индексов по датеC)Звёздочка обходит ограничения доступа к полямD)Звёздочка запрещена синтаксисом языка запросовпоказать ответ и разбор
+A)Читаются все поля, включая ненужные// разбор: Звёздочка выбирает все поля таблицы, и СУБД читает и передаёт лишние данные, включая длинные строки и хранилища значений. Код потом всё равно использует два-три поля. Стандарты требуют явно перечислять нужные поля. Синтаксически звёздочка допустима.
- Какую цену платят за лишний индекс на реквизите?A)Запросы к другим полям становятся медленнееB)Реквизит нельзя изменитьC)Каждая запись объекта обновляет и индексD)Справочник перестаёт поддерживать иерархию
показать ответ и разбор
+C)Каждая запись объекта обновляет и индекс// разбор: Индекс ускоряет чтение, но любая запись объекта обновляет и его. На часто записываемых таблицах лишние индексы заметно замедляют запись и раздувают базу. Индексируют то, по чему реально отбирают и сортируют.
- Как называется таблица справочника в базе MS SQL?A)
Справочник_ТоварыB)Catalog_ТоварыC)dbo.ТоварыD)_Referenceс числовым суффиксомпоказать ответ и разбор
+D)`_Reference` с числовым суффиксом// разбор: Платформа хранит объекты в таблицах со служебными именами: справочники — _Reference123, документы — _Document45, движения регистров накопления — _AccumRg67, их итоги — _AccumRgT68. Поля — _Fld89. Соответствие имён возвращает ПолучитьСтруктуруХраненияБазыДанных().
это 9 из 72
Ещё 63 вопросов по теме — в тренажёре, с движком повторения
Прочитать разбор и ответить самому — разные навыки. В Сеньорчике вопросы приходят сессиями, а подтему, на которой ты споткнулся, движок принесёт снова: завтра, через три дня, через неделю. Бесплатно: сессия дня каждый день.
Частые вопросы
Условие на склад ставить в параметр Остатки или в ГДЕ?
В параметр: там условие работает внутри расчёта, и остатки считаются только по нужному складу. В ГДЕ таблица сначала посчитает остатки по всему регистру и только потом отбросит лишнее. Результат одинаковый, разница в скорости.
Чем отличается условие в параметре среза последних от условия в ГДЕ?
В параметре срез ищет последнюю запись среди подходящих. В ГДЕ он сначала берёт последнюю запись вообще и потом отбрасывает её, если она не подходит, поэтому ключ может пропасть из результата целиком.
Как получить цену на дату каждой строки продаж?
Срезом нельзя, у него одна дата на запрос. Для каждой продажи находят максимальный период цены не позже даты продажи, затем соединяют с ценами по этому периоду.