Разработка и Конфигурация · 12 мин
Как преобразовать текст в картинку в 1С
Как преобразовать текст в картинку в 1С: рисование на объекте Картинка, генерация штрихкодов, внешние компоненты. Примеры кода, проверка результата, ошибки.
Задача преобразовать текст в картинку в 1С возникает чаще, чем кажется: нужно нанести подпись на изображение товара, сформировать этикетку с наименованием и ценой, сгенерировать штрихкод из строки, добавить водяной знак на скан документа или подготовить изображение для отправки в мессенджер. Встроенного оператора «текст в картинку» в языке 1С нет, поэтому задача решается несколькими обходными путями — от штатных объектов платформы до внешних компонент.
Выбор способа зависит от контекста: тонкий это клиент или сервер, нужна ли кроссплатформенность (Windows/Linux), какой формат результата требуется (PNG, JPEG, Base64 для передачи по HTTP) и насколько сложное оформление текста нужно — шрифт, размер, цвет, поворот. Ниже разобраны рабочие подходы с примерами кода, их ограничения и типичные ошибки.
Определите, какая именно задача стоит перед вами
Под формулировкой «текст в картинку» скрываются четыре разных сценария, и у каждого свой оптимальный инструмент. Первый — нанести текст на существующее изображение (подпись на фото товара, водяной знак). Второй — создать картинку с нуля, где текст — единственное содержимое (бейдж, плашка с артикулом). Третий — превратить строку в машиночитаемый код: штрихкод EAN-13, QR-код, DataMatrix для маркировки. Четвёртый — отрисовать многострочный форматированный текст, например карточку товара для выгрузки на маркетплейс.
Для штрихкодов и QR-кодов используйте штатную компоненту «1С:Библиотека генерации штрихкодов» — она входит в типовые конфигурации и работает на всех платформах. Для нанесения текста на изображение штатных средств мало, и приходится выбирать между HTML-полем, серверными утилитами и внешними компонентами. Ошибка на этом этапе — начать писать сложный механизм там, где задача решалась бы штатным генератором штрихкодов.
Как выбрать подход
Способ 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 Тогда
ВызватьИсключение "Ошибка генерации изображения, код " + КодВозврата;
КонецЕсли;
Два критичных момента безопасности. Первый: текст, подставляемый в команду, нужно экранировать — если в нём встретятся кавычки или спецсимволы оболочки, команда сломается или, хуже, выполнит посторонний код. Второй: запуск внешних приложений может быть запрещён настройками безопасности кластера или профилем безопасности, поэтому в сервисных и облачных режимах этот способ часто недоступен.
Способ 4. COM и внешние компоненты на Windows
На Windows-сервере или толстом клиенте можно задействовать COM-объекты, например WIA (Windows Image Acquisition) или обёртки над GDI+, а также самописные внешние компоненты по технологии Native API. Через GDI+ доступны качественное сглаживание текста, любые системные шрифты и точное позиционирование — это даёт результат типографского качества, чего сложно добиться простыми средствами.
Обратная сторона — жёсткая привязка к Windows и разрядности: внешняя компонента, собранная под x64, не загрузится в 32-разрядном клиенте, и наоборот. Если инфраструктура смешанная (сервер Linux, клиенты Windows), придётся поддерживать две ветки кода или выбирать кроссплатформенный способ. Для новых разработок COM-подход стоит рассматривать только когда другие варианты не дают нужного качества отрисовки.
Сравнение способов
Штатно, кроссплатформенно, но только машиночитаемые коды — произвольный текст не нарисовать
Гибкое оформление без установки ПО, но только на клиенте и с ограничениями браузерного движка
Пакетная обработка и богатые возможности, но требует установки утилиты, прав и экранирования команд
Высокое качество текста, но только 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, который сам переносит текст по заданной ширине.