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

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

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

В этой статье мы разберем несколько проверенных методов реализации такой структуры, проанализируем настройки ресурсов, ролей полей и структуры таблицы.

Способ 1. Использование структуры таблицы с группировками колонок

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

Рассмотрим пошагово, как это настроить:

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

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

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

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

Создадим два вычисляемых поля:

Для начального остатка:


ВычислитьВыражение("Сумма(НачальныйОстаток)", , "ОбщаяГруппировка", "Первая", "Первая")

Для конечного остатка:


ВычислитьВыражение("Сумма(КонечныйОстаток)", , "ОбщаяГруппировка", "Последняя", "Последняя")

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

Способ 3. Правильная настройка ролей полей

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

Выясним причину возможных ошибок в итогах:

  1. Для поля НачальныйОстаток в колонке Роль должно быть указано: Остатки, Тип — Начальный. Поле периода должно соответствовать вашему основному периоду.
  2. Для поля КонечныйОстаток: Роль — Остатки, Тип — Конечный.
  3. Если эти роли заданы, СКД автоматически применяет правила «неаддитивности» остатков. Это значит, что при суммировании по периодам система не будет складывать остатки каждого месяца, а возьмет значение на начало первого месяца и конец последнего.

Это позволяет использовать стандартные группировки, но в настройках «Выбранные поля» всего отчета (а не конкретных колонок) выводить остатки в общие итоги, а обороты — в детальные записи.

Способ 4. Метод объединения в запросе (UNION ALL)

Если стандартные механизмы группировок СКД не позволяют добиться нужного визуального оформления (например, мешают пустые шапки), можно подготовить данные в самом запросе. Мы разделим данные на три типа записей с помощью фиктивного поля ТипДанных.

Посмотрим на пример структуры запроса:


ВЫБРАТЬ
    Контрагент,
    "1. Нач. Остаток" КАК ТипКолонки,
    NULL КАК Период,
    СуммаНачальныйОстаток КАК Значение
ИЗ
    РегистрНакопления.Взаиморасчеты.Остатки(&НачалоПериода)

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    Контрагент,
    "2. Обороты" КАК ТипКолонки,
    ПериодМесяц,
    СуммаПриход - СуммаРасход
ИЗ
    РегистрНакопления.Взаиморасчеты.Обороты(&НачалоПериода, &КонецПериода, Месяц)

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    Контрагент,
    "3. Кон. Остаток" КАК ТипКолонки,
    NULL КАК Период,
    СуммаКонечныйОстаток
ИЗ
    РегистрНакопления.Взаиморасчеты.Остатки(&КонецПериода)

В настройках СКД мы выводим ТипКолонки в колонки таблицы, а внутри группировки "2. Обороты" добавляем вложенную группировку по полю Период. Это дает полный контроль над порядком следования данных и их внешним видом.

Рекомендации по оформлению

Чтобы отчет выглядел профессионально, воспользуемся следующими приемами в настройках оформления:

Проанализировав все способы, мы видим, что наиболее гибким и стабильным является Способ 1 (Структура таблицы) в сочетании с правильной настройкой ролей (Способ 3). Это позволяет сохранить высокую производительность отчета и корректную работу всех стандартных функций расшифровки 1С.

← На главную