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