Как в отчете на СКД вывести номенклатуру, единицу измерения и среднюю цену в одну строку без детализации по документам?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

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

Выясним причину дублирования строк и лишней иерархии

Когда отчет выводит детализацию по каждому документу или дробит данные на несколько уровней, причина обычно кроется в двух моментах: некорректная структура группировок на вкладке «Настройки» и обращение к документам в тексте запроса вместо регистров накопления.

Если в структуре отчета создается отдельная группировка по полю Номенклатура, а внутри нее — группировка по полю ЕдиницаИзмерения, СКД строит вложенное дерево. Если же в структуру случайно попадает ветка «Детальные записи» или поля регистратора, отчет принудительно раскрывает каждую строку движения документа. Чтобы получить ровную таблицу вида «Товар — Единица измерения — Количество — Сумма — Средняя цена», необходимо объединить реквизиты в одной группировке и исключить детальные записи.

Пошаговая настройка структуры СКД для вывода в одну строку

Рассмотрим порядок действий на вкладке «Настройки» схемы компоновки данных:

  1. Настройка состава группировки: В окне структуры отчета удалим все вложенные ветки и детальные записи. Оставим единственную группировку. Дважды кликнем по полю группировки и добавим в список полей сразу два реквизита: Номенклатура и Номенклатура.ЕдиницаИзмерения (или отдельное поле единицы, если оно выбрано в запросе).
  2. Отключение иерархии номенклатуры: Если номенклатура выводится в виде папок и элементов, в окне редактирования группировки изменим тип группировки с «Иерархия» на «Без иерархии» (или «Элементы»). Это позволит свернуть отчет в сплошной плоский список.
  3. Настройка выбранных полей: На вкладке «Выбранные поля» для этой группировки укажем порядок вывода колонок: Номенклатура, Номенклатура.ЕдиницаИзмерения, ресурсы Количество, Сумма и расчетное поле Цена.
  4. Разделение колонок: Перейдем на вкладку «Другие настройки» (в корне отчета или конкретной группировки) и найдем параметр «Расположение полей группировок». Установим для него значение «Отдельно». Это гарантирует, что товар и единица измерения будут отображаться в соседних независимых колонках таблицы, а не склеиваться в одну ячейку.

Корректный расчет средней цены в ресурсах

Проанализируем расчет средней цены. Выражение вида Сумма(Сумма)/Сумма(Количество) является математически верным для средневзвешенной цены, однако при практической работе оно может вызывать ошибку деления на ноль. Это происходит при наличии сторнировочных записей, суммовых корректировок или строк с нулевым объемом.

Перейдем на вкладку «Ресурсы» и для поля Цена укажем безопасное выражение:


ВЫБОР 
    КОГДА ЕстьNull(Сумма(Количество), 0) = 0 ТОГДА 0 
    ИНАЧЕ Сумма(Сумма) / Сумма(Количество) 
КОНЕЦ

Такая конструкция защитит формирование отчета от аварийных завершений и корректно рассчитает показатели как по строкам номенклатуры, так и в строке общих итогов.

Оптимизация источника данных: отказ от прямых запросов к документам

Обращение напрямую к табличным частям документов (например, Документ.ПоступлениеТоваровУслуг.Товары) в реальных базах приводит к серьезным архитектурным проблемам:

  1. Неучет движений: Запрос к табличной части не учитывает, проведен ли документ (если не наложено жесткое условие), а также полностью игнорирует корректировки поступлений, возвраты поставщикам и дополнительные расходы.
  2. Избыточные соединения: Конструкция ПоступлениеТоваровУслуг ЛЕВОЕ СОЕДИНЕНИЕ ПоступлениеТоваровУслуг.Товары ПО Ссылка = Ссылка создает двойную нагрузку на СУБД, так как табличная часть уже содержит ссылку на документ-владелец. Обращение через точку к полям шапки (ПоступлениеТоваровУслугТовары.Ссылка.Контрагент) генерирует скрытые неявные соединения в SQL.

В конфигурациях на базе ERP и УТ 11 для анализа закупок предназначен оборотный регистр накопления Закупки. В нем содержатся все результирующие стоимостные и количественные показатели с учетом возвратов и корректировок. Поскольку аналитика учета номенклатуры в УТ 11 вынесена в отдельный справочник, правильный запрос к виртуальной таблице оборотов строится следующим образом:


ВЫБРАТЬ
    ЗакупкиОбороты.АналитикаУчетаНоменклатуры.Номенклатура КАК Номенклатура,
    ЗакупкиОбороты.АналитикаУчетаНоменклатуры.Номенклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
    ЗакупкиОбороты.КоличествоОборот КАК Количество,
    ЗакупкиОбороты.СтоимостьОборот КАК Сумма
ИЗ
    РегистрНакопления.Закупки.Обороты(&НачалоПериода, &КонецПериода, Авто, , ) КАК ЗакупкиОбороты

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

← На главную