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