Как реализовать вывод разных логотипов организаций в печатной форме счета на оплату?

Программист 1С v8.3 (Управляемые формы) Управленческий учет IT и автоматизация бизнеса
← На главную

При работе в многофирменных базах данных 1С часто возникает задача индивидуализации печатных форм. Типичный пример — вывод уникального логотипа компании в шапке счета на оплату в зависимости от того, от какого юридического лица выставляется документ. Если для одной организации печатная форма должна содержать один логотип, а для другой — совершенно иной, перед разработчиком встает задача технической реализации этого механизма во внешней печатной форме (ВПФ).

В этой статье мы подробно разберем, как решить эту задачу несколькими способами: от простых манипуляций с макетом до профессиональной интеграции со стандартными механизмами Библиотеки стандартных подсистем (БСП).

Способ 1. Программный вывод логотипа из карточки организации (Рекомендуемый)

Современные типовые конфигурации 1С (такие как «Бухгалтерия предприятия 3.0», «Управление торговлей 11», «ERP Управление предприятием» и др.) уже имеют встроенный функционал для хранения логотипов. Логотип загружается пользователем непосредственно в карточке справочника Организации в разделе «Печать» и хранится либо в реквизите типа ХранилищеЗначения, либо в связанном справочнике присоединенных файлов (например, ОрганизацииПрисоединенныеФайлы).

Давайте разберем по шагам, как программно извлечь это изображение и поместить его в макет внешней печатной формы:

  1. Подготовка макета в конфигураторе:
    • Откроем макет нашей печатной формы.
    • В области шапки добавим графический объект. Для этого перейдем в меню: Таблица — Рисунки — Вставить картинку. При вставке выберем любую пустую или временную картинку.
    • Откроем свойства созданного рисунка и зададим ему уникальное имя, например, ЛоготипОрганизации.
    • Важная настройка: в свойстве «Размер картинки» обязательно установим значение Пропорционально. Это гарантирует, что изображение любого разрешения корректно впишется в отведенные границы рисунка без искажения пропорций.
  2. Программный код в модуле печатной формы:

    При формировании табличного документа нам необходимо получить двоичные данные картинки из карточки организации и передать их в созданный рисунок области макета. Рассмотрим пример кода, который решает эту задачу:


// Получаем область шапки из макета
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");

// Определяем организацию из документа-источника
ОрганизацияДокумента = СсылкаНаДокумент.Организация;

// Извлекаем файл логотипа. В современных конфигурациях БСП он хранится как присоединенный файл
СсылкаНаФайл = ОбщегоНазначения.ПолучитьЗначениеРеквизита(ОрганизацияДокумента, "ФайлЛоготипа");

Если ЗначениеЗаполнено(СсылкаНаФайл) Тогда
    // Получаем двоичные данные файла через стандартный интерфейс БСП
    ДвоичныеДанные = ПрисоединенныеФайлы.ПолучитьДвоичныеДанныеФайла(СсылкаНаФайл);
    
    Если ТипЗнч(ДвоичныеДанные) = Тип("ДвоичныеДанные") Тогда
        // Создаем объект Картинка на основании двоичных данных
        КартинкаЛоготипа = Новый Картинка(ДвоичныеДанные);
        
        // Помещаем картинку в подготовленный рисунок макета
        Попытка
            ОбластьШапка.Рисунки.ЛоготипОрганизации.Картинка = КартинкаЛоготипа;
        Исключение
            ЗаписьЖурналаРегистрации("ПечатьСчета", УровеньЖурналаРегистрации.Предупреждение, , , 
                "Не удалось вывести логотип на печать: " + ОписаниеОшибки());
        КонецПопытки;
    КонецЕсли;
КонецЕсли;

// Выводим заполненную область в итоговый табличный документ
ТабличныйДокумент.Вывести(ОбластьШапка);

Этот способ является наиболее гибким, так как пользователю не потребуется помощь программиста при смене логотипа — достаточно будет просто загрузить новый файл в карточку организации в режиме «1С:Предприятие».

Способ 2. Использование нескольких областей (шапок) в одном макете

Если в базе ведется учет всего по двум-трем организациям, логотипы которых меняются крайне редко, можно прибегнуть к более простому и быстрому в реализации методу — разделению областей в макете печатной формы.

Проанализируем этот подход подробнее:

  1. В макете печатной формы создадим не одну область Шапка, а несколько. Например, Шапка_Организация1 и Шапка_Организация2.
  2. В каждую из этих областей вручную вставим соответствующий логотип (через меню работы с рисунками в конфигураторе). Таким образом, картинки будут «вшиты» прямо в макет.
  3. В коде формирования печатной формы реализуем условие выбора нужной области в зависимости от ИНН организации или ссылки на саму организацию.

Посмотрим на пример программной реализации такого условия:


// Определяем ИНН организации документа
ИННОрганизации = СсылкаНаДокумент.Организация.ИНН;

// Выбираем область макета в зависимости от ИНН
Если ИННОрганизации = "7701020304" Тогда
    ОбластьШапка = Макет.ПолучитьОбласть("Шапка_Организация1");
ИначеЕсли ИННОрганизации = "7802030405" Тогда
    ОбластьШапка = Макет.ПолучитьОбласть("Шапка_Организация2");
Иначе
    // Резервный вариант шапки без логотипа или с общим логотипом
    ОбластьШапка = Макет.ПолучитьОбласть("Шапка_Общая");
КонецЕсли;

// Заполняем параметры области (Получатель, Банк, Счет и т.д.)
ЗаполнитьПараметрыАдресации(ОбластьШапка, СсылкаНаДокумент);

ТабличныйДокумент.Вывести(ОбластьШапка);

Преимущества метода: Высокая скорость разработки. Нет необходимости работать с двоичными данными и временными файлами.

Недостатки метода: При добавлении новой организации в базу вам придется снова открывать конфигуратор, добавлять новую секцию в макет и переписывать программный код. Метод не подходит для тиражируемых решений.

Способ 3. Привязка логотипов через дополнительные реквизиты

Если конфигурация сильно изменена или в справочнике Организации по какой-то причине отсутствует штатный механизм хранения графических файлов, отличным выходом станет использование механизма «Дополнительные сведения и реквизиты» (входит в состав БСП).

Выясним алгоритм настройки такой схемы:

Такой подход сохраняет гибкость решения и позволяет избежать внесения изменений в структуру метаданных основной конфигурации, сохраняя ее на полной поддержке.

Резюме

Мы рассмотрели различные варианты решения задачи. Для простых баз с фиксированным списком компаний вполне подойдет разделение макета на несколько именных областей шапки (Способ 2). Однако для современных динамично развивающихся систем правильным и наиболее надежным решением является интеграция со стандартными механизмами БСП (Способ 1), которая позволяет конечным пользователям самостоятельно управлять визуальным оформлением документов без привлечения программистов.

← На главную