При разработке корпоративных систем часто возникает задача автоматического брендирования или технического оснащения печатных форм. Это может быть вставка логотипа компании, штрихкода для складского учета или факсимиле руководителя. Особую сложность вызывает ситуация, когда необходимо вывести несколько документов в один общий табличный документ (пакетная печать). В этом случае координаты «верх» и «лево» для второго и последующих документов становятся динамическими и зависят от высоты предыдущих секций.
В данной статье мы разберем, как программно вставить изображение в печатную форму, не изменяя при этом исходные макеты, и как правильно рассчитать координаты объекта в сложном составном документе.
Самый надежный и простой способ вставить рисунок в ТабличныйДокумент — это использование метода Расположить(). Вместо того чтобы вручную высчитывать координаты в миллиметрах или пунктах, мы привязываем рисунок к конкретной области ячеек. Система 1С сама вычислит положение этой области, учитывая высоту всех строк (включая строки с «Автовысотой») и ширину колонок.
Рассмотрим алгоритм действий по шагам:
РисунокТабличногоДокумента.Расположить(), передавая в него эту область.Пример программной реализации:
// Предположим, ТабДок - наш сформированный документ
// ОбластьДляРисунка - область, куда хотим "вписать" картинку
НовыйРисунок = ТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
НовыйРисунок.Картинка = БиблиотекаКартинок.ЛоготипКомпании;
НовыйРисунок.ГраницаСверху = Ложь;
НовыйРисунок.ГраницаСлева = Ложь;
НовыйРисунок.ГраницаСправа = Ложь;
НовыйРисунок.ГраницаСнизу = Ложь;
// Определяем ячейки, например, с 5-й по 10-ю строку
НужнаяОбласть = ТабДок.Область(5, 2, 10, 4);
НовыйРисунок.Расположить(НужнаяОбласть);
НовыйРисунок.ВыводитьНаПечать = Истина;
Важный нюанс: Если вам нужно сместить картинку относительно ячейки (например, на 5 мм вправо), сначала вызовите Расположить(), а затем измените свойства Лево или Верх, прибавив к ним нужное значение. Метод Расположить() установит базовые координаты, от которых удобно отталкиваться.
Если ваша конфигурация построена на базе БСП (Библиотека стандартных подсистем), задача значительно упрощается. При массовой печати БСП формирует структуру, в которой хранятся данные о том, какие строки табличного документа относятся к конкретному объекту (документу).
Проанализируем структуру коллекции ПечатныеФормы. В ней для каждого выводимого документа фиксируется его «область» в итоговом документе. Мы можем перехватить процесс формирования в процедуре Печать() модуля менеджера или через расширение в общих модулях печати.
Рассмотрим, как найти начало каждого документа в общем списке:
// В структуре КоллекцияПечатныхФорм (БСП) есть поле ТабличныйДокумент
// и соответствие имен макетов и их областей.
Для Каждого СтрокаПечати Из СписокОбъектов Цикл
// Находим область конкретного документа в общем ТабДоке
ОбластьДокумента = УправлениеПечатью.ОбластьПечатнойФормы(ТабДок, "ИмяМакета", ОбъектСсылка);
// Теперь мы знаем Верхнюю границу документа: ОбластьДокумента.Верх
// Можем программно добавить рисунок, используя относительные координаты
ДобавитьШтрихкодВДокумент(ТабДок, ОбластьДокумента.Верх);
КонецЦикла;
Иногда возникают ситуации, когда Расположить() не подходит (например, если рисунок должен висеть «в воздухе» над текстом независимо от сетки ячеек). Главная проблема здесь — свойство Автовысота. Пока 1С не отрисовала документ, она не знает точную высоту строк в миллиметрах.
Выясним причину: свойство ВысотаСтроки для строк с автовысотой возвращает 0 до момента фактического вывода. Чтобы обойти это, мы можем использовать метод «фиктивного вывода».
ТабличныйДокумент.ПроверитьВывод() или даже временно сохранить документ в формат PDF во временный файл (хотя это крайняя мера).Верх у этого рисунка. Это и будет реальная высота нашей секции в миллиметрах.Проанализируем ситуацию, когда мы не знаем структуру документа, но знаем, что картинка должна быть рядом с определенным текстом (например, над надписью «М.П.» или под итоговой суммой). Мы можем программно найти эту ячейку.
НайденнаяОбласть = ТабДок.НайтиТекст("М.П.");
Если НайденнаяОбласть <> Неопределено Тогда
// Мы нашли координаты ячейки
Рисунок = ТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
Рисунок.Картинка = МояКартинка;
// Позиционируем относительно найденной ячейки
Рисунок.Верх = НайденнаяОбласть.Верх;
Рисунок.Лево = НайденнаяОбласть.Лево;
КонецЕсли;
При программном добавлении рисунков важно учитывать следующие технические аспекты:
РазмерКартинки. Значение Пропорционально (Proportional) позволит сохранить оригинальный вид логотипа при изменении размеров области.Рисунки, чтобы он отображался поверх текста ячеек.Расположить().Подводя итог, можно сказать, что наиболее универсальным и современным подходом является сочетание механизмов БСП для определения границ каждого документа в пакете и метода Расположить() для точной посадки изображения на сетку ячеек. Это избавляет разработчика от необходимости вручную суммировать высоты сотен строк и учитывать нюансы различных принтеров.