Часто в практике разработки мы сталкиваемся с неочевидным поведением платформы. Разберем типичную ситуацию: при сохранении макета с штрихкодом в формат HTML вручную (через меню файла) картинка сохраняется корректно, создается папка с изображениями. Однако, если мы пытаемся сделать это программно, вызывая метод Записать для табличного документа, файл HTML и папка создаются, но сам файл картинки штрихкода оказывается пустым. При использовании формата HTML5 результат аналогичен — на странице отображается пустой фрейм. Проанализируем, почему так происходит и как правильно решить эту задачу.
Чтобы понять суть проблемы, рассмотрим механизмы рендеринга объектов в платформе. Если мы используем старую компоненту печати штрихкодов (например, элемент управления «1С:Печать штрихкодов» или Ocvita Barcode), мы имеем дело с технологией ActiveX (OLE-объектами).
При программном сохранении табличного документа в HTML, особенно если код выполняется на стороне сервера, платформа корректно обрабатывает только нативные графические элементы (обычные рисунки). Метод Записать не умеет автоматически конвертировать интерактивный OLE-объект в статичное изображение без участия графической подсистемы ОС. Устаревший элемент управления просто игнорируется, и на выходе мы получаем пустой квадрат. При ручном же сохранении 1С задействует клиентские интерфейсные механизмы Windows, поэтому картинка успевает сформироваться и сохраниться в папку.
В современных конфигурациях от устаревших ActiveX-компонент давно отказались. Разберем по шагам, как сейчас принято работать со штрихкодами. Современные решения используют нативную компоненту Native API (например, AddIn.КартинкаШтрихкода.Barcode или компоненту, хранящуюся в объекте ОбщийМакет.КомпонентаПечатиШтрихкодов).
Главное концептуальное отличие: мы больше не встраиваем саму компоненту в макет визуально. Мы используем её программно в фоне. Посмотрим, как это работает:
ПолучитьШтрихкод).ДвоичныеДанные, который содержит готовую картинку в формате PNG.Если наша конечная цель — получить правильный HTML со штрихкодом, выполним следующие действия. Мы берем полученные ДвоичныеДанные и помещаем их в реквизит Картинка самого обычного объекта Рисунок, который заранее добавлен в наш табличный документ (вместо старого OLE-объекта).
Такой рисунок является для платформы 1С «родным». Теперь, если мы программно сохраним этот табличный документ в формат HTML5, 1С без проблем сконвертирует картинку. Более того, при выборе HTML5 платформа закодирует изображение в строку Base64 и встроит её прямо в текст HTML-страницы. Никаких дополнительных папок создано не будет, а картинка будет гарантированно отображаться.
Как альтернативный вариант из прошлого, рассмотрим сохранение табличного документа в формат MHT (веб-архив). В этом формате и текст, и графика также инкапсулируются в один файл, что иногда помогало обойти проблемы с путями к картинкам, однако этот формат устарел и хуже поддерживается современными браузерами.
Зачастую пляски с HTML нужны лишь как промежуточный этап. Изначальная задача может состоять в том, чтобы вставить штрихкод из 1С в шаблон MS Word. Если попытаться встроить старый ActiveX-компонент напрямую в Word, мы получим ошибку. Современные версии MS Office жестко блокируют сторонние ActiveX из-за политик безопасности. Кроме того, возникают конфликты разрядности (например, 32-битная компонента штрихкода и 64-битный Word).
Рассмотрим два надежных способа переноса сгенерированного штрихкода в Word:
1. Использование COM-объекта (Word.Application)
В этом сценарии мы получаем сгенерированный штрихкод в виде картинки и временно сохраняем его на диск.
ДвоичныеДанные во временный файл с расширением PNG.InlineShapes.AddPicture, передавая ему путь к нашему временному файлу.2. Прямое редактирование XML (для формата DOCX)
Если мы хотим избежать использования COM-соединения (которое нестабильно работает на серверах и требует установленного MS Office), применим более технологичный метод. Файл с расширением DOCX по своей сути является ZIP-архивом.
ЧтениеZipФайла).word/media/.document.xml, прописывая нужные теги связи для вставленного изображения.ЗаписьZipФайла.Этот метод работает мгновенно, полностью на стороне сервера 1С и не зависит от капризов внешних приложений.
Подводя итог, откажемся от попыток заставить работать устаревшие элементы управления. Используем современные Native-компоненты для фоновой генерации изображений, после чего мы сможем без проблем выводить штрихкоды как в HTML (через Base64), так и в любые офисные документы.