Как сохранить картинки в Word при передаче из HTML в 1С

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

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

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

Причина проблемы: связанные и внедренные объекты

Выясним причину такого поведения текстового процессора. Когда мы открываем HTML-файл через InsertFile или COM-объект, Microsoft Word считывает теги img. Если в атрибуте src указан путь к локальному файлу, Word создает связь (линковку). Файл остается на вашем диске, а в документе сохраняется лишь "указатель" на него. Как только вы переносите документ на другой ПК, путь становится недействительным, и картинка пропадает.

Рассмотрим по шагам, как заставить Word "всосать" изображения внутрь файла .docx.

Способ 1. Использование Base64 для встраивания данных

Самый современный подход — это не передавать пути к файлам, а встраивать двоичные данные картинки непосредственно в тело HTML-кода. Это делается с помощью кодировки Base64. Разберем, как реализовать это в 1С.

Сначала нам необходимо преобразовать картинку в строку. Для этого используем встроенные функции платформы:


ДанныеКартинки = Новый ДвоичныеДанные(ПутьКФайлу);
СтрокаBase64 = Base64Строка(ДанныеКартинки);
ТекстHTML = "<img src=""data:image/png;base64," + СтрокаBase64 + """ />";

Важный нюанс: хотя современные версии Word (2013, 2016, 2019) хорошо понимают Base64 в HTML, иногда этого недостаточно для автоматического сохранения картинки внутри документа при конвертации в формат .docx. Если после открытия такого HTML-файла картинки все равно не сохраняются, стоит применить программные методы управления объектами Word.

Способ 2. Программный разрыв связей через COM-объект

Если вы используете метод вставки файла или если Base64 не подхватывается автоматически как внедренный объект, мы можем принудительно заставить Word разорвать связи с внешними источниками и сохранить изображения внутри документа. Рассмотрим пример кода на стороне 1С, использующий COM-соединение.


Word = Новый COMОбъект("Word.Application");
myDocument = Word.Documents.Add();

// Вставляем содержимое HTML-файла в созданный документ
myDocument.Range.InsertFile(ПутьКФайлуHTML, , , Ложь, Ложь);

// Определяем константу для типа связанной картинки
wdInlineShapeLinkedPicture = 4;

// Перебираем все встроенные фигуры в документе
Для Каждого InlineShape Из myDocument.InlineShapes Цикл
    Если InlineShape.Type = wdInlineShapeLinkedPicture Тогда
        // Разрываем связь, тем самым внедряя картинку в документ
        InlineShape.LinkFormat.BreakLink();
    КонецЕсли;
КонецЦикла;

Word.Visible = Истина;

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

Способ 3. Работа с полями документа

Проанализируем ситуацию, когда картинки вставляются не как фигуры, а как специальные поля INCLUDEPICTURE. В некоторых версиях Word именно этот механизм используется при импорте HTML. В таком случае нам нужно "разорвать" связи не в фигурах, а в коллекции полей Fields.

Посмотрим на пример кода, который делает это массово для всего документа:


// Разрыв связей для всех полей документа (включая ссылки на картинки)
myDocument.Fields.Unlink();

Этот метод считается более универсальным, так как он затрагивает все типы внешних ссылок, которые Word мог создать при импорте HTML-разметки.

Альтернативный вариант: Формат MHTML (Веб-архив)

Рассмотрим еще один интересный подход. Вместо того чтобы формировать чистый HTML и мучиться с путями, мы можем сформировать файл в формате .mht (MHTML). Это веб-архив, который содержит в себе и разметку, и все картинки в упакованном виде.

  1. 1С формирует текстовый документ, соответствующий стандарту MIME.
  2. Внутри файла прописываются секции для каждой картинки с кодировкой Base64.
  3. Word открывает такой файл как единое целое.

Поскольку .mht — это родной формат для продуктов Microsoft, Word при открытии такого файла корректно распознает все внутренние ресурсы. При последующем сохранении из Word в формат .docx, картинки гарантированно окажутся встроенными в документ.

Практические советы и особенности версий

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

Подводя итог, можно сказать, что наиболее надежным методом для 1С 8.3 является сочетание формирования HTML с Base64 и последующего программного вызова BreakLink() через COM-объект. Это гарантирует, что конечный пользователь получит полноценный документ со всеми иллюстрациями, независимо от наличия доступа к исходным файлам картинок.

← На главную