Почему не печатается штрихкод на платформе 8.3.16 и как это исправить?

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

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

Выясним причину проблемы

Основная причина кроется в архитектурных изменениях платформы 1С. Старая компонента 1CBarCode.exe базируется на технологии ActiveX. Начиная с версии 8.3.16, разработчики 1С начали активный отказ от поддержки устаревших OLE-объектов в пользу кроссплатформенного Native API. В первых релизах 16-й ветки взаимодействие с ActiveX-объектами при формировании задания для принтера работало некорректно, особенно в 64-битных версиях клиента. Несмотря на то, что предварительный просмотр генерирует картинку для экрана, при передаче данных в спулер печати объект просто игнорируется.

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

Способ 1: Обновление платформы

Если ваша инфраструктура позволяет, первым делом попробуем обновить платформу. Опыт показывает, что начиная с релиза 8.3.16.1148 и в более поздних ветках (8.3.17, 8.3.18), работоспособность старой компоненты 1CBarCode была частично восстановлена. Однако это лишь временная мера, так как технология ActiveX официально признана устаревшей.

Способ 2: Переход на нативную компоненту (Native API)

Это самый надежный и правильный путь. Мы заменим старый объект ActiveX в макете на обычную картинку, которую будем программно генерировать с помощью библиотеки Barcode.dll (входит в состав БПО). Разберем по шагам, как это реализовать.

Для начала нам необходимо подключить внешнюю компоненту. Рассмотрим пример функции, которая извлекает компоненту из макета и инициализирует ее:


Функция ПодключитьВнешнююКомпонентуПечатиШтрихкода() Экспорт
    Макет = ПолучитьМакет("КомпонентаПечатиШтрихкодов");
    Адрес = ПоместитьВоВременноеХранилище(Макет);
    ПодключениеВыполнено = ПодключитьВнешнююКомпоненту(Адрес, "КартинкаШтрихкода", ТипВнешнейКомпоненты.Native);

    Если ПодключениеВыполнено Тогда
        ВнешняяКомпонента = Новый("AddIn.КартинкаШтрихкода.Barcode");
    Иначе
        Возврат Неопределено;
    КонецЕсли;

    // Проверим готовность графической системы
    Если НЕ ВнешняяКомпонента.ГрафикаУстановлена Тогда
        Возврат Неопределено;
    КонецЕсли;

    // Установим шрифт по умолчанию, например, Tahoma
    Если ВнешняяКомпонента.НайтиШрифт("Tahoma") Тогда
        ВнешняяКомпонента.Шрифт = "Tahoma";
    КонецЕсли;
    
    ВнешняяКомпонента.РазмерШрифта = 12;
    Возврат ВнешняяКомпонента;
КонецФункции

Теперь проанализируем процесс получения самой картинки. Нам нужно передать параметры (текст кода, тип, размеры) и получить объект Картинка, который мы вставим в макет.


Функция ПолучитьКартинкуШтрихкода(ПараметрыШтрихкода) Экспорт
    ВнешняяКомпонента = ПодключитьВнешнююКомпонентуПечатиШтрихкода();
    Если ВнешняяКомпонента = Неопределено Тогда
        ВызватьИсключение "Ошибка подключения компоненты!";
    КонецЕсли;

    // Задаем параметры формирования
    ВнешняяКомпонента.Ширина = Окр(ПараметрыШтрихкода.Ширина);
    ВнешняяКомпонента.Высота = Окр(ПараметрыШтрихкода.Высота);
    ВнешняяКомпонента.АвтоТип = Ложь;
    ВнешняяКомпонента.ТипКода = 1; // Например, EAN13
    ВнешняяКомпонента.ОтображатьТекст = Истина;
    ВнешняяКомпонента.ЗначениеКода = ПараметрыШтрихкода.Штрихкод;

    // Формируем двоичные данные картинки
    ДвоичныеДанныеКартинки = ВнешняяКомпонента.ПолучитьШтрихкод();

    Если ДвоичныеДанныеКартинки <> Неопределено Тогда
        Возврат Новый Картинка(ДвоичныеДанныеКартинки);
    КонецЕсли;
    
    Возврат Неопределено;
КонецФункции

Способ 3: Борьба с "размытостью" и калибровка размеров

При использовании нативной компоненты часто возникает проблема: штрихкод получается размытым и плохо читается сканером. Выясним причину: это происходит из-за несоответствия экранного разрешения (DPI) и физических размеров области в миллиметрах в макете 1С.

Чтобы получить идеально четкую картинку, воспользуемся проверенным методом расчета пикселей. Нам понадобится вспомогательный макет "Эталон", где размещен квадрат размером ровно 100 на 100 пикселей. Посмотрим на алгоритм расчета:

  1. Измеряем высоту эталонного квадрата в макете (в миллиметрах).
  2. Вычисляем коэффициент: КоличествоМиллиметровВПикселе = ВысотаКвадрата / 100.
  3. При формировании параметров для компоненты делим размер области в макете на этот коэффициент.

Рассмотрим пример кода для вывода в печатную форму:


Эталон = ПолучитьМакет("Эталон");
КоличествоМиллиметровВПикселе = Эталон.Рисунки.Квадрат100Пикселей.Высота / 100;

Рисунок = ОбластьМакета.Рисунки.Штрихкод; // Это пустая картинка в макете

ПараметрыШК = Новый Структура;
ПараметрыШК.Вставить("Штрихкод", ТекущийШтрихкод);
ПараметрыШК.Вставить("Ширина", Окр(Рисунок.Ширина / КоличествоМиллиметровВПикселе));
ПараметрыШК.Вставить("Высота", Окр(Рисунок.Высота / КоличествоМиллиметровВПикселе));

// Устанавливаем полученную картинку в объект рисунка макета
Рисунок.Картинка = ПолучитьКартинкуШтрихкода(ПараметрыШК);

Дополнительные рекомендации

Если вы используете конфигурации типа "Розница 2.0" или "УНФ", убедитесь, что в системе не осталось "хвостов" от старой программы 1CBarCode. Иногда помогает полная деинсталляция старой компоненты, перезагрузка сервера/клиента и использование типового шаблона этикетки, который в новых релизах конфигураций уже переведен на использование внутренних библиотек платформы.

Важный момент: в свойствах рисунка в макете (куда вы вставляете картинку) рекомендуется установить значение РазмерКартинки = Авторазмер или Пропорционально. Это исключит искажение пропорций полос штрихкода при печати на принтерах с низким разрешением (203 dpi), которые часто используются для этикеток.

Подводя итог, можно сказать, что проблема платформы 8.3.16.1063 — это отличный повод перевести ваши печатные формы на современный стандарт формирования штрихкодов. Это обеспечит стабильную работу системы вне зависимости от разрядности клиента и версии Windows.

← На главную