Мы часто сталкиваемся с задачей модификации типовых отчетов в системе 1С, основанных на Системе Компоновки Данных (СКД). Одна из распространенных потребностей — это добавление собственного подвала, который будет содержать итоговую информацию, подписи или любой другой статический или динамический текст после всех данных отчета, но не будет повторяться на каждой странице как колонтитул. В этом руководстве мы подробно рассмотрим несколько методов решения этой задачи, включая как стандартные возможности СКД, так и программные доработки, а также применение расширений для сохранения возможности обновления типовой конфигурации.
Этот подход является наиболее предпочтительным, если мы хотим, чтобы подвал формировался непосредственно средствами СКД, используя ее встроенные механизмы по выводу данных и форматированию. Мы создадим специальную "фиктивную" группировку, которая будет отвечать только за вывод нашего подвала в самом конце отчета, а затем привяжем к ней собственный макет.
Для начала нам необходимо получить доступ к схеме компоновки данных (СКД) типового отчета. Если мы работаем с типовой конфигурацией и хотим избежать прямого изменения, мы должны использовать расширение. В расширении мы добавляем нужный отчет и заимствуем его схему компоновки данных. Это позволит нам модифицировать СКД отчета, сохраняя при этом возможность обновления основной конфигурации.
Переходим на вкладку "Настройки" в схеме компоновки данных. Здесь мы добавляем новую группировку. Для наших целей мы можем выбрать тип Детальные записи или просто добавить группировку без указания поля. Важно убедиться, что эта группировка располагается самой последней в иерархии настроек отчета, чтобы она выводилась после всех остальных данных.
Чтобы легко идентифицировать нашу группировку в дальнейшем, кликаем по ней правой кнопкой мыши и выбираем пункт "Установить имя...". Дадим ей понятное имя, например, ПодвалОтчета. Это имя будет использоваться для привязки макета.
Переходим к свойствам только что созданной группировки ПодвалОтчета и выполняем следующие шаги:
0 (хотя для подвала, который выводится один раз, это не всегда критично) и "Тип макета" в Вертикально. Эти настройки обеспечивают более предсказуемое поведение при размещении элементов в макете.Теперь, когда у нас есть фиктивная группировка, мы должны создать для нее соответствующий макет:
ПодвалОтчета. Это действие связывает макет с нашей фиктивной группировкой....). Откроется встроенный редактор макета. Здесь мы можем "нарисовать" нужную нам область для подвала, используя стандартные средства редактора макетов 1С. Это может быть одна строка или несколько строк, объединенные ячейки и т.д."Отчет сформирован: [ТекущаяДата]" или "Ответственный: [Пользователь]". Мы также можем использовать параметры компоновки данных или шаблоны для вывода динамической информации. Например, если у нас есть параметр Исполнитель, мы можем вывести его значение как [Исполнитель], или параметр ПараметрОтчета как [ПараметрОтчета]. Для вывода системной даты можно использовать [ТекущаяДата].Этот метод позволяет нам использовать мощь СКД для управления внешним видом и содержимым подвала, делая его частью логики отчета без необходимости писать дополнительный программный код. Он обеспечивает хорошую гибкость и управляемость из настроек отчета.
Если возможности СКД по настройке макетов оказываются недостаточными, или нам требуется реализовать более сложную логику формирования подвала, которая зависит от уже скомпонованных данных, или мы хотим динамически управлять содержимым и форматированием, мы можем использовать программный подход. Он заключается в перехвате события ПриКомпоновкеРезультата и добавлении необходимых областей непосредственно в сформированный табличный документ отчета.
Этот метод предоставляет нам полный контроль над тем, что и как будет выведено в подвале, но требует навыков программирования на языке 1С.
ПриКомпоновкеРезультата.
Мы реализуем эту процедуру в модуле объекта отчета. Если мы дорабатываем типовой отчет через расширение, то создаем обработчик этого события в модуле объекта расширения для данного отчета. Событие ПриКомпоновкеРезультата вызывается на сервере после того, как СКД полностью скомпоновала результат отчета в табличный документ, но до его вывода пользователю.
// В модуле объекта отчета (или в модуле объекта отчета расширения)
Процедура ПриКомпоновкеРезультата(ДокументРезультат, СтандартнаяОбработка)
// ДокументРезультат - это уже сформированный табличный документ.
// СтандартнаяОбработка - булево, можно установить в Ложь,
// если мы полностью переопределяем стандартный механизм вывода.
// Обычно для добавления подвала ее не отключают.
// ... Здесь будет располагаться наша логика формирования подвала ...
КонецПроцедуры
В процедуре ПриКомпоновкеРезультата параметр ДокументРезультат представляет собой объект типа ТабличныйДокумент, который уже содержит все данные, скомпонованные СКД. Мы можем использовать методы этого объекта для добавления новых элементов в его конец.
Для структурированного вывода подвала рекомендуется заранее определить макет подвала. Этот макет создается на вкладке "Макеты" самого объекта отчета (не в СКД!) или даже может быть загружен из внешней обработки/файла. В этом макете мы можем определить области с нужным текстом, параметрами, ячейками и оформлением.
// Пример получения макета из макетов объекта отчета
// Предполагается, что в макетах отчета (на уровне объекта конфигурации, а не СКД)
// есть макет с именем "МакетПодвала".
МакетПодвала = ЭтотОбъект.ПолучитьМакет("МакетПодвала");
// Получаем нужную область из макета.
// Например, если в макете есть область с именем "ОбластьТекстаПодвала".
ОбластьДляВывода = МакетПодвала.ПолучитьОбласть("ОбластьТекстаПодвала");
В этом макете мы можем использовать различные параметры, например, &Исполнитель, &ДатаФормирования, которые затем будем заполнять программно.
Если в нашем макете подвала есть параметры, мы должны заполнить их значения программно перед выводом. Затем мы используем метод Вывести() табличного документа, чтобы добавить нашу область в конец отчета. Для корректного заполнения параметров в области макета, мы обращаемся к коллекции Параметры этой области.
Процедура ПриКомпоновкеРезультата(ДокументРезультат, СтандартнаяОбработка)
// Если мы хотим, чтобы подвал был на новой странице, можно добавить разделитель
// ДокументРезультат.ВывестиГоризонтальныйРазделительСтраниц();
// Получаем макет из объекта отчета
МакетПодвала = ЭтотОбъект.ПолучитьМакет("МакетПодвала");
// Получаем нужную область из макета (например, область с именем "ОбластьПодвала")
ОбластьДляВывода = МакетПодвала.ПолучитьОбласть("ОбластьПодвала");
// Заполняем параметры области, если они есть в макете
// Например, если в макете есть параметр &Исполнитель и &ДатаФормирования
ОбластьДляВывода.Параметры.Исполнитель = "Иванов И.И. (отдел разработки)";
ОбластьДляВывода.Параметры.ДатаФормирования = ТекущаяДата();
ОбластьДляВывода.Параметры.ТекстПодвала = "Отчет сформирован и проверен автоматически. Данные актуальны на момент формирования.";
// Если в макете подвала требуется объединить ячейки для вывода одного большого текста,
// это можно сделать как на этапе проектирования макета, так и программно.
// Например, если макет имеет 3 колонки, а мы хотим объединить их для текста подвала:
// ОбластьДляВывода.ОбъединитьЯчейки(1, 1, 1, 3); // Строка 1, колонка 1 до строки 1, колонка 3
// Выводим заполненную область в конец табличного документа
ДокументРезультат.Вывести(ОбластьДляВывода);
КонецПроцедуры
Если нам нужен максимально простой статический текст без сложного форматирования, мы можем добавить его напрямую, без предварительного создания макета. Это менее гибкий, но быстрый способ.
Процедура ПриКомпоновкеРезультата(ДокументРезультат, СтандартнаяОбработка)
// ... после стандартного формирования отчета ...
// Опционально: вставляем горизонтальный разделитель, чтобы подвал был на новой странице
// ДокументРезультат.ВывестиГоризонтальныйРазделительСтраниц();
// Начинаем новую секцию для нашего текста
ДокументРезультат.НачатьСекцию();
// Очищаем текущую секцию перед добавлением текста, если она была открыта
ДокументРезультат.Очистить();
// Выводим простой текст. Ширина текста будет по ширине текущей колонки.
ДокументРезультат.ВывестиТекст("Это простой текст подвала отчета, добавленный программно.");
// Если нужно установить специфическое форматирование (например, жирный шрифт),
// можно получить ячейку и установить свойства:
// Ячейка = ДокументРезультат.Области.Получить("R" + (ДокументРезультат.ВысотаТаблицы - 1) + "C1");
// Если Ячейка <> Неопределено Тогда
// Ячейка.Шрифт = Новый Шрифт(Ячейка.Шрифт, Истина); // Сделать текст жирным
// КонецЕсли;
// Заканчиваем секцию
ДокументРезультат.ЗакончитьСекцию();
// ...
КонецПроцедуры
Для более сложного форматирования, такого как изменение шрифта, цвета или выравнивания, нам придется получать доступ к ячейкам табличного документа и программно изменять их свойства. Однако это может быть довольно трудоемко, и в таких случаях лучше использовать заранее подготовленный макет.
При работе с типовыми отчетами в конфигурациях, которые регулярно обновляются, прямое изменение основной конфигурации крайне нежелательно, так как это усложнит процесс обновления и может привести к потере доработок. В таких случаях мы обязательно должны использовать механизм расширений 1С.
В режиме конфигуратора создаем новое расширение. После создания расширения добавляем в него отчет, который мы планируем доработать. Это можно сделать через контекстное меню "Добавить в расширение" или перетаскиванием отчета в дерево объектов расширения.
Чтобы иметь возможность изменять СКД типового отчета, мы должны заимствовать ее в наше расширение. Выделяем отчет в дереве объектов расширения, затем через контекстное меню выбираем "Заимствовать схему компоновки данных". После этого схема СКД станет доступной для редактирования непосредственно в расширении, не затрагивая конфигурацию.
Теперь, когда у нас есть доступ к СКД отчета в расширении и возможность добавлять код, мы можем использовать любой из рассмотренных выше методов:
ПриКомпоновкеРезультата. Для этого в дереве объектов расширения, для нашего заимствованного отчета, в списке доступных событий находим ПриКомпоновкеРезультата и создаем обработчик. В этом обработчике мы пишем код, аналогичный приведенному в Методе 2. При этом нам нужно убедиться, что макеты, используемые в коде, также определены в расширении (например, как макеты объекта отчета в расширении) или создаются программно.
// Пример кода в модуле объекта отчета в расширении
// Допустим, мы добавили отчет "ОтчетДляДоработки" в расширение, заимствовали его СКД,
// и создали обработчик события "ПриКомпоновкеРезультата" для этого отчета в расширении.
&НаСервере
Процедура Отчет_ПриКомпоновкеРезультата(ДокументРезультат, СтандартнаяОбработка)
// Здесь мы можем получить свои макеты, определенные в расширении для объекта отчета.
// Например, если мы добавили макет с именем "МакетРасширенияПодвал" к отчету в расширении.
МакетПодвалаРасширения = ЭтотОбъект.ПолучитьМакет("МакетРасширенияПодвал");
// Получаем область из макета расширения
ОбластьПодвала = МакетПодвалаРасширения.ПолучитьОбласть("ОбластьПодвала");
// Заполняем параметры области
ОбластьПодвала.Параметры.Текст = "Подвал добавлен через расширение! Проверено отделом качества.";
ОбластьПодвала.Параметры.ТекущийПользователь = Пользователи.ТекущийПользователь().Наименование;
// Выводим область в конец табличного документа, сформированного типовым отчетом
ДокументРезультат.Вывести(ОбластьПодвала);
КонецПроцедуры
Использование расширений является лучшей практикой при доработке типовых конфигураций, поскольку это значительно упрощает процесс их обновления и обслуживания.
Мы подробно рассмотрели различные подходы к добавлению подвала в типовой отчет 1С на СКД. Выбор конкретного метода зависит от сложности требуемого подвала, динамичности его содержимого и требований к поддержанию конфигурации:
ПриКомпоновкеРезультата (Метод 2) становится необходимостью. Этот метод предоставляет максимальную гибкость и полный контроль над выводом.Применяя эти знания, вы сможете эффективно настроить свои отчеты для вывода любой необходимой дополнительной информации в конце, делая их более информативными и соответствующими вашим бизнес-требованиям.