Разработка и редактирование печатных форм ценников и этикеток со штрихкодами — одна из регулярных задач при автоматизации торговых решений на платформе 1С:Предприятие. Однако разработчики часто сталкиваются с крайне неприятным поведением системы: при попытке уменьшить или увеличить размер цифр под штрихкодом в макете изменения визуально применяются, но после записи и запуска в пользовательском режиме шрифт упрямо сбрасывается к исходному размеру (обычно это размер 6). При повторном открытии обработки в Конфигураторе настройки также оказываются не сохраненными.
В рамках этой статьи мы подробно разберем, почему возникает данная проблема, проанализируем внутреннее устройство контейнеров рисунков макета и рассмотрим несколько надежных практических способов сохранения нужного размера шрифта штрихкода — как интерактивно в Конфигураторе, так и программно с помощью встроенного языка 1С.
Для генерации графического представления штрихкодов в более ранних конфигурациях 1С или самописных решениях традиционно используется специальная внешняя ActiveX-компонента «1С:Печать штрихкодов» (поставляемая в виде библиотеки 1CBarCode.exe). Платформа 1С интегрирует подобные OLE-объекты внутрь табличного документа макета через специальную оболочку-контейнер, имеющую тип «Рисунок».
Когда вы открываете форму свойств штрихкода двойным кликом или через контекстное меню OLE-объекта, вы настраиваете внутренние параметры внешнего ActiveX-компонента. Платформа 1С:Предприятие при этом «не догадывается», что внутри элемента управления произошли изменения: кнопка «Сохранить» в Конфигураторе остается неактивной, а у названия измененного объекта (отчета или обработки) не появляется символ модификации (звездочка *). При закрытии и повторном открытии макета платформа просто инициализирует компонент с параметрами по умолчанию.
Вторым ключевым фактором является свойство контейнера рисунка — «Из стиля». По умолчанию платформа пытается принудительно применить шрифтовое оформление текущего стиля табличного документа ко всем вложенным объектам, что приводит к аппаратному сбросу настроек размера шрифта непосредственно во время генерации печатной формы в пользовательском режиме.
Самый простой и быстрый способ решить проблему без программирования — правильно настроить свойства объекта и принудительно заставить платформу 1С сохранить изменения в конфигурации или внешней обработке. Разберем этот процесс по шагам:
Alt + Enter), чтобы открыть палитру свойств платформы 1С.Рисунок конкретный элемент управления — «Элемент управления 1С:Печать штрихкодов».*, сигнализирующий о модификации макета.Ctrl + S. Настройки успешно запишутся во внутреннюю структуру файла макета и больше не будут сбрасываться.В ситуациях, когда штрихкоды генерируются динамически или размер шрифта должен зависеть от длины выводимого артикула товара, оптимальным решением является программная установка параметров шрифта. Для этого используется обращение к COM-объекту ActiveX-компоненты через свойство рисунка Объект.
Для программного управления отображением символов штрихкода у компоненты существует специализированный метод УстановитьШрифт() (в англоязычном синтаксисе — SetFont). Проанализируем параметры данного метода:
"Arial", "Tahoma"). Если параметр не передан или передан пустой строкой, сохраняется текущий установленный шрифт.400, жирный (Bold) — 700.Истина / Ложь).Истина / Ложь).Истина / Ложь).Рассмотрим пример кода, в котором размер шрифта устанавливается программно. Обратите внимание: изменять свойства ActiveX-объекта необходимо строго после того, как область макета была выведена в результирующий табличный документ, иначе платформа заново инициализирует свойства контейнера по умолчанию во время выполнения метода Вывести().
// Функция формирования печатной формы с программным управлением шрифтом штрихкода
Функция ПечатьЭтикеткиСКодом(ВыбраннаяНоменклатура) Экспорт
ТабДокумент = Новый ТабличныйДокумент;
Макет = ПолучитьМакет("МакетЭтикетки");
ОбластьМакета = Макет.ПолучитьОбласть("ОбластьШтрихкод");
// Заполняем параметры штрихкода в исходной области макета
ОбластьМакета.Рисунки.Штрихкод.Объект.Сообщение = ВыбраннаяНоменклатура.Штрихкод;
// Выводим заполненную область в результирующий табличный документ
ТабДокумент.Вывести(ОбластьМакета);
// Обращаемся к рисунку в уже сформированном ТабДокументе!
// Устанавливаем шрифт Arial размером 4 пункта
ТабДокумент.Рисунки.Штрихкод.Объект.УстановитьШрифт("Arial", 4);
Возврат ТабДокумент;
КонецФункции
Если на вашем ценнике или этикетке выводится сразу несколько штрихкодов в цикле, наиболее рационально выполнить пакетный обход всех рисунков табличного документа перед отправкой на печать или отображением пользователю. Посмотрим на практическую реализацию этого алгоритма:
// Пакетный обход рисунков табличного документа для изменения шрифта всех штрихкодов
ТабДокумент = Новый ТабличныйДокумент;
// ... (Здесь происходит заполнение и вывод областей макета в ТабДокумент) ...
Для Каждого ТекущийРисунок Из ТабДокумент.Рисунки Цикл
// Проверяем тип объекта рисунка, чтобы исключить ошибки при обработке обычных картинок
Если ТипЗнч(ТекущийРисунок.Объект) = Тип("ActiveX") Тогда
// Программно устанавливаем размер шрифта 4 для текущей гарнитуры
ТекущийРисунок.Объект.УстановитьШрифт(, 4, 400);
КонецЕсли;
КонецЦикла;
В некоторых случаях (например, при использовании устаревших версий ОС Windows, терминального доступа или 64-разрядных клиентов 1С) ActiveX-компонента может искажать шрифт или обрезать цифры при сильном масштабировании. Для обхода этих ограничений можно использовать следующий изящный прием:
ОтображатьТекст = Ложь). Компонента будет рисовать только сами полосы штрихкода.Этот подход гарантирует стопроцентное совпадение шрифтов на любых принтерах и компьютерах клиентов, поскольку вывод цифр контролируется не внешней ActiveX-компонентой, а непосредственно платформой 1С:Предприятие.
В современных конфигурациях 1С (начиная с редакций на базе Библиотеки стандартных подсистем и Библиотеки подключаемого оборудования) разработчики полностью отказались от использования устаревшего формата ActiveX в макетах. Технология OLE/ActiveX жестко привязана к ОС Windows, не поддерживает работу в веб-клиентах, в среде Linux и часто вызывает критические ошибки платформы на 64-битных серверах.
Вместо этого применяется кроссплатформенная Native C++ компонента «1С:Печать штрихкодов». Логика работы с ней полностью решает проблемы несовместимости и сброса шрифтов:
Рассмотрим пример генерации штрихкода через Native-компоненту:
// Пример программного формирования картинки штрихкода с помощью Native-компоненты
ГенераторШК = ПодключитьВнешнююКомпонентуШтрихкода(); // Получение объекта компоненты 1С
ГенераторШК.Параметры.ОтображатьТекст = Истина;
ГенераторШК.Параметры.Шрифт = "Arial";
ГенераторШК.Параметры.РазмерШрифта = 9; // Размер шрифта задается напрямую в пикселях
// Получаем бинарные данные сгенерированного PNG-изображения штрихкода
ДвоичныеДанныеКартинки = ГенераторШК.ПолучитьИзображениеШтрихкода();
// Заполняем рисунок макета полученной картинкой
ОбластьМакета = Макет.ПолучитьОбласть("ОбластьЦенника");
ОбластьМакета.Рисунки.ИзображениеШтрихкода.Картинка = Новый Картинка(ДвоичныеДанныеКартинки);
// Настраиваем режим масштабирования рисунка для предотвращения искажений шрифта и полос:
ОбластьМакета.Рисунки.ИзображениеШтрихкода.РазмерКартинки = РазмерКартинки.Пропорционально;
Использование свойства РазмерКартинки.Пропорционально позволяет платформе 1С автоматически масштабировать штрихкод вместе с подписями под размеры отведенной области ценника, гарантируя высокое качество печати и отличное считывание штрихкода сканерами на кассовых узлах и складах.