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