Как в отчете СКД изменить знак отрицательных остатков в строках, сохранив правильный расчет общих итогов?

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

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

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

Выясним причину проблемы агрегации в СКД

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


ВЫБОР
    КОГДА ХозрасчетныйОстатки.СуммаОстаток < 0 ТОГДА -ХозрасчетныйОстатки.СуммаОстаток
    ИНАЧЕ ХозрасчетныйОстатки.СуммаОстаток 
КОНЕЦ КАК СуммаОстаток

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

Попытка решить вопрос стандартным форматированием или условным оформлением также не всегда дает нужный результат. Параметр формата ЧО= позволяет лишь скрыть минус или вывести специальный текст, но не изменяет внутреннее представление числа для формул. Вычисляемые поля также не спасают положение, так как они отрабатывают до расчета ресурсов. Разберем рабочие варианты настройки схемы компоновки.

Способ 1. Раздельный расчет ресурса по уровням группировок

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

Разберем по шагам, как настроить такой расчет:

  1. В тексте запроса оставляем исходное поле остатка без взятия модуля, то есть передаем чистое значение ХозрасчетныйОстатки.СуммаОстаток КАК СуммаОстаток.
  2. Переходим на вкладку «Ресурсы» схемы компоновки данных.
  3. Добавляем поле СуммаОстаток для детального уровня (например, для группировки Договор). В колонке «Выражение» прописываем вычисление модуля: Сумма(ВЫБОР КОГДА СуммаОстаток < 0 ТОГДА -СуммаОстаток ИНАЧЕ СуммаОстаток КОНЕЦ) В колонке «Рассчитывать по...» указываем группировку Договор.
  4. Добавляем вторую строку с ресурсом СуммаОстаток. В поле «Выражение» указываем стандартную агрегатную функцию: Сумма(СуммаОстаток) В колонке «Рассчитывать по...» выбираем более высокие группировки (например, Арендодатель, Счет) и обязательно указываем ОбщийИтог.

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

Способ 2. Использование функции «ВычислитьВыражениеСГруппировкойМассив»

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

Посмотрим на пример выражения ресурса:


Сумма(ВычислитьВыражениеСГруппировкойМассив("Сумма(ВЫБОР КОГДА СуммаОстаток < 0 ТОГДА -СуммаОстаток ИНАЧЕ СуммаОстаток КОНЕЦ)", "Договор"))

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

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

Если отчет строится по actively-passive счетам расчетов (например, расчеты по аренде, взаиморасчеты с контрагентами), классической практикой является использование возможностей самой виртуальной таблицы Остатки.

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


ВЫБРАТЬ РАЗРЕШЕННЫЕ
    ХозрасчетныйОстатки.Счет КАК Счет,
    ХозрасчетныйОстатки.Субконто1 КАК Арендодатель,
    ХозрасчетныйОстатки.Субконто2 КАК Договор,
    ХозрасчетныйОстатки.СуммаОстатокДт КАК ДолгКонтрагента,
    ХозрасчетныйОстатки.СуммаОстатокКт КАК НашДолг
ИЗ
    РегистрБухгалтерии.Хозрасчетный.Остатки(&Период, Счет В ИЕРАРХИИ (&Счет), , ) КАК ХозрасчетныйОстатки

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

← На главную