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