Почему при программном сохранении макета 1С в HTML пропадает штрихкод и как правильно вставить его в MS Word?

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

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

Выясним причину: почему пропадает картинка?

Чтобы понять суть проблемы, рассмотрим механизмы рендеринга объектов в платформе. Если мы используем старую компоненту печати штрихкодов (например, элемент управления «1С:Печать штрихкодов» или Ocvita Barcode), мы имеем дело с технологией ActiveX (OLE-объектами).

При программном сохранении табличного документа в HTML, особенно если код выполняется на стороне сервера, платформа корректно обрабатывает только нативные графические элементы (обычные рисунки). Метод Записать не умеет автоматически конвертировать интерактивный OLE-объект в статичное изображение без участия графической подсистемы ОС. Устаревший элемент управления просто игнорируется, и на выходе мы получаем пустой квадрат. При ручном же сохранении 1С задействует клиентские интерфейсные механизмы Windows, поэтому картинка успевает сформироваться и сохраниться в папку.

Современный подход: переход от ActiveX к Native API

В современных конфигурациях от устаревших ActiveX-компонент давно отказались. Разберем по шагам, как сейчас принято работать со штрихкодами. Современные решения используют нативную компоненту Native API (например, AddIn.КартинкаШтрихкода.Barcode или компоненту, хранящуюся в объекте ОбщийМакет.КомпонентаПечатиШтрихкодов).

Главное концептуальное отличие: мы больше не встраиваем саму компоненту в макет визуально. Мы используем её программно в фоне. Посмотрим, как это работает:

  1. Мы передаем компоненте параметры: тип штрихкода, значение, ширину и высоту.
  2. Вызываем метод генерации (например, ПолучитьШтрихкод).
  3. Компонента математически рассчитывает линии и мгновенно возвращает нам объект ДвоичныеДанные, который содержит готовую картинку в формате PNG.

Решение проблемы с сохранением в HTML

Если наша конечная цель — получить правильный HTML со штрихкодом, выполним следующие действия. Мы берем полученные ДвоичныеДанные и помещаем их в реквизит Картинка самого обычного объекта Рисунок, который заранее добавлен в наш табличный документ (вместо старого OLE-объекта).

Такой рисунок является для платформы 1С «родным». Теперь, если мы программно сохраним этот табличный документ в формат HTML5, 1С без проблем сконвертирует картинку. Более того, при выборе HTML5 платформа закодирует изображение в строку Base64 и встроит её прямо в текст HTML-страницы. Никаких дополнительных папок создано не будет, а картинка будет гарантированно отображаться.

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

Вставка штрихкода в документ MS Word

Зачастую пляски с HTML нужны лишь как промежуточный этап. Изначальная задача может состоять в том, чтобы вставить штрихкод из 1С в шаблон MS Word. Если попытаться встроить старый ActiveX-компонент напрямую в Word, мы получим ошибку. Современные версии MS Office жестко блокируют сторонние ActiveX из-за политик безопасности. Кроме того, возникают конфликты разрядности (например, 32-битная компонента штрихкода и 64-битный Word).

Рассмотрим два надежных способа переноса сгенерированного штрихкода в Word:

1. Использование COM-объекта (Word.Application)

В этом сценарии мы получаем сгенерированный штрихкод в виде картинки и временно сохраняем его на диск.

  1. Генерируем штрихкод через Native-компоненту.
  2. Сохраняем объект ДвоичныеДанные во временный файл с расширением PNG.
  3. В шаблоне Word ставим текстовую закладку или картинку-заглушку.
  4. Через COM-соединение находим нужное место в документе.
  5. Используем метод Word API, например InlineShapes.AddPicture, передавая ему путь к нашему временному файлу.

2. Прямое редактирование XML (для формата DOCX)

Если мы хотим избежать использования COM-соединения (которое нестабильно работает на серверах и требует установленного MS Office), применим более технологичный метод. Файл с расширением DOCX по своей сути является ZIP-архивом.

  1. Программно распаковываем DOCX средствами 1С (используя ЧтениеZipФайла).
  2. Добавляем файл нашей картинки в директорию архива, обычно это word/media/.
  3. Корректируем внутренний файл document.xml, прописывая нужные теги связи для вставленного изображения.
  4. Запаковываем архив обратно с помощью ЗаписьZipФайла.

Этот метод работает мгновенно, полностью на стороне сервера 1С и не зависит от капризов внешних приложений.

Подводя итог, откажемся от попыток заставить работать устаревшие элементы управления. Используем современные Native-компоненты для фоновой генерации изображений, после чего мы сможем без проблем выводить штрихкоды как в HTML (через Base64), так и в любые офисные документы.

← На главную