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