Как вставить картинку из 1С в документ Word через COM-объект?

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

При автоматизации формирования документов из 1С часто возникает задача вывода графических элементов, например, печати организации или подписи руководителя, непосредственно в файл Microsoft Word. Однако при попытке передать объект Картинка напрямую в методы Word через COM-соединение, разработчики сталкиваются с ошибкой «типы не совпадают». Давайте разберемся, почему это происходит и как правильно реализовать данную задачу.

Причина возникновения ошибки

Проблема заключается в архитектурном различии между 1С и Microsoft Office. Объект Картинка является внутренним типом данных платформы 1С. В свою очередь, внешнее приложение Microsoft Word работает через COM-интерфейс и ничего не знает об объектах 1С. Метод AddPicture, который используется для вставки изображений, ожидает получить строковый путь к файлу в файловой системе (аргумент FileName), а не объект в памяти 1С.

Чтобы успешно передать изображение, нам необходимо сначала «материализовать» его, то есть сохранить данные из базы 1С в виде отдельного физического файла на диске.

Пошаговое решение задачи

Для корректной работы выполним следующие шаги:

  1. Получим двоичные данные картинки из справочника Организации.
  2. Сохраним эти данные во временный файл на диске с помощью метода Записать.
  3. Передадим путь к созданному файлу в метод AddPicture объекта InlineShapes.
  4. После формирования документа удалим временный файл для очистки дискового пространства.

Реализация кода

Рассмотрим пример кода, который позволяет корректно вставить печать в Word:


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

// 2. Формируем путь к временному файлу
ПутьКФайлу = ПолучитьИмяВременногоФайла("jpg");

// 3. Записываем данные на диск
ДвоичныеДанныеПечать.Записать(ПутьКФайлу);

// 4. Поиск места вставки в Word и добавление изображения
Word.Application.Selection.Find.Text = "{ПечатьОрганизации}";
Word.Application.Selection.Find.Execute();

// Вставляем изображение по пути к файлу
КартинкаВорд = Word.Application.Selection.InlineShapes.AddPicture(ПутьКФайлу);

// 5. Очистка временного файла
ФайлУдаления = Новый Файл(ПутьКФайлу);
Если ФайлУдаления.Существует() Тогда
    УдалитьФайлы(ПутьКФайлу);
КонецЕсли;

Рекомендации по улучшению

Использование метода Selection.Find для поиска маркера {ПечатьОрганизации} — это рабочий, но не самый надежный метод, так как структура документа может меняться. Рассмотрим более профессиональные подходы:

Использование «Закладок» (Bookmarks)
В шаблоне Word вместо текстовых маркеров лучше расставить закладки. Обращение к закладке через объект ActiveDocument.Bookmarks("ИмяЗакладки").Range позволяет точно спозиционировать вставку картинки, что исключает ошибки при изменении текста документа.

Настройка размеров и обтекания
Метод AddPicture возвращает объект InlineShape. Сразу после вставки вы можете управлять параметрами изображения, чтобы оно гармонично вписалось в документ:


КартинкаВорд.Width = 100; // Установка ширины в пунктах
КартинкаВорд.Height = 100; // Установка высоты в пунктах

Если вам требуется разместить печать поверх текста или настроить обтекание, используйте коллекцию Shapes вместо InlineShapes. Это даст доступ к параметрам WrapFormat, позволяющим изменять положение картинки относительно текстовых блоков.

Альтернативные подходы
Если вы планируете масштабировать разработку и избавиться от зависимости от установленного Microsoft Word на сервере, рекомендуем рассмотреть генерацию документов .docx через сторонние библиотеки (например, OpenXML) или использование встроенных механизмов 1С для работы с HTML-шаблонами, где картинки можно вставлять в формате Base64 прямо внутри структуры документа.

Соблюдение этих простых правил поможет вам избежать ошибок при автоматизации документов и сделает программный код более стабильным и читаемым.

← На главную