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