В практике разработки на платформе 1С часто возникает задача, когда стандартных ресурсов и группировок СКД (Системы Компоновки Данных) недостаточно. Типичный пример — необходимость вывести в подвале отчета две строки: «Остаток на начало», который пользователь вводит вручную прямо на форме, и «Остаток на конец», который должен автоматически рассчитываться как сумма этого ввода и итогов по отчету. Рассмотрим подробно, как реализовать этот функционал несколькими способами, от простых настроек схемы до программного управления выводом.
Проанализируем самый простой и эффективный способ, который не требует сложного кодинга. Суть заключается в том, чтобы создать в схеме СКД параметр, значение которого будет связано с полем на форме, а расчет конечного остатка доверить механизму ресурсов.
Для начала откроем схему компоновки данных и перейдем на закладку Параметры. Создадим новый параметр, например, НачальныйОстаток. Установим ему тип (например, Число) и снимем галочку «Ограничение доступности», чтобы пользователь мог видеть это поле в настройках или мы могли вывести его на форму.
Далее разберем настройку расчета. Перейдем на закладку Вычисляемые поля и добавим поле КонечныйОстаток. Однако само по себе вычисляемое поле не даст нам нужного итога в подвале. Нам нужно настроить его на закладке Ресурсы. Пропишем формулу для ресурса следующим образом:
&НачальныйОстаток + Сумма(СуммаОборота)
Важно понимать, что этот расчет должен применяться только к общим итогам. В колонке «Рассчитывать по» выберем только Общие итоги. Теперь в настройках отчета (закладка Настройки) в разделе «Выбранные поля» мы можем добавить наши параметры и вычисляемые ресурсы. Чтобы они отображались именно внизу, воспользуемся механизмом макетов.
Если нам нужно, чтобы строки «Остаток на начало» и «Остаток на конец» выглядели как полноценные строки таблицы в самом низу отчета, лучше всего использовать Макеты. Это позволит жестко задать визуальную структуру подвала.
Выполним следующие шаги:
ПараметрНачало.ПараметрКонец.Такой подход гарантирует, что как бы ни менялись данные в основной части отчета, в самом конце всегда будут выведены две четко оформленные строки с нашими данными.
Рассмотрим более сложную ситуацию: что если «Остаток на начало» — это не просто одно число, а набор данных (например, по разным организациям или валютам), которые пользователь ввел в таблицу на форме? В этом случае нам поможет объект Внешний набор данных.
Сначала в схеме СКД создадим Набор данных - объект и назовем его ТаблицаОстатков. Опишем в нем поля, которые мы будем передавать. Затем в модуле отчета или в форме при формировании результата нам нужно будет подготовить таблицу значений и передать ее в компоновщик.
Посмотрим на пример кода, который инициализирует процесс компоновки с внешними данными:
// Подготавливаем таблицу значений
ТЗ_Остатки = Новый ТаблицаЗначений;
ТЗ_Остатки.Колонки.Добавить("ТипСтроки", Новый ОписаниеТипов("Строка"));
ТЗ_Остатки.Колонки.Добавить("Значение", Новый ОписаниеТипов("Число"));
НоваяСтрока = ТЗ_Остатки.Добавить();
НоваяСтрока.ТипСтроки = "Остаток на начало";
НоваяСтрока.Значение = Объект.СуммаНаФорме;
// Формируем структуру внешних наборов данных
ВнешниеНаборыДанных = Новый Структура;
ВнешниеНаборыДанных.Вставить("ТаблицаОстатков", ТЗ_Остатки);
// Стандартный вывод отчета с использованием внешних наборов
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.Настройки, ДанныеРасшифровки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных, ДанныеРасшифровки);
В настройках СКД мы можем объединить этот набор данных с основным запросом через Набор данных - объединение. Это позволит вывести строки из внешней таблицы как часть общего потока данных, а с помощью сортировки или специальных признаков переместить их в самый низ или верх отчета.
Проанализируем ситуацию, когда нам нужно рассчитать конечный остаток, учитывая все предыдущие группировки. В СКД есть мощная функция ВычислитьВыражение. Она позволяет обращаться к значениям других строк или ресурсов.
Если мы хотим вывести «Остаток на конец» в общих итогах, мы можем использовать выражение в ресурсах:
&НачальныйОстаток + ВычислитьВыражение("Сумма(СуммаОборота)", , "ОбщийИтог")
Это выражение суммирует все значения поля СуммаОборота по всему отчету и прибавляет к ним значение нашего ручного параметра. Использование "ОбщийИтог" в качестве области расчета гарантирует корректность цифр даже при наличии сложных иерархических группировок.
Если стандартные средства СКД кажутся слишком громоздкими для такой задачи, мы можем прибегнуть к «хирургическому» вмешательству в результат. Разберем, как это сделать в процедуре ПриКомпоновкеРезультата модуля отчета.
Выясним причину, почему этот метод хорош: он дает 100% контроль над оформлением. Мы позволяем СКД вывести основной отчет, а затем просто дописываем в конец табличного документа нужные нам строки, используя области макета.
// В модуле отчета
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь; // Отключаем стандартный вывод
// Инициализируем компоновку
Схема = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
Настройки = КомпоновщикНастроек.ПолучитьНастройки();
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки, ДанныеРасшифровки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
// Выводим основной отчет
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
// Добавляем свои строки вручную
МакетОбъекта = ПолучитьМакет("МакетПодвала"); // Созданный заранее макет
// Выводим "Начальный остаток"
ОбластьНачало = МакетОбъекта.ПолучитьОбласть("СтрокаНачало");
ОбластьНачало.Параметры.Значение = ПараметрыСеанса.ТекущийНачальныйОстаток; // Пример
ДокументРезультат.Вывести(ОбластьНачало);
// Рассчитываем и выводим "Конечный остаток"
// Сумму можно получить из итогов табличного документа или параметров СКД
СуммаПоОтчету = ДокументРезультат.Область(1, 1, ДокументРезультат.ВысотаТаблицы, ДокументРезультат.ШиринаТаблицы).Итог("Сумма");
ОбластьКонец = МакетОбъекта.ПолучитьОбласть("СтрокаКонец");
ОбластьКонец.Параметры.Значение = ПараметрыСеанса.ТекущийНачальныйОстаток + СуммаПоОтчету;
ДокументРезультат.Вывести(ОбластьКонец);
КонецПроцедуры
Важный момент: при использовании программного вывода следует внимательно следить за расшифровкой. Если вы просто выводите текст, расшифровка в этих строках работать не будет, пока вы не заполните её вручную в параметрах области.
Мы рассмотрели пять различных подходов к добавлению пользовательских строк в итоги СКД. Выбор конкретного метода зависит от сложности ваших требований:
ВычислитьВыражение.Комбинируя эти инструменты, вы сможете решить любую задачу по оформлению отчетности в 1С, делая отчеты удобными и понятными для конечного пользователя.