При автоматизации документооборота часто возникает задача формирования печатных форм в формате Microsoft Word. Если для небольших компаний достаточно одного статичного шаблона, то в крупных холдингах или сервисных компаниях, где количество организаций превышает 30 и более, создание отдельных файлов-шаблонов для каждой фирмы становится крайне неэффективным. Разберем, как реализовать динамическую подстановку графических объектов (печатей и подписей) в единый шаблон Word средствами встроенного языка 1С.
Самый распространенный и надежный способ — это использование технологии COMОбъект и предварительно расставленных в шаблоне закладок (Bookmarks). Закладка служит якорем, который указывает программе точное место, куда нужно поместить изображение. Рассмотрим программную реализацию этого процесса:
// Подготовка временного файла для картинки
ИмяВременногоФайлаКартинка = ПолучитьИмяВременногоФайла("png");
// Получаем данные картинки из базы (например, из присоединенных файлов организации)
ДвоичныеДанныеКартинки = Справочники.Организации.ПолучитьПечать(ВыбраннаяОрганизация);
ДвоичныеДанныеКартинки.Записать(ИмяВременногоФайлаКартинка);
// Работа с COM-объектом Word
WordApp = Новый COMОбъект("Word.Application");
Документ = WordApp.Documents.Open(ПутьКШаблону);
// Поиск закладки и вставка изображения
Если Документ.Bookmarks.Exists("ПечатьОрганизации") Тогда
Закладка = Документ.Bookmarks("ПечатьОрганизации");
Закладка.Select();
// Вставка картинки как InlineShape (в потоке текста)
Рисунок = WordApp.Selection.InlineShapes.AddPicture(ИмяВременногоФайлаКартинка, Ложь, Истина);
КонецЕсли;
// Очистка временных файлов
УдалитьФайлы(ИмяВременногоФайлаКартинка);
В данном примере мы используем метод InlineShapes.AddPicture. Он вставляет картинку как символ текста. Это удобно, если место под печать четко зарезервировано в таблице или отдельной строке. Однако такой метод имеет ограничение: изображение будет «раздвигать» текст, и его сложно наложить поверх других элементов.
Для того чтобы печать выглядела максимально естественно — например, слегка заходила на подпись или название должности — проанализируем использование объекта Shapes вместо InlineShapes. Это позволит нам задать точные координаты и способ обтекания текстом.
Посмотрим на пример модификации кода для свободного перемещения объекта:
// Вставка через Shapes позволяет управлять слоями (Z-Order)
НовыйРисунок = Документ.Shapes.AddPicture(ИмяВременногоФайлаКартинка, Ложь, Истина);
НовыйРисунок.RelativeHorizontalPosition = 1; // Относительно колонки
НовыйРисунок.RelativeVerticalPosition = 1; // Относительно строки
НовыйРисунок.Left = 100; // Координата X в пунктах
НовыйРисунок.Top = 200; // Координата Y в пунктах
// Установка обтекания "Перед текстом"
НовыйРисунок.WrapFormat.Type = 3; // 3 соответствует msoWrapNone или перед текстом
НовыйРисунок.ZOrder(5); // Вывести на передний план
Использование Shapes дает большую гибкость, но требует точного расчета координат. Выясним причину, почему это может быть сложно: координаты в Word зависят от разрешения экрана и настроек полей страницы. Оптимальным решением будет комбинация: найти закладку, получить её координаты и вставить Shape именно в эти координаты.
Чтобы печать не перекрывала текст белым прямоугольником, необходимо использовать изображения в формате PNG с альфа-каналом. Формат JPG не поддерживает прозрачность, поэтому «мокрая печать» в нем всегда будет иметь непрозрачный фон. При подготовке графики для 1С убедитесь, что фон удален, а файл сохранен как 32-битный PNG.
Рассмотрим важный нюанс: при вставке через COM-объект Microsoft Word корректно распознает прозрачность PNG-файла, позволяя тексту под картинкой оставаться видимым. Это создает эффект реального оттиска на бумаге.
Когда организаций больше 30, хранение путей к файлам на диске становится небезопасным и неудобным. Разберем алгоритм правильной архитектуры решения:
Организации реквизиты или используйте механизм «Присоединенные файлы» для хранения печати и подписи в виде ДвоичныеДанные.МестоПечати, МестоПодписиДиректора, МестоПодписиБухгалтера.Многие разработчики задаются вопросом: можно ли избежать создания временных файлов на диске? Проанализируем ситуацию: стандартный COM-интерфейс Word (метод AddPicture) в обязательном порядке требует путь к файлу. Однако существуют обходные пути:
1. Использование буфера обмена (Clipboard). Мы можем поместить картинку в буфер обмена средствами 1С (или через HTML-поле) и вызвать WordApp.Selection.Paste(). Но будьте осторожны: этот метод крайне нестабилен на сервере и в многопользовательском режиме, так как буфер обмена один на всю операционную систему.
2. Технология Open XML. Если ваш сервер работает на Linux или вы хотите добиться максимальной производительности, рассмотрим вариант работы с файлом .docx как с ZIP-архивом. В этом случае вы можете:
ЧтениеZipФайла.word/media/ внутри архива.document.xml, добавив XML-описание рисунка.Этот метод не требует установленного Word на сервере и работает полностью «в памяти», но требует глубоких знаний структуры формата Office Open XML.
Если ваша конфигурация построена на базе БСП (Библиотека стандартных подсистем), рекомендуется использовать модуль УправлениеПечатью. В БСП реализованы механизмы замены параметров в офисных документах. Хотя базовая вставка картинок там может быть ограничена, вы можете расширить функционал, используя встроенные в БСП методы работы с временными файлами и очистки за собой временных каталогов, что делает код более безопасным и чистым. Для реализации подобных механизмов в современных типовых конфигурациях можно использовать пример внешней печатной формы с факсимиле на БСП.
Подведем итог: для эффективной вставки печати в Word необходимо использовать один универсальный шаблон, закладки для позиционирования и хранение изображений в формате PNG прямо в базе данных 1С. Это обеспечит масштабируемость системы независимо от количества организаций в вашей базе.