Как изменить размер шрифта в штрихкоде 1С, если изменения не сохраняются?

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

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

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

Выясняем причину: почему сбрасываются настройки шрифта?

Для генерации графического представления штрихкодов в более ранних конфигурациях 1С или самописных решениях традиционно используется специальная внешняя ActiveX-компонента «1С:Печать штрихкодов» (поставляемая в виде библиотеки 1CBarCode.exe). Платформа 1С интегрирует подобные OLE-объекты внутрь табличного документа макета через специальную оболочку-контейнер, имеющую тип «Рисунок».

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

Вторым ключевым фактором является свойство контейнера рисунка — «Из стиля». По умолчанию платформа пытается принудительно применить шрифтовое оформление текущего стиля табличного документа ко всем вложенным объектам, что приводит к аппаратному сбросу настроек размера шрифта непосредственно во время генерации печатной формы в пользовательском режиме.

Способ 1. Интерактивная настройка свойств макета в Конфигураторе

Самый простой и быстрый способ решить проблему без программирования — правильно настроить свойства объекта и принудительно заставить платформу 1С сохранить изменения в конфигурации или внешней обработке. Разберем этот процесс по шагам:

  1. Откройте макет вашего отчета или обработки в Конфигураторе.
  2. Выделите область рисунка штрихкода кликом мыши.
  3. Нажмите правую кнопку мыши и выберите пункт «Свойства» (или используйте горячие клавиши Alt + Enter), чтобы открыть палитру свойств платформы 1С.
  4. Важный нюанс: в самом верху открывшейся палитры свойств в выпадающем списке объектов выберите вместо стандартного типа Рисунок конкретный элемент управления — «Элемент управления 1С:Печать штрихкодов».
  5. Найдите свойство «Из стиля» в разделе оформления и обязательно снимите этот флаг (снимите галочку). Это отключит автоматическое переопределение шрифта платформой.
  6. Теперь настройте требуемый размер шрифта в свойствах ActiveX-компоненты (например, укажите размер 4).
  7. Чтобы принудительно зафиксировать изменения в файле обработки, внесите любое мелкое «фиктивное» изменение в сам табличный документ макета: например, измените ширину пустой колонки на один пиксель или введите символ в любую свободную ячейку и тут же сотрите его. Вы заметите, что у заголовка окна обработки появился символ звездочки *, сигнализирующий о модификации макета.
  8. Сохраните обработку сочетанием клавиш Ctrl + S. Настройки успешно запишутся во внутреннюю структуру файла макета и больше не будут сбрасываться.

Способ 2. Программное изменение шрифта при выводе печатной формы

В ситуациях, когда штрихкоды генерируются динамически или размер шрифта должен зависеть от длины выводимого артикула товара, оптимальным решением является программная установка параметров шрифта. Для этого используется обращение к COM-объекту ActiveX-компоненты через свойство рисунка Объект.

Для программного управления отображением символов штрихкода у компоненты существует специализированный метод УстановитьШрифт() (в англоязычном синтаксисе — SetFont). Проанализируем параметры данного метода:

  1. ИмяШрифта (тип Строка) — название гарнитуры (например, "Arial", "Tahoma"). Если параметр не передан или передан пустой строкой, сохраняется текущий установленный шрифт.
  2. РазмерШрифта (тип Число) — размер текста в пунктах (например, 4, 6, 10).
  3. ТолщинаШрифта (тип Число) — плотность текста. Обычный шрифт имеет значение 400, жирный (Bold) — 700.
  4. НаклонныйШрифт (тип Булево) — флаг курсива (Истина / Ложь).
  5. ПеречеркнутыйШрифт (тип Булево) — флаг перечеркнутого начертания (Истина / Ложь).
  6. ПодстрочныйШрифт (тип Булево) — флаг подстрочного начертания (Истина / Ложь).

Рассмотрим пример кода, в котором размер шрифта устанавливается программно. Обратите внимание: изменять свойства ActiveX-объекта необходимо строго после того, как область макета была выведена в результирующий табличный документ, иначе платформа заново инициализирует свойства контейнера по умолчанию во время выполнения метода Вывести().


// Функция формирования печатной формы с программным управлением шрифтом штрихкода
Функция ПечатьЭтикеткиСКодом(ВыбраннаяНоменклатура) Экспорт

    ТабДокумент = Новый ТабличныйДокумент;
    Макет = ПолучитьМакет("МакетЭтикетки");
    ОбластьМакета = Макет.ПолучитьОбласть("ОбластьШтрихкод");
    
    // Заполняем параметры штрихкода в исходной области макета
    ОбластьМакета.Рисунки.Штрихкод.Объект.Сообщение = ВыбраннаяНоменклатура.Штрихкод;
    
    // Выводим заполненную область в результирующий табличный документ
    ТабДокумент.Вывести(ОбластьМакета);
    
    // Обращаемся к рисунку в уже сформированном ТабДокументе!
    // Устанавливаем шрифт Arial размером 4 пункта
    ТабДокумент.Рисунки.Штрихкод.Объект.УстановитьШрифт("Arial", 4);
    
    Возврат ТабДокумент;

КонецФункции

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


// Пакетный обход рисунков табличного документа для изменения шрифта всех штрихкодов
ТабДокумент = Новый ТабличныйДокумент;
// ... (Здесь происходит заполнение и вывод областей макета в ТабДокумент) ...

Для Каждого ТекущийРисунок Из ТабДокумент.Рисунки Цикл
    // Проверяем тип объекта рисунка, чтобы исключить ошибки при обработке обычных картинок
    Если ТипЗнч(ТекущийРисунок.Объект) = Тип("ActiveX") Тогда
        // Программно устанавливаем размер шрифта 4 для текущей гарнитуры
        ТекущийРисунок.Объект.УстановитьШрифт(, 4, 400);
    КонецЕсли;
КонецЦикла;

Способ 3. Вывод штрихкода без текста и ручное форматирование

В некоторых случаях (например, при использовании устаревших версий ОС Windows, терминального доступа или 64-разрядных клиентов 1С) ActiveX-компонента может искажать шрифт или обрезать цифры при сильном масштабировании. Для обхода этих ограничений можно использовать следующий изящный прием:

  1. В макете выделите рисунок штрихкода, перейдите в его свойства и полностью отключите визуальное отображение текста (снимите флаг «Отображать текст» или программно присвойте свойству ОтображатьТекст = Ложь). Компонента будет рисовать только сами полосы штрихкода.
  2. В макете непосредственно под рисунком штрихкода объедините ячейки таблицы в одну строку по ширине рисунка.
  3. Настройте для этой объединенной строки стандартные параметры шрифта 1С (любая гарнитура, точный размер, например 5 или 6 пунктов, выравнивание по центру).
  4. При выводе печатной формы передавайте текстовое представление штрихкода напрямую в эту ячейку табличного документа как обычную строку данных.

Этот подход гарантирует стопроцентное совпадение шрифтов на любых принтерах и компьютерах клиентов, поскольку вывод цифр контролируется не внешней ActiveX-компонентой, а непосредственно платформой 1С:Предприятие.

Современное решение: переход на Native-компоненту 1С

В современных конфигурациях 1С (начиная с редакций на базе Библиотеки стандартных подсистем и Библиотеки подключаемого оборудования) разработчики полностью отказались от использования устаревшего формата ActiveX в макетах. Технология OLE/ActiveX жестко привязана к ОС Windows, не поддерживает работу в веб-клиентах, в среде Linux и часто вызывает критические ошибки платформы на 64-битных серверах.

Вместо этого применяется кроссплатформенная Native C++ компонента «1С:Печать штрихкодов». Логика работы с ней полностью решает проблемы несовместимости и сброса шрифтов:

Рассмотрим пример генерации штрихкода через Native-компоненту:


// Пример программного формирования картинки штрихкода с помощью Native-компоненты
ГенераторШК = ПодключитьВнешнююКомпонентуШтрихкода(); // Получение объекта компоненты 1С
ГенераторШК.Параметры.ОтображатьТекст = Истина;
ГенераторШК.Параметры.Шрифт = "Arial";
ГенераторШК.Параметры.РазмерШрифта = 9; // Размер шрифта задается напрямую в пикселях

// Получаем бинарные данные сгенерированного PNG-изображения штрихкода
ДвоичныеДанныеКартинки = ГенераторШК.ПолучитьИзображениеШтрихкода();

// Заполняем рисунок макета полученной картинкой
ОбластьМакета = Макет.ПолучитьОбласть("ОбластьЦенника");
ОбластьМакета.Рисунки.ИзображениеШтрихкода.Картинка = Новый Картинка(ДвоичныеДанныеКартинки);

// Настраиваем режим масштабирования рисунка для предотвращения искажений шрифта и полос:
ОбластьМакета.Рисунки.ИзображениеШтрихкода.РазмерКартинки = РазмерКартинки.Пропорционально;

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

← На главную