Как добавить в итоги СКД свои строки «Остаток на начало» и «Остаток на конец»

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

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

Метод 1. Использование параметров и вычисляемых полей

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

Для начала откроем схему компоновки данных и перейдем на закладку Параметры. Создадим новый параметр, например, НачальныйОстаток. Установим ему тип (например, Число) и снимем галочку «Ограничение доступности», чтобы пользователь мог видеть это поле в настройках или мы могли вывести его на форму.

Далее разберем настройку расчета. Перейдем на закладку Вычисляемые поля и добавим поле КонечныйОстаток. Однако само по себе вычисляемое поле не даст нам нужного итога в подвале. Нам нужно настроить его на закладке Ресурсы. Пропишем формулу для ресурса следующим образом:

&НачальныйОстаток + Сумма(СуммаОборота)

Важно понимать, что этот расчет должен применяться только к общим итогам. В колонке «Рассчитывать по» выберем только Общие итоги. Теперь в настройках отчета (закладка Настройки) в разделе «Выбранные поля» мы можем добавить наши параметры и вычисляемые ресурсы. Чтобы они отображались именно внизу, воспользуемся механизмом макетов.

Метод 2. Использование пользовательских макетов оформления

Если нам нужно, чтобы строки «Остаток на начало» и «Остаток на конец» выглядели как полноценные строки таблицы в самом низу отчета, лучше всего использовать Макеты. Это позволит жестко задать визуальную структуру подвала.

Выполним следующие шаги:

  1. Перейдем на закладку Макеты в СКД.
  2. Нажмем «Добавить макет группировки». В качестве группировки выберем «Отчет» (это соответствует общим итогам), а тип макета укажем «Заголовок подвала».
  3. В появившемся редакторе табличного документа нарисуем две строки. В первой колонке напишем текст «Остаток на начало», во второй укажем параметр макета, например, ПараметрНачало.
  4. Ниже создадим строку «Остаток на конец» с параметром ПараметрКонец.
  5. В окне свойств ячеек для параметров укажем их связь с параметрами СКД или выражениями ресурсов.

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

Метод 3. Передача данных через внешний набор данных (Таблицу значений)

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

Сначала в схеме СКД создадим Набор данных - объект и назовем его ТаблицаОстатков. Опишем в нем поля, которые мы будем передавать. Затем в модуле отчета или в форме при формировании результата нам нужно будет подготовить таблицу значений и передать ее в компоновщик.

Посмотрим на пример кода, который инициализирует процесс компоновки с внешними данными:


// Подготавливаем таблицу значений
ТЗ_Остатки = Новый ТаблицаЗначений;
ТЗ_Остатки.Колонки.Добавить("ТипСтроки", Новый ОписаниеТипов("Строка"));
ТЗ_Остатки.Колонки.Добавить("Значение", Новый ОписаниеТипов("Число"));

НоваяСтрока = ТЗ_Остатки.Добавить();
НоваяСтрока.ТипСтроки = "Остаток на начало";
НоваяСтрока.Значение = Объект.СуммаНаФорме;

// Формируем структуру внешних наборов данных
ВнешниеНаборыДанных = Новый Структура;
ВнешниеНаборыДанных.Вставить("ТаблицаОстатков", ТЗ_Остатки);

// Стандартный вывод отчета с использованием внешних наборов
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.Настройки, ДанныеРасшифровки);

ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных, ДанныеРасшифровки);

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

Метод 4. Динамический расчет через функцию ВычислитьВыражение

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

Если мы хотим вывести «Остаток на конец» в общих итогах, мы можем использовать выражение в ресурсах:

&НачальныйОстаток + ВычислитьВыражение("Сумма(СуммаОборота)", , "ОбщийИтог")

Это выражение суммирует все значения поля СуммаОборота по всему отчету и прибавляет к ним значение нашего ручного параметра. Использование "ОбщийИтог" в качестве области расчета гарантирует корректность цифр даже при наличии сложных иерархических группировок.

Метод 5. Программная постобработка табличного документа

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

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


// В модуле отчета
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь; // Отключаем стандартный вывод
    
    // Инициализируем компоновку
    Схема = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
    Настройки = КомпоновщикНастроек.ПолучитьНастройки();
    
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки, ДанныеРасшифровки);
    
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);
    
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
    
    // Выводим основной отчет
    ПроцессорВывода.Вывести(ПроцессорКомпоновки);
    
    // Добавляем свои строки вручную
    МакетОбъекта = ПолучитьМакет("МакетПодвала"); // Созданный заранее макет
    
    // Выводим "Начальный остаток"
    ОбластьНачало = МакетОбъекта.ПолучитьОбласть("СтрокаНачало");
    ОбластьНачало.Параметры.Значение = ПараметрыСеанса.ТекущийНачальныйОстаток; // Пример
    ДокументРезультат.Вывести(ОбластьНачало);
    
    // Рассчитываем и выводим "Конечный остаток"
    // Сумму можно получить из итогов табличного документа или параметров СКД
    СуммаПоОтчету = ДокументРезультат.Область(1, 1, ДокументРезультат.ВысотаТаблицы, ДокументРезультат.ШиринаТаблицы).Итог("Сумма");
    
    ОбластьКонец = МакетОбъекта.ПолучитьОбласть("СтрокаКонец");
    ОбластьКонец.Параметры.Значение = ПараметрыСеанса.ТекущийНачальныйОстаток + СуммаПоОтчету;
    ДокументРезультат.Вывести(ОбластьКонец);
    
КонецПроцедуры

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

Подведение итогов

Мы рассмотрели пять различных подходов к добавлению пользовательских строк в итоги СКД. Выбор конкретного метода зависит от сложности ваших требований:

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

← На главную