При формировании документов в 1С часто используется механизм генерации HTML-кода с последующей передачей его в Microsoft Word. Это удобный способ, позволяющий быстро верстать сложные отчеты. Однако разработчики часто сталкиваются с проблемой: при открытии такого файла на другом компьютере изображения исчезают, оставляя лишь пустые рамки. Это происходит потому, что Word по умолчанию вставляет картинки как внешние ссылки, а не как внедренные объекты.
В данной статье мы проанализируем ситуацию и рассмотрим несколько способов решения этой задачи, чтобы ваши документы оставались целостными при перемещении между рабочими станциями.
Выясним причину такого поведения текстового процессора. Когда мы открываем HTML-файл через InsertFile или COM-объект, Microsoft Word считывает теги img. Если в атрибуте src указан путь к локальному файлу, Word создает связь (линковку). Файл остается на вашем диске, а в документе сохраняется лишь "указатель" на него. Как только вы переносите документ на другой ПК, путь становится недействительным, и картинка пропадает.
Рассмотрим по шагам, как заставить Word "всосать" изображения внутрь файла .docx.
Самый современный подход — это не передавать пути к файлам, а встраивать двоичные данные картинки непосредственно в тело HTML-кода. Это делается с помощью кодировки Base64. Разберем, как реализовать это в 1С.
Сначала нам необходимо преобразовать картинку в строку. Для этого используем встроенные функции платформы:
ДанныеКартинки = Новый ДвоичныеДанные(ПутьКФайлу);
СтрокаBase64 = Base64Строка(ДанныеКартинки);
ТекстHTML = "<img src=""data:image/png;base64," + СтрокаBase64 + """ />";
Важный нюанс: хотя современные версии Word (2013, 2016, 2019) хорошо понимают Base64 в HTML, иногда этого недостаточно для автоматического сохранения картинки внутри документа при конвертации в формат .docx. Если после открытия такого HTML-файла картинки все равно не сохраняются, стоит применить программные методы управления объектами Word.
Если вы используете метод вставки файла или если 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() превращает динамическую ссылку на внешний файл в статическое изображение, которое хранится в структуре самого вордовского документа.
Проанализируем ситуацию, когда картинки вставляются не как фигуры, а как специальные поля INCLUDEPICTURE. В некоторых версиях Word именно этот механизм используется при импорте HTML. В таком случае нам нужно "разорвать" связи не в фигурах, а в коллекции полей Fields.
Посмотрим на пример кода, который делает это массово для всего документа:
// Разрыв связей для всех полей документа (включая ссылки на картинки)
myDocument.Fields.Unlink();
Этот метод считается более универсальным, так как он затрагивает все типы внешних ссылок, которые Word мог создать при импорте HTML-разметки.
Рассмотрим еще один интересный подход. Вместо того чтобы формировать чистый HTML и мучиться с путями, мы можем сформировать файл в формате .mht (MHTML). Это веб-архив, который содержит в себе и разметку, и все картинки в упакованном виде.
Поскольку .mht — это родной формат для продуктов Microsoft, Word при открытии такого файла корректно распознает все внутренние ресурсы. При последующем сохранении из Word в формат .docx, картинки гарантированно окажутся встроенными в документ.
В процессе совместной работы над этой задачей мы выяснили, что поведение Word может сильно зависеть от его версии (релиза) и разрядности (x86 или x64). Проанализируем ключевые моменты:
BreakLink для окончательной фиксации.data:image в HTML. Для них единственный надежный путь — временные файлы на диске и последующий разрыв связей через InlineShapes.InsertFile. Сначала нужно выполнить BreakLink в Word, и только после этого можно очищать временную папку.Подводя итог, можно сказать, что наиболее надежным методом для 1С 8.3 является сочетание формирования HTML с Base64 и последующего программного вызова BreakLink() через COM-объект. Это гарантирует, что конечный пользователь получит полноценный документ со всеми иллюстрациями, независимо от наличия доступа к исходным файлам картинок.