При разработке в среде 1С:Предприятие 8.3 программисты часто сталкиваются с конструкциями в запросах, которые заключены в фигурные скобки {}. Особенно часто это встречается в типовых конфигурациях, таких как Управление торговлей 11, ERP или Комплексная автоматизация, при формировании динамических списков в журналах документов. Рассмотрим подробно, что означает этот синтаксис, как он влияет на производительность и как правильно интерпретировать сложные условия по датам.
Первое, что необходимо понять: текст запроса динамического списка — это не просто прямой запрос к СУБД, а инструкция для Системы компоновки данных. Фигурные скобки {} являются специальными маркерами, которые говорят платформе: «Этот блок кода является необязательным». Рассмотрим основные принципы работы этих инструкций:
{ГДЕ ...}, не будет добавлено в итоговый SQL-запрос, если пользователь не установил соответствующий отбор в интерфейсе (через команду «Настроить список»).{ГДЕ} позволяет платформе строить более эффективные планы запросов, так как она заранее «знает», по каким полям разрешена фильтрация, и может оптимизировать обращения к индексам.В современных типовых решениях (УТ 11, ERP) журналы документов (например, Журнал документов продаж) строятся не по таблицам конкретных документов, а по специальному регистру сведений РегистрСведений.РеестрДокументов. Проанализируем, почему это важно в контексте нашего запроса.
Вместо того чтобы делать тяжелое объединение (ОБЪЕДИНИТЬ ВСЕ) из множества таблиц (Реализации, Возвраты, Акты), динамический список обращается к одной плоской таблице регистра. В запросе мы видим псевдоним РеестрДокументовПереопределяемый. Это стандартный механизм, позволяющий системе быстро выводить список разнородных документов с общим набором реквизитов (дата, номер, сумма, контрагент).
В тексте запроса часто встречается конструкция вида РеестрДокументовПереопределяемый.МестоХранения.* КАК Склад. Разберем, что дает символ .*:
Использование звездочки после точки в секции {ГДЕ} разрешает пользователю делать отбор не только по самому значению поля (например, по конкретной ссылке на Склад), но и по всем реквизитам этого объекта. Это означает, что в режиме «1С:Предприятие» пользователь сможет выбрать в настройках отбора поле «Склад.Ответственный» или «Склад.Тип склада», даже если эти поля явно не выбраны в основной секции ВЫБРАТЬ. Платформа сама организует необходимые соединения с таблицами справочников.
Наибольшее количество вопросов обычно вызывает блок условий по датам в конце секции {ГДЕ}. Рассмотрим типичный пример такого кода:
{ГДЕ
((РеестрДокументовПереопределяемый.ДатаДокументаИБ >= &НачалоПериода
ИЛИ &НачалоПериода = ДАТАВРЕМЯ(1, 1, 1))
И (РеестрДокументовПереопределяемый.ДатаДокументаИБ <= &КонецПериода
ИЛИ &КонецПериода = ДАТАВРЕМЯ(1, 1, 1)))}
Проанализируем эту ситуацию по шагам. Эта конструкция решает проблему «пустых параметров» и стандартного периода формы:
&НачалоПериода = ДАТАВРЕМЯ(1, 1, 1) проверяет, задан ли параметр начала периода. Если параметр не заполнен (равен пустой дате), то все выражение в скобках становится истинным, и фильтрация по дате «снизу» не применяется.&НачалоПериода и &КонецПериода часто связаны со стандартным периодом формы. Если разработчик или пользователь отключает период, параметры обнуляются, и благодаря проверке на ДАТАВРЕМЯ(1, 1, 1) запрос продолжает возвращать все данные, а не пустой список.В динамических списках часто встречаются соединения с регистрами состояний, например СостоянияЭД (Электронный документооборот) или проверка контрагентов. Посмотрим на пример соединения из запроса:
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДокументыСОшибкамиПроверкиКонтрагентов КАК ДокументыСОшибкамиПроверкиКонтрагентовПереопределяемый
ПО РеестрДокументовПереопределяемый.Ссылка = ДокументыСОшибкамиПроверкиКонтрагентовПереопределяемый.Документ
И (&ИспользованиеПроверкиВозможно)
Здесь параметр &ИспользованиеПроверкиВозможно выступает в роли «выключателя». Если в настройках программы сервис проверки контрагентов отключен, параметр будет равен ЛОЖЬ, и соединение не вернет ни одной строки (результат всегда будет NULL), что экономит ресурсы сервера при формировании списка. Это эффективнее, чем программно менять текст запроса.
При работе с такими запросами рекомендуем придерживаться следующих правил:
ВЫБРАТЬ, обязательно добавьте его и в секцию {ГДЕ} под тем же псевдонимом. Это гарантирует, что при наложении отбора пользователем 1С сформирует оптимальный SQL-код.КАК, чтобы пользователь видел в списке доступных полей «человеческие» названия (например, Ответственный КАК Менеджер).ТИПЗНАЧЕНИЯ(РеестрДокументовПереопределяемый.Ссылка) в списке выбора позволяет системе корректно отображать иконки типов документов в динамическом списке.Таким образом, «странный» на первый взгляд запрос является результатом глубокой оптимизации платформы 1С. Использование реестров документов в сочетании с гибкими инструкциями СКД позволяет быстро отображать тысячи документов, предоставляя пользователю мощные инструменты фильтрации без потери производительности системы.