Проблема некорректной генерации и печати штрихкодов в среде Linux для пользователей 1С является классической. Часто программисты сталкиваются с тем, что один и тот же код в Windows выдает валидный штрихкод, а в Linux — нечитаемую «кашу» или визуально похожий, но не распознаваемый сканером объект. Разберем детально, почему это происходит и как настроить стабильную работу системы.
Проанализируем ситуацию, когда в Windows получается 13 цифр штрихкода, а в Linux — всего 8. Шрифты типа EANBwrP36Tt или EAN13 не являются обычными наборами цифр. Для того чтобы они превратились в штрихкод, строка должна пройти предварительную подготовку (контрольный символ, стартовые и стоповые маркеры, замена цифр на специальные символы из таблицы шрифта).
Выясним причину сбоя: в Linux-версии 1С используется кодировка UTF-8, в то время как Windows-клиент часто полагается на ANSI/Windows-1251. Когда код формирования строки использует функцию Символ() для получения спецсимвола штрихкода, в Linux этот символ может интерпретироваться как двухбайтовый. В результате структура строки ломается, и вместо одного графического элемента штрихкода драйвер печати пытается вывести «нечто», что шрифт не может распознать.
Рекомендация: Если вы планируете продолжать использовать шрифты, необходимо переписать алгоритм формирования строки, исключив зависимость от системной кодировки, либо использовать двоичные данные для формирования строки штрихкода. Однако, как показывает практика, это самый тупиковый путь.
Рассмотрим, почему визуально похожие штрихкоды могут не считываться. В Linux за отрисовку шрифтов отвечает библиотека FreeType. В отличие от Windows-движка, она активно применяет антиалиасинг (сглаживание) и хинтинг.
Для исправления этого на уровне системы (если нельзя отказаться от шрифта) попробуем отключить сглаживание для конкретного шрифта в конфигах FontConfig, но это трудоемкое решение, которое придется повторять на каждом рабочем месте или сервере печати.
Самым надежным способом в экосистеме 1С является использование штатной внешней компоненты 1CBarCode. Важно помнить, что для Linux существует версия этой библиотеки с расширением .so. Рассмотрим преимущества этого метода:
Посмотрим на пример логики подключения компоненты:
// Установка и подключение компоненты
УстановитьВнешнююКомпоненту("ОбщийМакет.КомпонентаПечатиШтрихкодов");
ПодключитьВнешнююКомпоненту("ОбщийМакет.КомпонентаПечатиШтрихкодов", "BarCode", ТипВнешнейКомпоненты.Native);
ОбъектШК = Новый("AddIn.BarCode.Barcode");
// Настройка параметров
ОбъектШК.ТипКода = 1; // EAN13
ОбъектШК.Сообщение = "4601234567890";
// Получение картинки
КартинкаШК = ОбъектШК.ПолучитьШтрихкод();
Если штатные компоненты работают нестабильно (например, на специфических дистрибутивах Debian или CentOS), проанализируем использование Zint. Это open-source решение, признанное стандартом в Linux-сообществе. Оно позволяет генерировать штрихкод через командную строку и сохранять его в файл, который затем легко подтянуть в 1С.
Разберем по шагам реализацию через Zint:
sudo apt-get install zint.Пример кода для вызова Zint из 1С:
ИмяФайла = ПолучитьИмяВременногоФайла("png");
ТекстКоманды = "zint --data=""" + ЗначениеШК + """ --output=""" + ИмяФайла + """ -b 13"; // -b 13 это EAN-13
// Запускаем приложение синхронно
ЗапуститьПриложение(ТекстКоманды, , Истина);
Если ФайлСуществует(ИмяФайла) Тогда
Картинка = Новый Картинка(ИмяФайла);
// Помещаем картинку в область макета
ОбластьМакета.Рисунки.Штрихкод.Картинка = Картинка;
КонецЕсли;
Если бизнес-процесс жестко завязан на использовании шрифтов и переписывание кода невозможно, выясним, как «оживить» шрифт в системе. Проблема часто кроется в отсутствии оригинальных метрик Microsoft. Попробуем выполнить следующие действия:
sudo apt-get install ttf-mscorefonts-installer.EANBwrP36Tt.ttf непосредственно в папку /usr/share/fonts/truetype/ и выполните команду fc-cache -fv.Проанализировав ситуацию, мы видим, что использование шрифтов для штрихкодов под Linux — это «технология из прошлого», которая порождает слишком много переменных (кодировки, версии FreeType, настройки FontConfig).
Главный совет: Переходите на генерацию штрихкода как объекта «Картинка». Это гарантирует, что ваш штрихкод будет считан любым сканером, независимо от того, на каком сервере (Windows или Linux) сформирована печатная форма. Использование Native-компоненты 1С или утилиты Zint является промышленным стандартом разработки в современных реалиях.