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