Как настроить итоги в отчетах СКД: скрытие ресурсов в группировках, расчет разницы и выборочный вывод

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

При разработке отчетов на Системе компоновки данных (СКД) программисты часто сталкиваются с нестандартным поведением ресурсов при расчете итогов. Типичный пример — отчет по взаиморасчетам, в котором выводятся документы отгрузки (накладные) и подчиненные им платежные документы. В таких отчетах стандартное суммирование приводит к трём классическим проблемам: дублированию сумм накладных во всех строках оплат, неверному расчету итогового долга и выводу ненужных нулевых итогов по служебным колонкам. В этой статье мы подробно разберем, как решить каждую из этих задач с помощью стандартных механизмов СКД.

Проблема 1: Скрытие суммы ресурса на подчиненных уровнях (в строках оплат)

Выясним причину проблемы. Когда мы выводим поле СуммаОтгрузкиПоНакладной в отчет, где группировка по накладной содержит подчиненные детальные записи (например, платежные поручения), СКД по умолчанию дублирует значение суммы накладной в каждой строке платежа. Попытка наложить условие внутри запроса через конструкцию ВЫБОР КОГДА обычно не приносит успеха, так как при расчете ресурса СКД все равно агрегирует эти значения.

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

Способ А. Применение условного оформления (наиболее гибкий визуальный метод)

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

  1. Откройте схему компоновки данных и перейдите на вкладку Настройки.
  2. Выберите вкладку Условное оформление в нижней части экрана.
  3. Добавьте новый элемент оформления. В открывшемся окне в поле Оформление найдите параметр Текст и установите для него значение в виде одного пробела (или оставьте строку абсолютно пустой).
  4. Перейдите на вкладку Условие. Нам нужно задать условие, определяющее, для каких именно строк мы прячем сумму. Если накладная находится на первом уровне группировки, а оплаты — на детальных записях, добавьте условие: СистемныеПоля.УровеньВГруппировке Не Равно 1. Другой вариант — проверить тип регистратора: Регистратор Не Ссылка Документ.РасходнаяНакладная.
  5. На вкладке Оформляемые поля выберите поле ресурса — СуммаОтгрузкиПоНакладной.

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

Способ Б. Локальное отключение выбранных полей в подчиненной группировке

Если структура вашего отчета жестко зафиксирована в виде дерева группировок, вы можете физически исключить вывод поля из детальной группировки:

  1. В структуре настроек отчета выберите подчиненную группировку (например, «Детальные записи» или группировку по платежному документу).
  2. Перейдите на ее локальную вкладку Выбранные поля (настройки конкретной группировки, а не отчета в целом).
  3. Снимите флажок Использовать свойства родителя (или снимите флаг Авто).
  4. Перенесите в список только те поля, которые должны отображаться для оплаты (например, дата, номер платежки, сумма оплаты). Ресурс СуммаОтгрузкиПоНакладной добавлять туда не нужно.

Способ В. Ограничение расчета ресурса по группировкам

Мы можем явно указать системе, на каких уровнях иерархии СКД имеет право рассчитывать этот ресурс:

  1. Перейдите на вкладку Ресурсы.
  2. Найдите строку с полем СуммаОтгрузкиПоНакладной.
  3. В колонке Рассчитывать по... нажмите кнопку выбора. По умолчанию там пусто (расчет идет по всем группировкам).
  4. Установите флажки только напротив вашей основной группировки (например, ДокументОтгрузки) и поля Общий итог. На детальные записи расчет распространяться не будет.

---

Проблема 2: Исключение дублирования сумм при связи «один ко многим» и расчет итогового долга

Проанализируем ситуацию: если к одной накладной привязаны три платежных поручения, левое соединение таблиц в запросе вернет три строки. В каждой строке будет фигурировать одна и та же сумма накладной. Стандартное выражение ресурса Сумма(СуммаОтгрузки) сложит эти строки, и итоговая сумма накладной завысится ровно в три раза.

Рассмотрим два профессиональных пути решения этой архитектурной проблемы.

Метод 1. Связи наборов данных (Best Practice в СКД)

Вместо создания одного перегруженного запроса с левым соединением на уровне базы данных, мы разделим данные на два независимых набора:

  1. Создайте НаборДанных1 (Накладные) с простым запросом, который выбирает только накладные и их уникальные суммы.
  2. Создайте НаборДанных2 (Оплаты), выбирающий документы оплаты и их суммы.
  3. Перейдите на вкладку Связи наборов данных.
  4. Свяжите НаборДанных1 (источник) с НаборДанных2 (приемник) по полю связи (например, Договор или ДокументОтгрузки).

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

ЕСТЬNULL(СуммаНакладной, 0) - ЕСТЬNULL(СуммаОплаты, 0) Метод 2. Использование функции ВычислитьВыражениеСГруппировкойМассив

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

Для этого на вкладке Ресурсы для поля СуммаОтгрузкиПоНакладной пропишем следующее выражение:


Сумма(ВычислитьВыражениеСГруппировкойМассив("Максимум(СуммаОтгрузкиПоНакладной)", "ДокументОтгрузки"))

Разберем детально, как работает эта конструкция:

---

Проблема 3: Выборочное отключение итогов для определенных колонок

Иногда требования к оформлению отчета предписывают оставлять ячейку в строке «Общие итоги» пустой для конкретных ресурсов (например, для сумм документов отгрузки, если они выводятся справочно). В СКД это поведение настраивается через дублирование ресурсов на уровне схемы.

Разберем этот алгоритм настройки:

  1. Перейдите на вкладку Ресурсы.
  2. Добавьте ваше поле ресурса (например, СуммаДляСкрытияИтогов) в список ресурсов **дважды** (создайте две строки с одним и тем же именем поля).
  3. Для первой строки укажите:
    • Выражение: Сумма(СуммаДляСкрытияИтогов)
    • В колонке Рассчитывать по... выберите все ваши рабочие группировки (например, Контрагент, Договор, Регистратор), но обязательно **снимите** флажок с поля Общий итог.
  4. Для второй строки укажите:
    • Выражение: найдите эту ячейку и впишите туда NULL, 0 или пустую строку в кавычках "".
    • В колонке Рассчитывать по... установите флажок **только** для поля Общий итог.

В результате СКД применит правила приоритета расчета: для всех стандартных группировок будет произведено обычное суммирование данных, а при формировании финальной нижней строки «Итого» система обратится ко второму правилу и выведет пустое значение.

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

← На главную