Как программно добавить изображение во все печатные формы 1С при массовой печати?

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

При разработке корпоративных систем часто возникает задача автоматического брендирования или технического оснащения печатных форм. Это может быть вставка логотипа компании, штрихкода для складского учета или факсимиле руководителя. Особую сложность вызывает ситуация, когда необходимо вывести несколько документов в один общий табличный документ (пакетная печать). В этом случае координаты «верх» и «лево» для второго и последующих документов становятся динамическими и зависят от высоты предыдущих секций.

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

Метод 1: Использование встроенного метода Расположить()

Самый надежный и простой способ вставить рисунок в ТабличныйДокумент — это использование метода Расположить(). Вместо того чтобы вручную высчитывать координаты в миллиметрах или пунктах, мы привязываем рисунок к конкретной области ячеек. Система 1С сама вычислит положение этой области, учитывая высоту всех строк (включая строки с «Автовысотой») и ширину колонок.

Рассмотрим алгоритм действий по шагам:

  1. Создаем новый объект РисунокТабличногоДокумента.
  2. Определяем область ячеек, где должен располагаться рисунок.
  3. Вызываем метод Расположить(), передавая в него эту область.

Пример программной реализации:


// Предположим, ТабДок - наш сформированный документ
// ОбластьДляРисунка - область, куда хотим "вписать" картинку
НовыйРисунок = ТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
НовыйРисунок.Картинка = БиблиотекаКартинок.ЛоготипКомпании;
НовыйРисунок.ГраницаСверху = Ложь;
НовыйРисунок.ГраницаСлева = Ложь;
НовыйРисунок.ГраницаСправа = Ложь;
НовыйРисунок.ГраницаСнизу = Ложь;

// Определяем ячейки, например, с 5-й по 10-ю строку
НужнаяОбласть = ТабДок.Область(5, 2, 10, 4); 
НовыйРисунок.Расположить(НужнаяОбласть);
НовыйРисунок.ВыводитьНаПечать = Истина;

Важный нюанс: Если вам нужно сместить картинку относительно ячейки (например, на 5 мм вправо), сначала вызовите Расположить(), а затем измените свойства Лево или Верх, прибавив к ним нужное значение. Метод Расположить() установит базовые координаты, от которых удобно отталкиваться.

Метод 2: Определение границ документа через механизмы БСП

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

Проанализируем структуру коллекции ПечатныеФормы. В ней для каждого выводимого документа фиксируется его «область» в итоговом документе. Мы можем перехватить процесс формирования в процедуре Печать() модуля менеджера или через расширение в общих модулях печати.

Рассмотрим, как найти начало каждого документа в общем списке:


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

Метод 3: Расчет координат через временный документ

Иногда возникают ситуации, когда Расположить() не подходит (например, если рисунок должен висеть «в воздухе» над текстом независимо от сетки ячеек). Главная проблема здесь — свойство Автовысота. Пока 1С не отрисовала документ, она не знает точную высоту строк в миллиметрах.

Выясним причину: свойство ВысотаСтроки для строк с автовысотой возвращает 0 до момента фактического вывода. Чтобы обойти это, мы можем использовать метод «фиктивного вывода».

  1. Создаем временный пустой ТабличныйДокумент.
  2. Выводим в него нужную секцию макета.
  3. Просим систему рассчитать высоту. Иногда для этого требуется вызвать метод ПроверитьВывод() или даже временно сохранить документ в формат PDF во временный файл (хотя это крайняя мера).
  4. Вставляем в этот временный документ тестовый рисунок в самый низ области.
  5. Считываем значение свойства Верх у этого рисунка. Это и будет реальная высота нашей секции в миллиметрах.

Метод 4: Поиск «якоря» в тексте

Проанализируем ситуацию, когда мы не знаем структуру документа, но знаем, что картинка должна быть рядом с определенным текстом (например, над надписью «М.П.» или под итоговой суммой). Мы можем программно найти эту ячейку.


НайденнаяОбласть = ТабДок.НайтиТекст("М.П.");
Если НайденнаяОбласть <> Неопределено Тогда
    // Мы нашли координаты ячейки
    Рисунок = ТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
    Рисунок.Картинка = МояКартинка;
    
    // Позиционируем относительно найденной ячейки
    Рисунок.Верх = НайденнаяОбласть.Верх; 
    Рисунок.Лево = НайденнаяОбласть.Лево;
КонецЕсли;

Рекомендации по работе с изображениями

При программном добавлении рисунков важно учитывать следующие технические аспекты:

Подводя итог, можно сказать, что наиболее универсальным и современным подходом является сочетание механизмов БСП для определения границ каждого документа в пакете и метода Расположить() для точной посадки изображения на сетку ячеек. Это избавляет разработчика от необходимости вручную суммировать высоты сотен строк и учитывать нюансы различных принтеров.

← На главную