При разработке отчетов на базе системы компоновки данных (СКД) в конфигурациях 1С часто можно встретить конструкции вида {(Счет).* КАК Счет} внутри параметров виртуальных таблиц регистров бухгалтерии. Разберем, что означает данный синтаксис, где он настраивается в конструкторе запроса и как правильно управлять отборами программно.
Фигурные скобки {} в языке запросов СКД используются для так называемого расширения языка запросов. Они описывают необязательные (потенциальные) условия и поля, которые будут включены в итоговый SQL-запрос только тогда, когда пользователь или программист задействует соответствующий отбор или параметр.
Запись {(Счет).* КАК Счет} в параметрах виртуальной таблицы (например, РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты) — это отбор, а не параметр виртуальной таблицы. Она сообщает платформе следующее:
Счет (а также любые его реквизиты благодаря записи .*, например, Счет.Код или Счет.Родитель) доступно для отбора.Счет задан в настройках компоновщика, платформа передаст его непосредственно в параметр виртуальной таблицы базы данных. Это существенно ускоряет выборку, так как лишние записи отсекаются еще на этапе формирования виртуальной таблицы, а не после расчета итогов.Посмотрим, где именно в режиме разработчика располагается эта настройка. Зайти в редактирование этого условия можно через конструктор запроса:
Рассмотрим ситуацию, когда необходимо программно установить условие на счет, например, исключить определенный список счетов из расчета задолженности. Для этого обратимся к компоновщику настроек отчета.
Пример программного добавления отбора через типовые функции:
// Получаем список счетов, которые нужно исключить из расчета
СписокИсключаемыхСчетов = СтандартныеОтчеты.ПолучитьСписокСчетовИсключаемыхИзРасчетаЗадолженности(1);
// Добавляем отбор в компоновщик настроек отчета
ТиповыеОтчеты.ДобавитьОтбор(
КомпоновщикНастроек,
"Счет",
СписокИсключаемыхСчетов,
ВидСравненияКомпоновкиДанных.НеВСпискеПоИерархии
);
Если требуется добавить отбор напрямую через объект КомпоновщикНастроек без использования типовых модулей, выполним следующий код:
ЭлементОтбора = КомпоновщикНастроек.Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Счет");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.НеВСпискеПоИерархии;
ЭлементОтбора.ПравоеЗначение = СписокИсключаемыхСчетов;
ЭлементОтбора.Использование = Истина;
Проанализируем частые ошибки, из-за которых программный отбор по счету может не отрабатывать:
КомпоновщикНастроек.Настройки.Отбор может перекрываться значениями из КомпоновщикНастроек.ПользовательскиеНастройки. В этом случае необходимо менять значение прямо в массиве пользовательских настроек по соответствующему идентификатору.НеВСпискеПоИерархии или ВСпискеПоИерархии в ПравоеЗначение обязательно должен передаваться массив или СписокЗначений с ссылками на объекты ПланСчетовСсылка.Хозрасчетный. Если передать строки или значения неверного типа, условие проигнорируется или вычислится некорректно.ГДЕ запроса СКД можно дописать выражение {ГДЕ Счет.* КАК Счет}. Платформа 1С самостоятельно оптимизирует исполнение и выберет наилучший вариант фильтрации данных.