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