Как программно вставить печать и подпись в документ Word из 1С

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

При автоматизации документооборота часто возникает задача формирования печатных форм в формате Microsoft Word. Если для небольших компаний достаточно одного статичного шаблона, то в крупных холдингах или сервисных компаниях, где количество организаций превышает 30 и более, создание отдельных файлов-шаблонов для каждой фирмы становится крайне неэффективным. Разберем, как реализовать динамическую подстановку графических объектов (печатей и подписей) в единый шаблон Word средствами встроенного языка 1С.

Метод вставки через закладки и InlineShapes

Самый распространенный и надежный способ — это использование технологии COMОбъект и предварительно расставленных в шаблоне закладок (Bookmarks). Закладка служит якорем, который указывает программе точное место, куда нужно поместить изображение. Рассмотрим программную реализацию этого процесса:


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

// Работа с COM-объектом Word
WordApp = Новый COMОбъект("Word.Application");
Документ = WordApp.Documents.Open(ПутьКШаблону);

// Поиск закладки и вставка изображения
Если Документ.Bookmarks.Exists("ПечатьОрганизации") Тогда
    Закладка = Документ.Bookmarks("ПечатьОрганизации");
    Закладка.Select();
    
    // Вставка картинки как InlineShape (в потоке текста)
    Рисунок = WordApp.Selection.InlineShapes.AddPicture(ИмяВременногоФайлаКартинка, Ложь, Истина);
КонецЕсли;

// Очистка временных файлов
УдалитьФайлы(ИмяВременногоФайлаКартинка);

В данном примере мы используем метод InlineShapes.AddPicture. Он вставляет картинку как символ текста. Это удобно, если место под печать четко зарезервировано в таблице или отдельной строке. Однако такой метод имеет ограничение: изображение будет «раздвигать» текст, и его сложно наложить поверх других элементов.

Точное позиционирование с использованием коллекции Shapes

Для того чтобы печать выглядела максимально естественно — например, слегка заходила на подпись или название должности — проанализируем использование объекта 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, хранение путей к файлам на диске становится небезопасным и неудобным. Разберем алгоритм правильной архитектуры решения:

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

Формирование документов без использования диска (в памяти)

Многие разработчики задаются вопросом: можно ли избежать создания временных файлов на диске? Проанализируем ситуацию: стандартный COM-интерфейс Word (метод AddPicture) в обязательном порядке требует путь к файлу. Однако существуют обходные пути:

1. Использование буфера обмена (Clipboard). Мы можем поместить картинку в буфер обмена средствами 1С (или через HTML-поле) и вызвать WordApp.Selection.Paste(). Но будьте осторожны: этот метод крайне нестабилен на сервере и в многопользовательском режиме, так как буфер обмена один на всю операционную систему.

2. Технология Open XML. Если ваш сервер работает на Linux или вы хотите добиться максимальной производительности, рассмотрим вариант работы с файлом .docx как с ZIP-архивом. В этом случае вы можете:

Этот метод не требует установленного Word на сервере и работает полностью «в памяти», но требует глубоких знаний структуры формата Office Open XML.

Использование возможностей БСП

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

Подведем итог: для эффективной вставки печати в Word необходимо использовать один универсальный шаблон, закладки для позиционирования и хранение изображений в формате PNG прямо в базе данных 1С. Это обеспечит масштабируемость системы независимо от количества организаций в вашей базе.

← На главную