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