Почему штрихкод отображается в предварительном просмотре 1С, но не печатается на принтере?

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей Торговля и дистрибуция
← На главную

При работе в классических конфигурациях «1С:Предприятие» на обычных формах (таких как «Управление торговлей 10.3», «Управление производственным предприятием 1.3» или «Комплексная автоматизация 1.1») системные администраторы и разработчики часто сталкиваются с крайне неприятной проблемой. При печати этикеток или ценников на экране компьютера в режиме предварительного просмотра штрихкод отображается корректно и без ошибок. Однако стоит отправить этот документ на принтер — будь то специализированный принтер этикеток (Zebra, TSC, Godex) или обычный офисный лазерный принтер — как штрихкод исчезает. Вместо него на бумаге выводится абсолютно пустая область, при этом весь остальной текст и рамки печатаются без проблем.

Давайте подробно проанализируем причины этого сбоя, разберем внутренние механизмы платформы «1С», которые к нему приводят, и рассмотрим по шагам практические способы решения этой проблемы.

В чем кроется техническая причина сбоя?

Для того чтобы понять природу этой ошибки, нам необходимо заглянуть под капот платформы «1С:Предприятие» и изучить изменения, которые были внесены разработчиками, начиная с версии 8.3.16.

Исторически в конфигурациях на обычных формах для формирования штрихкодов использовался внешний программный компонент «1С:Печать штрихкодов». Эта компонента представляет собой библиотеку 1CBarCod.dll, выполненную по технологии ActiveX (COM). В макете печатной формы создавался специальный графический объект с программным идентификатором V8.Barcod.1. При формировании печатной формы код 1С передавал в этот объект текстовую строку штрихкода, а сама компонента генерировала графическое изображение «на лету».

До версии платформы 8.3.15 включительно вся цепочка генерации и отправки на печать выполнялась в рамках одного системного процесса клиентского приложения. Однако, начиная с версии 8.3.16, разработчики «1С» кардинально переработали подсистему печати ради повышения стабильности. Ранее падение драйвера принтера или сбой сетевого подключения во время печати приводили к аварийному завершению всей платформы «1С» и потере несохраненных данных пользователя.

Чтобы изолировать эти ошибки, в платформе 8.3.16 процесс отправки данных на физический принтер был вынесен в отдельный изолированный фоновый процесс операционной системы. В результате архитектура печати разделилась на два этапа:

  1. Предварительный просмотр: Формируется внутри основного процесса клиентского приложения «1С». Здесь библиотека ActiveX активна, успешно инициализируется в памяти и отрисовывает штрихкод на экране.
  2. Вывод на физический принтер: Табличный документ сериализуется и передается в изолированный процесс печати. Этот фоновый процесс выполняется в собственной изолированной среде, которая не имеет доступа к инициализированной ActiveX-компоненте в основном приложении. Пытаясь обработать объект V8.Barcod.1, процесс печати завершается ошибкой инициализации графического ядра и попросту выводит пустую область вместо изображения штрихкода.

Техническая поддержка фирмы «1С» официально подтвердила этот баг совместимости, указав, что технология ActiveX признана устаревшей (она не поддерживается в 64-битных клиентах и средах под управлением Linux), и исправлений для старой компоненты 1CBarCod.dll в новых версиях платформы выпускаться не будет.

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

Вариант 1. Временный откат версии платформы (самый быстрый путь)

Если ваша конфигурация («Управление торговлей 10.3» или аналогичная) не завязана на специфические новые механизмы последних версий платформы и работает в режиме совместимости со старыми версиями, самым быстрым способом вернуть печать штрихкодов в штатный режим является откат платформы «1С» на рабочих местах пользователей.

Практика показывает, что стабильная печать штрихкодов через ActiveX без каких-либо доработок кода гарантированно работает на всех релизах веток 8.3.12, 8.3.14 и 8.3.15. Достаточно удалить версию 8.3.16 (или более позднюю) и установить, к примеру, стабильный релиз платформы 8.3.15.1830. Это мгновенно решит проблему без необходимости привлекать программистов для переписывания макетов.

Однако этот путь является временным компромиссом. Рано или поздно вам придется обновить платформу для поддержки новых механизмов маркировки («Честный Знак»), интеграции с ЕГАИС, онлайн-касс или новых требований законодательства, которые требуют современных релизов 1С. В этом случае необходимо переходить к архитектурным изменениям.

Вариант 2. Переход на использование Native-компоненты БПО

Это наиболее правильный, современный и надежный способ решения проблемы, рекомендованный фирмой «1С». Современные конфигурации используют технологию Native 1C для генерации штрихкодов. Эта компонента поставляется в составе Библиотеки подключаемого оборудования (БПО) и Библиотеки стандартных подсистем (БСП). Она генерирует штрихкод в виде стандартной картинки формата PNG напрямую силами платформы, не используя системный реестр Windows и технологию ActiveX.

Рассмотрим по шагам, как перевести печать этикеток в старой конфигурации на Native-компоненту:

  1. Получение Native-компоненты: Выгрузите макет современной компоненты печати штрихкодов из любой актуальной типовой конфигурации (например, «Управление торговлей 11» или «Розница 2.3»). Обычно этот макет называется КомпонентаПечатиШтрихкодов. Сохраните его в вашей конфигурации как общий макет с типом «Двоичные данные».
  2. Модернизация макета печатной формы: Откройте макет вашей этикетки в конфигураторе. Найдите объект ActiveX (черный квадрат штрихкода) и безжалостно удалите его. Вместо него вставьте стандартный рисунок платформы 1С с типом «Картинка». Присвойте этому рисунку понятное имя, например, ИзображениеШтрихкода.
  3. Доработка программного кода печати: Нам необходимо написать код, который будет инициализировать Native-компоненту, передавать ей параметры штрихкода (тип, код, размеры), получать готовую картинку штрихкода и выводить ее в созданный рисунок на макете.

Проанализируем пример кода, который реализует подключение Native-компоненты и вывод изображения штрихкода на макет:


// Функция инициализирует Native-компоненту печати штрихкодов из общего макета
Функция ПодключитьКомпонентуПечатиШтрихкода() Экспорт
    
    ИмяПути = ПолучитьИмяВременногоФайла("dll");
    ДанныеКомпоненты = ПолучитьОбщийМакет("КомпонентаПечатиШтрихкодов");
    ДанныеКомпоненты.Записать(ИмяПути);
    
    Попытка
        ПодключитьВнешнююКомпоненту(ИмяПути, "КомпонентаШтрихкода", ТипВнешнейКомпоненты.Native);
        ГенераторШтрихкода = Новый("AddIn.КомпонентаШтрихкода.Barcode");
        Возврат ГенераторШтрихкода;
    Исключение
        ЗаписатьВЖурналРегистрации("ПечатьШтрихкода", УровеньЖурналаРегистрации.Ошибка, , , 
            "Не удалось подключить Native-компоненту печати штрихкодов: " + ОписаниеОшибки());
        Возврат Неопределено;
    КонецПопытки;
    
КонецФункции

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


Процедура ВывестиШтрихкодНаМакет(ОбластьМакета, ЗначениеШтрихкода, ТипКода)
    
    Генератор = ПодключитьКомпонентуПечатиШтрихкода();
    Если Генератор = Неопределено Тогда
        ВызватьИсключение "Ошибка инициализации генератора штрихкодов!";
    КонецЕсли;
    
    // Задаем параметры штрихкода
    // ТипКода: 1 - EAN13, 2 - EAN8, 16 - Code128 и т.д.
    Генератор.ТипКода = ТипКода;
    Генератор.Сообщение = СокрЛП(ЗначениеШтрихкода);
    Генератор.Ширина = 400; // Ширина картинки в пикселях
    Генератор.Высота = 150; // Высота картинки в пикселях
    
    // Получаем двоичные данные картинки (PNG)
    ДвоичныеДанныеКартинки = Генератор.ПолучитьШтрихкодУнарный();
    
    Если ДвоичныеДанныеКартинки <> Неопределено Тогда
        КартинкаШтрихкода = Новый Картинка(ДвоичныеДанныеКартинки);
        
        // Находим созданный нами рисунок в области макета и помещаем туда картинку
        РисунокШтрихкода = ОбластьМакета.Рисунки.ИзображениеШтрихкода;
        РисунокШтрихкода.Картинка = КартинкаШтрихкода;
    Иначе
        ЗаписатьВЖурналРегистрации("ПечатьШтрихкода", УровеньЖурналаРегистрации.Предупреждение, , , 
            "Компонента не смогла сгенерировать данные для штрихкода: " + ЗначениеШтрихкода);
    КонецЕсли;
    
КонецПроцедуры

Этот подход полностью решает проблему изоляции процессов печати. Теперь на принтер отправляется не сложный ActiveX-объект, а обычная растровая картинка формата PNG, которая без проблем обрабатывается любым драйвером принтера на любой версии платформы 1С.

Вариант 3. Использование шрифтов штрихкода (TrueType Fonts)

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

Смысл данного метода заключается в том, что в операционную систему устанавливается специальный шрифт (например, EanGnivc для кодировки EAN-13 или универсальный шрифт семейства Code39 / Code128). Символы в этих шрифтах нарисованы в виде вертикальных черных полос разной толщины, соответствующих спецификации стандартов кодирования.

Рассмотрим по шагам, как внедрить этот метод:

  1. Скачайте файл шрифта (например, EANGNIVC.TTF) и установите его в операционной системе Windows (в папку C:\Windows\Fonts) на сервере 1С и на всех клиентских компьютерах, с которых будет производиться печать.
  2. В макете печатной формы удалите объект штрихкода и сделайте на его месте обычную текстовую ячейку табличного документа.
  3. В свойствах этой ячейки укажите установленный шрифт (например, EanGnivc) и задайте крупный размер шрифта (обычно от 20 до 36 пунктов).
  4. При заполнении параметров этой ячейки передайте программно сформированную текстовую строку. Важно помнить: для правильного считывания сканером многие шрифты требуют передачи не просто цифр штрихкода, а специальной строки, содержащей стартовые и стоповые символы (например, звездочки по краям для Code39) или контрольные символы для EAN.

Преимущество использования шрифтов очевидно — табличный документ формируется и отправляется на печать как обычный текст. Этот метод работает невероятно быстро, не нагружает оперативную память генерацией графики и гарантирует 100% совместимость с любыми будущими версиями платформы «1С:Предприятие».

Резюме и рекомендации

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

← На главную