С выходом платформы 8.3.16.1063 многие пользователи и разработчики столкнулись с неприятной ситуацией: штрихкод прекрасно отображается в экранной форме и в предварительном просмотре, но при выводе на принтер вместо него остается пустое место или печатаются странные символы. Рассмотрим подробно, почему это происходит и как решить проблему с помощью современных инструментов 1С.
Основная причина кроется в архитектурных изменениях платформы 1С. Старая компонента 1CBarCode.exe базируется на технологии ActiveX. Начиная с версии 8.3.16, разработчики 1С начали активный отказ от поддержки устаревших OLE-объектов в пользу кроссплатформенного Native API. В первых релизах 16-й ветки взаимодействие с ActiveX-объектами при формировании задания для принтера работало некорректно, особенно в 64-битных версиях клиента. Несмотря на то, что предварительный просмотр генерирует картинку для экрана, при передаче данных в спулер печати объект просто игнорируется.
Проанализируем основные способы решения этой задачи, от простых административных мер до полной переработки механизма печати.
Если ваша инфраструктура позволяет, первым делом попробуем обновить платформу. Опыт показывает, что начиная с релиза 8.3.16.1148 и в более поздних ветках (8.3.17, 8.3.18), работоспособность старой компоненты 1CBarCode была частично восстановлена. Однако это лишь временная мера, так как технология ActiveX официально признана устаревшей.
Это самый надежный и правильный путь. Мы заменим старый объект ActiveX в макете на обычную картинку, которую будем программно генерировать с помощью библиотеки Barcode.dll (входит в состав БПО). Разберем по шагам, как это реализовать.
Для начала нам необходимо подключить внешнюю компоненту. Рассмотрим пример функции, которая извлекает компоненту из макета и инициализирует ее:
Функция ПодключитьВнешнююКомпонентуПечатиШтрихкода() Экспорт
Макет = ПолучитьМакет("КомпонентаПечатиШтрихкодов");
Адрес = ПоместитьВоВременноеХранилище(Макет);
ПодключениеВыполнено = ПодключитьВнешнююКомпоненту(Адрес, "КартинкаШтрихкода", ТипВнешнейКомпоненты.Native);
Если ПодключениеВыполнено Тогда
ВнешняяКомпонента = Новый("AddIn.КартинкаШтрихкода.Barcode");
Иначе
Возврат Неопределено;
КонецЕсли;
// Проверим готовность графической системы
Если НЕ ВнешняяКомпонента.ГрафикаУстановлена Тогда
Возврат Неопределено;
КонецЕсли;
// Установим шрифт по умолчанию, например, Tahoma
Если ВнешняяКомпонента.НайтиШрифт("Tahoma") Тогда
ВнешняяКомпонента.Шрифт = "Tahoma";
КонецЕсли;
ВнешняяКомпонента.РазмерШрифта = 12;
Возврат ВнешняяКомпонента;
КонецФункции
Теперь проанализируем процесс получения самой картинки. Нам нужно передать параметры (текст кода, тип, размеры) и получить объект Картинка, который мы вставим в макет.
Функция ПолучитьКартинкуШтрихкода(ПараметрыШтрихкода) Экспорт
ВнешняяКомпонента = ПодключитьВнешнююКомпонентуПечатиШтрихкода();
Если ВнешняяКомпонента = Неопределено Тогда
ВызватьИсключение "Ошибка подключения компоненты!";
КонецЕсли;
// Задаем параметры формирования
ВнешняяКомпонента.Ширина = Окр(ПараметрыШтрихкода.Ширина);
ВнешняяКомпонента.Высота = Окр(ПараметрыШтрихкода.Высота);
ВнешняяКомпонента.АвтоТип = Ложь;
ВнешняяКомпонента.ТипКода = 1; // Например, EAN13
ВнешняяКомпонента.ОтображатьТекст = Истина;
ВнешняяКомпонента.ЗначениеКода = ПараметрыШтрихкода.Штрихкод;
// Формируем двоичные данные картинки
ДвоичныеДанныеКартинки = ВнешняяКомпонента.ПолучитьШтрихкод();
Если ДвоичныеДанныеКартинки <> Неопределено Тогда
Возврат Новый Картинка(ДвоичныеДанныеКартинки);
КонецЕсли;
Возврат Неопределено;
КонецФункции
При использовании нативной компоненты часто возникает проблема: штрихкод получается размытым и плохо читается сканером. Выясним причину: это происходит из-за несоответствия экранного разрешения (DPI) и физических размеров области в миллиметрах в макете 1С.
Чтобы получить идеально четкую картинку, воспользуемся проверенным методом расчета пикселей. Нам понадобится вспомогательный макет "Эталон", где размещен квадрат размером ровно 100 на 100 пикселей. Посмотрим на алгоритм расчета:
КоличествоМиллиметровВПикселе = ВысотаКвадрата / 100.Рассмотрим пример кода для вывода в печатную форму:
Эталон = ПолучитьМакет("Эталон");
КоличествоМиллиметровВПикселе = Эталон.Рисунки.Квадрат100Пикселей.Высота / 100;
Рисунок = ОбластьМакета.Рисунки.Штрихкод; // Это пустая картинка в макете
ПараметрыШК = Новый Структура;
ПараметрыШК.Вставить("Штрихкод", ТекущийШтрихкод);
ПараметрыШК.Вставить("Ширина", Окр(Рисунок.Ширина / КоличествоМиллиметровВПикселе));
ПараметрыШК.Вставить("Высота", Окр(Рисунок.Высота / КоличествоМиллиметровВПикселе));
// Устанавливаем полученную картинку в объект рисунка макета
Рисунок.Картинка = ПолучитьКартинкуШтрихкода(ПараметрыШК);
Если вы используете конфигурации типа "Розница 2.0" или "УНФ", убедитесь, что в системе не осталось "хвостов" от старой программы 1CBarCode. Иногда помогает полная деинсталляция старой компоненты, перезагрузка сервера/клиента и использование типового шаблона этикетки, который в новых релизах конфигураций уже переведен на использование внутренних библиотек платформы.
Важный момент: в свойствах рисунка в макете (куда вы вставляете картинку) рекомендуется установить значение РазмерКартинки = Авторазмер или Пропорционально. Это исключит искажение пропорций полос штрихкода при печати на принтерах с низким разрешением (203 dpi), которые часто используются для этикеток.
Подводя итог, можно сказать, что проблема платформы 8.3.16.1063 — это отличный повод перевести ваши печатные формы на современный стандарт формирования штрихкодов. Это обеспечит стабильную работу системы вне зависимости от разрядности клиента и версии Windows.