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