Почему в отчете СКД по регистру бухгалтерии пропадают номенклатура и пустые характеристики и как это исправить?

Программист 1С v8.3 (Обычные формы) 1C:Бухгалтерия Бухгалтерский учет IT и автоматизация бизнеса
← На главную

При разработке отчетов в системе компоновки данных (СКД) по виртуальным таблицам регистра бухгалтерии разработчики часто сталкиваются с ситуацией, когда при добавлении в группировку дополнительных реквизитов (характеристик) из отчета исчезают строки с незаполненными свойствами. Рассмотрим подробнее, почему происходит подобное поведение и какие способы решения существуют.

Анализ проблемы и причин ее возникновения

Проанализируем типовую ситуацию. В запросе к виртуальной таблице РегистрБухгалтерии.Хозрасчетный.ОборотыДтКт выбираются данные по счету продаж (например, Дт 62 — Кт 90.01). Субконто с кредита приводится к типу справочника Номенклатура с помощью функции ВЫРАЗИТЬ, а в секции {ХАРАКТЕРИСТИКИ} прописывается получение дополнительных свойств объектов из плана видов характеристик.

При попытке сгруппировать данные по дополнительному свойству номенклатуры, а затем по самой номенклатуре, из итогового отчета выпадают позиции, у которых данное свойство не заполнено. Группировка с пустым значением характеристики также не выводится.

Выясним главные причины такого поведения СКД:

  1. Флаг «Игнорировать NULL» в настройках СКД. В компоновке данных по умолчанию или в ручных настройках полей может стоять признак игнорирования неопределенных значений. В результате этого записи, где дополнительное свойство возвращает NULL, полностью исключаются из итоговой выборки.
  2. Составной тип данных у субконто. Поля субконто в регистре бухгалтерии имеют составной тип. Даже при использовании конструкции ВЫРАЗИТЬ платформа на этапе построения схемы может обрабатывать поле как составное. При отсутствии субконто или значении NULL левое соединение с регистром сведений характеристик работает некорректно.
  3. Особенности автоматического формирования SQL-запроса в СКД. При добавлении группировки по динамическому полю характеристики СКД может трансформировать внутреннее соединение, из-за чего строки с незаполненными свойствами теряются.

Способ 1. Отключение флага «Игнорировать NULL» и обработка NULL в запросе

Разберем самое простое решение, если проблема заключается в настройках самой схемы компоновки данных. Проверим настройки ресурсов и группировок в СКД. Если для полей или ресурсов установлен параметр игнорирования значений NULL, его необходимо снять.

Кроме того, в самом тексте запроса рекомендуется защитить приведение типов с помощью функции ЕСТЬNULL, чтобы вместо значения NULL возвращалась пустая ссылка справочника. Посмотрим на пример оформления поля в запросе:


ЕСТЬNULL(ВЫРАЗИТЬ(Продажи_Выручка.СубконтоКт2 КАК Справочник.Номенклатура), ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)) КАК Номенклатура

Применение функции ЕСТЬNULL гарантирует, что поле всегда будет содержать корректный ссылочный тип СправочникСсылка.Номенклатура, что позволит СКД правильно выполнить соединения с таблицей характеристик.

Способ 2. Указание точного типа поля на вкладке «Наборы данных»

Разберем еще один важный шаг при работе с характеристиками для составных полей. Перейдем на вкладку Наборы данных в конструкторе СКД и найдем поле номенклатуры.

По умолчанию СКД может определить тип этого поля как составной. В колонке Тип необходимо вручную снять все лишние флаги и оставить только один конкретный тип — СправочникСсылка.Номенклатура. Это позволит механизму ХАРАКТЕРИСТИКИ однозначно определить, к какому справочнику относятся расширенные реквизиты.

Способ 3. Разделение запроса на два набора данных (Связи наборов данных)

Рассмотрим наиболее надежный архитектурный подход, который полностью исключает технические ограничения при работе с характеристиками составных полей регистра бухгалтерии.

Вместо использования блока ХАРАКТЕРИСТИКИ непосредственно в запросе к регистру бухгалтерии разделим схему на два отдельных набора данных:

  1. Набор данных 1 (Запрос к регистру бухгалтерии): Выбирает обороты, счет, контрагентов и номенклатуру из субконто. В этом запросе нет секции характеристик.
  2. Набор данных 2 (Запрос к справочнику Номенклатура): Выбирает ссылку на номенклатуру. Именно здесь прописывается секция ХАРАКТЕРИСТИКИ.

Посмотрим на пример оформления секции характеристик во втором наборе данных:


ВЫБРАТЬ
    Номенклатура.Ссылка КАК Номенклатура
ИЗ
    Справочник.Номенклатура КАК Номенклатура
{ХАРАКТЕРИСТИКИ
    ТИП(Справочник.Номенклатура)
    ВИДЫХАРАКТЕРИСТИК (ВЫБРАТЬ
            СвойстваОбъектов.Ссылка,
            СвойстваОбъектов.Наименование + " (доп. реквизит)" КАК Наименование,
            СвойстваОбъектов.ТипЗначения
        ИЗ
            ПланВидовХарактеристик.СвойстваОбъектов КАК СвойстваОбъектов
        ГДЕ
            СвойстваОбъектов.НазначениеСвойства = ЗНАЧЕНИЕ(ПланВидовХарактеристик.НазначенияСвойствКатегорийОбъектов.Справочник_Номенклатура))
    ПОЛЕКЛЮЧА Ссылка
    ПОЛЕИМЕНИ Наименование
    ПОЛЕТИПАЗНАЧЕНИЯ ТипЗначения
    ЗНАЧЕНИЯХАРАКТЕРИСТИК РегистрСведений.ЗначенияСвойствОбъектов
    ПОЛЕОБЪЕКТА Объект
    ПОЛЕВИДА Свойство
    ПОЛЕЗНАЧЕНИЯ Значение }

После создания обоих наборов данных перейдем на вкладку Связи наборов данных и свяжем НаборДанных1 с НаборДанных2 по полю Номенклатура (Источник связи — НаборДанных1, Приемник связи — НаборДанных2, Условие связи — Номенклатура).

При такой архитектуре СКД выполнит соединение характеристик с физической таблицей справочника, а не с виртуальной таблицей регистра, благодаря чему пустые характеристики и вся номенклатура будут выводиться корректно без утери данных.

← На главную