К статье
Практический материал

Разработка и Конфигурация · 12 мин

Как преобразовать текст в картинку в 1С

Как преобразовать текст в картинку в 1С: рисование на объекте Картинка, генерация штрихкодов, внешние компоненты. Примеры кода, проверка результата, ошибки.

Задача преобразовать текст в картинку в 1С возникает чаще, чем кажется: нужно нанести подпись на изображение товара, сформировать этикетку с наименованием и ценой, сгенерировать штрихкод из строки, добавить водяной знак на скан документа или подготовить изображение для отправки в мессенджер. Встроенного оператора «текст в картинку» в языке 1С нет, поэтому задача решается несколькими обходными путями — от штатных объектов платформы до внешних компонент.

Выбор способа зависит от контекста: тонкий это клиент или сервер, нужна ли кроссплатформенность (Windows/Linux), какой формат результата требуется (PNG, JPEG, Base64 для передачи по HTTP) и насколько сложное оформление текста нужно — шрифт, размер, цвет, поворот. Ниже разобраны рабочие подходы с примерами кода, их ограничения и типичные ошибки.

Определите, какая именно задача стоит перед вами

Под формулировкой «текст в картинку» скрываются четыре разных сценария, и у каждого свой оптимальный инструмент. Первый — нанести текст на существующее изображение (подпись на фото товара, водяной знак). Второй — создать картинку с нуля, где текст — единственное содержимое (бейдж, плашка с артикулом). Третий — превратить строку в машиночитаемый код: штрихкод EAN-13, QR-код, DataMatrix для маркировки. Четвёртый — отрисовать многострочный форматированный текст, например карточку товара для выгрузки на маркетплейс.

Для штрихкодов и QR-кодов используйте штатную компоненту «1С:Библиотека генерации штрихкодов» — она входит в типовые конфигурации и работает на всех платформах. Для нанесения текста на изображение штатных средств мало, и приходится выбирать между HTML-полем, серверными утилитами и внешними компонентами. Ошибка на этом этапе — начать писать сложный механизм там, где задача решалась бы штатным генератором штрихкодов.

Маршрут решения

Как выбрать подход

Нужен штрихкод, QR-код или DataMatrix из строкиИспользуйте штатную компоненту генерации штрихкодов (менеджер оборудования или макет компоненты)
Нужно подписать картинку текстом на клиенте без сервераОтрисуйте через поле HTML-документа (SVG/canvas) и заберите результат как Base64
Обработка идёт на сервере под Linux или нужна пакетная обработкаВызывайте ImageMagick или аналогичную утилиту через КомандаСистемы/ЗапуститьПриложение
Сервер на Windows и нужен простой вывод текстаРассмотрите COM-объекты или .NET-сборку через внешнюю компоненту

Способ 1. Штатная компонента генерации штрихкодов

Если цель — превратить строку в QR-код или линейный штрихкод, это самый простой и надёжный путь. В типовых конфигурациях (УТ, ERP, Розница, БП) компонента подключается из макета, а в БСП есть готовый программный интерфейс. Результат возвращается как двоичные данные картинки, которые можно сохранить в файл, поместить в реквизит хранилища значений или вывести в табличный документ.

Типовой фрагмент кода выглядит так:

// Для конфигураций на БСП

ПараметрыШтрихкода = ГенерацияШтрихкодов.ПараметрыГенерацииШтрихкода();

ПараметрыШтрихкода.Штрихкод = "4607025392119";

ПараметрыШтрихкода.ТипКода = 2; // QR-код

ПараметрыШтрихкода.Ширина = 200;

ПараметрыШтрихкода.Высота = 200;

Результат = ГенерацияШтрихкодов.ИзображениеШтрихкода(ПараметрыШтрихкода);

Если Результат.Результат Тогда

ДвоичныеДанные = Результат.ДвоичныеДанные;

ДвоичныеДанные.Записать("C:\Temp\qrcode.png");

КонецЕсли;

Обратите внимание: тип кода задаётся числом, и набор поддерживаемых типов зависит от версии компоненты. Если компонента не подключилась (например, на Linux-сервере лежит макет только с Windows-версией), метод вернёт описание ошибки — его обязательно нужно проверять, а не считывать картинку «вслепую».

Способ 2. Рисование текста через поле HTML-документа

Когда нужен произвольный текст с оформлением, а внешние средства подключать нельзя, рабочий приём — сформировать HTML с SVG или canvas, отобразить его в поле HTML-документа и получить картинку обратно. SVG особенно удобен: текст, шрифт, размер, цвет и поворот задаются декларативно, а результат можно сразу конвертировать.

Принцип такой: формируете строку SVG с элементом <text>, передаёте её в браузерный движок, там JavaScript отрисовывает SVG на canvas и возвращает data URL в формате PNG. В 1С остаётся отрезать префикс «data:image/png;base64,» и декодировать строку через Base64Значение(). На тонком клиенте с режимом использования поля HTML «Internet Explorer» возможности canvas ограничены, поэтому для веб-клиента и тонкого клиента с WebKit этот способ работает надёжнее.

// Фрагмент: сборка SVG с текстом

ТекстSVG = "<svg xmlns='http://www.w3.org/2000/svg' width='400' height='120'>"

+ "<rect width='100%' height='100%' fill='white'/>"

+ "<text x='20' y='70' font-family='Arial' font-size='36' fill='black'>"

+ "Артикул: ТР-00125"

+ "</text></svg>";

Главное ограничение способа — зависимость от браузерного движка клиента. На сервере 1С поле HTML-документа недоступно, поэтому для регламентных заданий и серверной пакетной обработки этот путь не подходит.

Способ 3. Внешние утилиты на сервере (ImageMagick и аналоги)

Для серверной и пакетной обработки самый гибкий вариант — вызвать консольную утилиту обработки изображений. ImageMagick позволяет одной командой создать картинку с текстом или нанести подпись на существующее изображение, при этом поддерживает шрифты, обводку, поворот и прозрачность. Утилита должна быть установлена на сервере 1С, а у пользователя, под которым работает агент сервера, — права на её запуск и на каталог временных файлов.

Команда = "magick -size 600x200 xc:white "

+ "-font Arial -pointsize 48 -fill black "

+ "-gravity center -annotate 0 ""Номенклатура: Кабель ВВГ 3х2.5"" "

+ """/tmp/label_"" + Идентификатор + ".png""";

КодВозврата = Неопределено;

ЗапуститьПриложение(Команда, "/tmp", Истина, КодВозврата);

Если КодВозврата <> 0 Тогда

ВызватьИсключение "Ошибка генерации изображения, код " + КодВозврата;

КонецЕсли;

Два критичных момента безопасности. Первый: текст, подставляемый в команду, нужно экранировать — если в нём встретятся кавычки или спецсимволы оболочки, команда сломается или, хуже, выполнит посторонний код. Второй: запуск внешних приложений может быть запрещён настройками безопасности кластера или профилем безопасности, поэтому в сервисных и облачных режимах этот способ часто недоступен.

Типичные ошибки
01
Подстановка пользовательского текста в командную строку без экранирования — команда падает или возникает уязвимость инъекции
02
Запуск утилиты без ожидания завершения (параметр ДождатьсяЗавершения = Ложь) — файл читается раньше, чем создан
03
Игнорирование кода возврата — при отсутствии утилиты или прав ошибка остаётся незамеченной, а в базе появляются пустые файлы
04
Использование относительных путей — рабочий каталог агента сервера непредсказуем, всегда указывайте абсолютные пути

Способ 4. COM и внешние компоненты на Windows

На Windows-сервере или толстом клиенте можно задействовать COM-объекты, например WIA (Windows Image Acquisition) или обёртки над GDI+, а также самописные внешние компоненты по технологии Native API. Через GDI+ доступны качественное сглаживание текста, любые системные шрифты и точное позиционирование — это даёт результат типографского качества, чего сложно добиться простыми средствами.

Обратная сторона — жёсткая привязка к Windows и разрядности: внешняя компонента, собранная под x64, не загрузится в 32-разрядном клиенте, и наоборот. Если инфраструктура смешанная (сервер Linux, клиенты Windows), придётся поддерживать две ветки кода или выбирать кроссплатформенный способ. Для новых разработок COM-подход стоит рассматривать только когда другие варианты не дают нужного качества отрисовки.

Сравнение способов

Компонента штрихкодов

Штатно, кроссплатформенно, но только машиночитаемые коды — произвольный текст не нарисовать

Поле HTML + SVG/canvas

Гибкое оформление без установки ПО, но только на клиенте и с ограничениями браузерного движка

ImageMagick на сервере

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

COM/GDI+ на Windows

Высокое качество текста, но только Windows и только там, где разрешены COM-объекты

Сохранение и передача результата

Полученную картинку обычно требуется куда-то деть: записать в файл, в реквизит типа ХранилищеЗначения, прикрепить к элементу справочника через механизм присоединённых файлов БСП или отправить по HTTP. Для хранения в базе используйте двоичные данные, а не путь к файлу — файл на диске сервера недоступен клиенту и может быть удалён очисткой временных каталогов.

Для передачи во внешние системы картинку кодируют в Base64: функция Base64Строка(ДвоичныеДанные) даёт строку, которую легко вложить в JSON. Помните, что Base64 увеличивает объём примерно на треть — для больших изображений лучше передавать файл телом POST-запроса. Перед сохранением в базу имеет смысл ограничить размер картинки: PNG с крупным текстом обычно занимает немного, но фото с нанесённой подписью могут весить мегабайты и раздувать базу.

Проверка результата и диагностика проблем

После внедрения любого из способов проверьте результат на контрольном наборе: короткий текст, длинный текст с переносом, кириллица, спецсимволы (амперсанд, кавычки, знак «№»). Кириллица — классический источник проблем: в ImageMagick шрифт по умолчанию может не содержать русских глифов, а в SVG текст может «поехать» из-за неверной кодировки строки.

Контрольные точки

Как проверить результат

Отображение кириллицы
Норма

Русские буквы читаемы, без квадратов и знаков вопроса

Тревожный признак

Квадраты или пустое место — шрифт без кириллицы или неверная кодировка

Размер файла
Норма

Файл открывается графическим просмотрщиком, размер больше нуля

Тревожный признак

Файл нулевого размера или не открывается — генерация завершилась ошибкой

Длинный текст
Норма

Весь текст помещается в границы картинки

Тревожный признак

Текст обрезан — нужно увеличить холст или уменьшить кегль

Повторный запуск
Норма

Каждый запуск даёт корректную новую картинку

Тревожный признак

Возвращается старая или пустая картинка — проблема кэширования или асинхронности

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

Итог

Что важно запомнить

Штрихкоды и QR-коды делайте штатной компонентой, подписи на клиенте — через HTML/SVG, пакетную обработку — серверной утилитой с обязательным экранированием команд и проверкой кода возврата. Всегда проверяйте кириллицу, длинный текст и повторные запуски, а результат храните как двоичные данные, а не как путь к файлу.

Частые вопросы

Можно ли преобразовать текст в картинку полностью штатными средствами 1С без компонент?

Напрямую — нет: в языке нет объекта для растрового рисования текста. Ближайшие штатные варианты — компонента генерации штрихкодов (только коды) и поле HTML-документа с отрисовкой через SVG/canvas на клиенте. Для полноценного нанесения текста на изображение потребуется внешний инструмент.

Почему в сгенерированной картинке вместо русского текста квадраты?

Причина почти всегда в шрифте: указанный шрифт не содержит кириллических глифов или не найден системой. Укажите явно шрифт с поддержкой кириллицы (например, DejaVu Sans на Linux), а в ImageMagick проверьте кодировку передаваемой строки — она должна соответствовать ожиданиям утилиты.

Как вывести картинку с текстом в табличный документ?

Поместите двоичные данные в объект Картинка, затем вставьте её в область табличного документа через коллекцию Рисунки с привязкой к ячейке. Размеры рисунка задаются в единицах табличного документа, поэтому пропорции исходного изображения стоит сохранять заранее.

Работает ли генерация картинок в регламентном задании на сервере?

Да, но только серверными способами: компонентой штрихкодов или внешней утилитой. Поле HTML-документа и любые клиентские объекты в фоновом задании недоступны. Также проверьте, что профиль безопасности кластера разрешает запуск внешних приложений, если используете ImageMagick.

Как передать картинку из 1С на сайт или в мессенджер?

Стандартный путь — HTTP-запрос: либо двоичные данные телом POST, либо строка Base64 внутри JSON, если API принимает такой формат. Для Base64 используйте функцию Base64Строка(), но учитывайте рост объёма примерно на треть — для больших файлов предпочтительнее бинарная передача.

Что делать, если текст динамический и не помещается на картинку?

Реализуйте автоуменьшение кегля: начинайте с максимального размера шрифта и уменьшайте его, пока расчётная ширина текста не впишется в холст. В SVG ширину можно оценить через JavaScript, в ImageMagick — через режим caption, который сам переносит текст по заданной ширине.