Как в СКД вывести сумму долга на последнюю дату документа в итогах группировки

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

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

Метод 1. Использование функции ВычислитьВыражение в ресурсах

Хотя в названии темы упоминается функция ВычислитьВыражениеСГруппировкойМассив, для получения значения конкретной записи в группе чаще всего удобнее использовать более простую функцию ВычислитьВыражение. Эта функция позволяет указать контекст записей, из которых будет браться значение.

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

ВычислитьВыражение("Сумма(СуммаДолга)", , , "Последняя", "Последняя")

Разберем параметры этой функции подробнее:

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

Таким образом, СКД возьмет значение только из последней строки текущей группы, что и даст нам сумму долга на максимальную дату документа в этой группе.

Метод 2. Настройка ролей полей (Метод остатков)

Этот метод является наиболее правильным с точки зрения архитектуры 1С, особенно если данные выбираются из регистров накопления или бухгалтерии. Система компоновки данных умеет самостоятельно определять правила агрегации для полей типа "Остаток".

Выполним настройку по шагам:

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

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

Метод 3. Агрегатная функция Максимум со структурами

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

В поле выражения ресурса напишем:

Максимум(Структура(ДатаДокумента, СуммаДолга)).СуммаДолга

Выясним причину, почему это работает: При вычислении итога СКД для каждой строки создает объект Структура. Функция Максимум сравнивает эти структуры. Сравнение структур происходит по их свойствам в алфавитном порядке или в порядке добавления. В данном случае система найдет структуру с наибольшим значением ДатаДокумента и после этого извлечет из найденной "максимальной" структуры связанное с ней значение СуммаДолга.

Метод 4. Работа с виртуальными таблицами в запросе

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

При использовании таблицы РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты крайне важно правильно настроить Периодичность. Установите значение АВТО или Запись. Это позволит получать остатки на каждый момент времени (документ).

Чтобы итоги по периодам не "разваливались" при соединении нескольких таблиц, следуйте правилам:

  1. Старайтесь выполнять соединения наборов данных средствами самой СКД на закладке "Связи наборов данных", а не внутри одного SQL-запроса.
  2. При связи по полю Регистратор (если нужно выводить детальные записи документов) снимите флаг "Обязательная связь". Это предотвратит потерю итоговых записей остатков в случаях, когда по конкретному периоду нет движений в одной из соединяемых таблиц.

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

← На главную