Как работает секция ГДЕ в фигурных скобках в динамических списках 1С

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей IT и автоматизация бизнеса
← На главную

При разработке в среде 1С:Предприятие 8.3 программисты часто сталкиваются с конструкциями в запросах, которые заключены в фигурные скобки {}. Особенно часто это встречается в типовых конфигурациях, таких как Управление торговлей 11, ERP или Комплексная автоматизация, при формировании динамических списков в журналах документов. Рассмотрим подробно, что означает этот синтаксис, как он влияет на производительность и как правильно интерпретировать сложные условия по датам.

Понятие инструкций Системы компоновки данных (СКД)

Первое, что необходимо понять: текст запроса динамического списка — это не просто прямой запрос к СУБД, а инструкция для Системы компоновки данных. Фигурные скобки {} являются специальными маркерами, которые говорят платформе: «Этот блок кода является необязательным». Рассмотрим основные принципы работы этих инструкций:

  1. Необязательность выполнения: Все, что находится внутри фигурных скобок в секции {ГДЕ ...}, не будет добавлено в итоговый SQL-запрос, если пользователь не установил соответствующий отбор в интерфейсе (через команду «Настроить список»).
  2. Динамическое управление: Если пользователь накладывает фильтр на поле, указанное в фигурных скобках, платформа автоматически «разворачивает» это условие и включает его в текст запроса, отправляемого на сервер базы данных.
  3. Оптимизация: Явное описание полей в секции {ГДЕ} позволяет платформе строить более эффективные планы запросов, так как она заранее «знает», по каким полям разрешена фильтрация, и может оптимизировать обращения к индексам.

Разбор структуры реестра документов

В современных типовых решениях (УТ 11, ERP) журналы документов (например, Журнал документов продаж) строятся не по таблицам конкретных документов, а по специальному регистру сведений РегистрСведений.РеестрДокументов. Проанализируем, почему это важно в контексте нашего запроса.

Вместо того чтобы делать тяжелое объединение (ОБЪЕДИНИТЬ ВСЕ) из множества таблиц (Реализации, Возвраты, Акты), динамический список обращается к одной плоской таблице регистра. В запросе мы видим псевдоним РеестрДокументовПереопределяемый. Это стандартный механизм, позволяющий системе быстро выводить список разнородных документов с общим набором реквизитов (дата, номер, сумма, контрагент).

Синтаксис со звездочкой и расширенные отборы

В тексте запроса часто встречается конструкция вида РеестрДокументовПереопределяемый.МестоХранения.* КАК Склад. Разберем, что дает символ .*:

Использование звездочки после точки в секции {ГДЕ} разрешает пользователю делать отбор не только по самому значению поля (например, по конкретной ссылке на Склад), но и по всем реквизитам этого объекта. Это означает, что в режиме «1С:Предприятие» пользователь сможет выбрать в настройках отбора поле «Склад.Ответственный» или «Склад.Тип склада», даже если эти поля явно не выбраны в основной секции ВЫБРАТЬ. Платформа сама организует необходимые соединения с таблицами справочников.

Логика работы с периодами и параметрами

Наибольшее количество вопросов обычно вызывает блок условий по датам в конце секции {ГДЕ}. Рассмотрим типичный пример такого кода:


{ГДЕ
    ((РеестрДокументовПереопределяемый.ДатаДокументаИБ >= &НачалоПериода
            ИЛИ &НачалоПериода = ДАТАВРЕМЯ(1, 1, 1))
            И (РеестрДокументовПереопределяемый.ДатаДокументаИБ <= &КонецПериода
                ИЛИ &КонецПериода = ДАТАВРЕМЯ(1, 1, 1)))}

Проанализируем эту ситуацию по шагам. Эта конструкция решает проблему «пустых параметров» и стандартного периода формы:

  1. Обработка пустой даты: Условие &НачалоПериода = ДАТАВРЕМЯ(1, 1, 1) проверяет, задан ли параметр начала периода. Если параметр не заполнен (равен пустой дате), то все выражение в скобках становится истинным, и фильтрация по дате «снизу» не применяется.
  2. Связь с интерфейсом: В динамических списках параметры &НачалоПериода и &КонецПериода часто связаны со стандартным периодом формы. Если разработчик или пользователь отключает период, параметры обнуляются, и благодаря проверке на ДАТАВРЕМЯ(1, 1, 1) запрос продолжает возвращать все данные, а не пустой список.
  3. Приоритет условий: Поскольку все это находится внутри фигурных скобок, данное условие будет проверяться только тогда, когда компоновка данных решит, что фильтр по периоду активен.

Использование левых соединений и флаги использования

В динамических списках часто встречаются соединения с регистрами состояний, например СостоянияЭД (Электронный документооборот) или проверка контрагентов. Посмотрим на пример соединения из запроса:


ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДокументыСОшибкамиПроверкиКонтрагентов КАК ДокументыСОшибкамиПроверкиКонтрагентовПереопределяемый
ПО РеестрДокументовПереопределяемый.Ссылка = ДокументыСОшибкамиПроверкиКонтрагентовПереопределяемый.Документ
    И (&ИспользованиеПроверкиВозможно)

Здесь параметр &ИспользованиеПроверкиВозможно выступает в роли «выключателя». Если в настройках программы сервис проверки контрагентов отключен, параметр будет равен ЛОЖЬ, и соединение не вернет ни одной строки (результат всегда будет NULL), что экономит ресурсы сервера при формировании списка. Это эффективнее, чем программно менять текст запроса.

Практические советы по настройке динамического списка

При работе с такими запросами рекомендуем придерживаться следующих правил:

Таким образом, «странный» на первый взгляд запрос является результатом глубокой оптимизации платформы 1С. Использование реестров документов в сочетании с гибкими инструкциями СКД позволяет быстро отображать тысячи документов, предоставляя пользователю мощные инструменты фильтрации без потери производительности системы.

← На главную