Почему не считывается штрихкод, сгенерированный в 1С на Linux, и как это исправить?

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

Проблема некорректной генерации и печати штрихкодов в среде Linux для пользователей 1С является классической. Часто программисты сталкиваются с тем, что один и тот же код в Windows выдает валидный штрихкод, а в Linux — нечитаемую «кашу» или визуально похожий, но не распознаваемый сканером объект. Разберем детально, почему это происходит и как настроить стабильную работу системы.

Причина №1: Кодировка и преобразование символов в UTF-8

Проанализируем ситуацию, когда в Windows получается 13 цифр штрихкода, а в Linux — всего 8. Шрифты типа EANBwrP36Tt или EAN13 не являются обычными наборами цифр. Для того чтобы они превратились в штрихкод, строка должна пройти предварительную подготовку (контрольный символ, стартовые и стоповые маркеры, замена цифр на специальные символы из таблицы шрифта).

Выясним причину сбоя: в Linux-версии 1С используется кодировка UTF-8, в то время как Windows-клиент часто полагается на ANSI/Windows-1251. Когда код формирования строки использует функцию Символ() для получения спецсимвола штрихкода, в Linux этот символ может интерпретироваться как двухбайтовый. В результате структура строки ломается, и вместо одного графического элемента штрихкода драйвер печати пытается вывести «нечто», что шрифт не может распознать.

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

Причина №2: Особенности рендеринга FreeType и хинтинг

Рассмотрим, почему визуально похожие штрихкоды могут не считываться. В Linux за отрисовку шрифтов отвечает библиотека FreeType. В отличие от Windows-движка, она активно применяет антиалиасинг (сглаживание) и хинтинг.

  1. Сглаживание: Тонкие линии штрихкода размываются на краях, добавляя серые пиксели. Для лазерного сканера это критично: он видит изменение ширины полосы, что делает код невалидным.
  2. Межсимвольный интервал: Linux может иначе рассчитывать метрики шрифта, добавляя микро-разрывы между символами штрихкода. Сканер воспринимает такие разрывы как часть данных.

Для исправления этого на уровне системы (если нельзя отказаться от шрифта) попробуем отключить сглаживание для конкретного шрифта в конфигах FontConfig, но это трудоемкое решение, которое придется повторять на каждом рабочем месте или сервере печати.

Решение №1: Использование Native-компоненты «1С:Печать штрихкодов»

Самым надежным способом в экосистеме 1С является использование штатной внешней компоненты 1CBarCode. Важно помнить, что для Linux существует версия этой библиотеки с расширением .so. Рассмотрим преимущества этого метода:

Посмотрим на пример логики подключения компоненты:


// Установка и подключение компоненты
УстановитьВнешнююКомпоненту("ОбщийМакет.КомпонентаПечатиШтрихкодов");
ПодключитьВнешнююКомпоненту("ОбщийМакет.КомпонентаПечатиШтрихкодов", "BarCode", ТипВнешнейКомпоненты.Native);
ОбъектШК = Новый("AddIn.BarCode.Barcode");
// Настройка параметров
ОбъектШК.ТипКода = 1; // EAN13
ОбъектШК.Сообщение = "4601234567890";
// Получение картинки
КартинкаШК = ОбъектШК.ПолучитьШтрихкод();

Решение №2: Использование утилиты Zint (самый мощный метод для Linux)

Если штатные компоненты работают нестабильно (например, на специфических дистрибутивах Debian или CentOS), проанализируем использование Zint. Это open-source решение, признанное стандартом в Linux-сообществе. Оно позволяет генерировать штрихкод через командную строку и сохранять его в файл, который затем легко подтянуть в 1С.

Разберем по шагам реализацию через Zint:

  1. Установим утилиту в систему: sudo apt-get install zint.
  2. В коде 1С сформируем команду для генерации файла.
  3. Загрузим полученную картинку в табличный документ.

Пример кода для вызова Zint из 1С:


ИмяФайла = ПолучитьИмяВременногоФайла("png");
ТекстКоманды = "zint --data=""" + ЗначениеШК + """ --output=""" + ИмяФайла + """ -b 13"; // -b 13 это EAN-13
// Запускаем приложение синхронно
ЗапуститьПриложение(ТекстКоманды, , Истина);

Если ФайлСуществует(ИмяФайла) Тогда
    Картинка = Новый Картинка(ИмяФайла);
    // Помещаем картинку в область макета
    ОбластьМакета.Рисунки.Штрихкод.Картинка = Картинка;
КонецЕсли;

Решение №3: Настройка системных шрифтов в Debian

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

  1. Установим пакет основных шрифтов Microsoft: sudo apt-get install ttf-mscorefonts-installer.
  2. Скопируйте файл EANBwrP36Tt.ttf непосредственно в папку /usr/share/fonts/truetype/ и выполните команду fc-cache -fv.
  3. В настройках печати 1С убедитесь, что масштаб страницы установлен в 100%, так как любое масштабирование в Linux (даже 101%) мгновенно превращает штрихкод в нечитаемый набор линий из-за интерполяции.

Итог и рекомендации

Проанализировав ситуацию, мы видим, что использование шрифтов для штрихкодов под Linux — это «технология из прошлого», которая порождает слишком много переменных (кодировки, версии FreeType, настройки FontConfig).

Главный совет: Переходите на генерацию штрихкода как объекта «Картинка». Это гарантирует, что ваш штрихкод будет считан любым сканером, независимо от того, на каком сервере (Windows или Linux) сформирована печатная форма. Использование Native-компоненты 1С или утилиты Zint является промышленным стандартом разработки в современных реалиях.

← На главную