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