При разработке внешних печатных форм (ВПФ) или доработке типовых документов в 1С:Управление торговлей 11 часто возникает необходимость вывести штрихкод номенклатуры не в виде текстовой строки цифр, а в виде графического штрихового кода, готового для считывания сканером. Разберем особенности реализации этой задачи на управляемых формах и выясним, как правильно сформировать изображение штрихкода на стороне сервера.
Проанализируем распространенные ошибки и ограничения классических способов формирования штрихкодов:
Область.Рисунки.Штрихкод.Объект на управляемых формах вызывает синтаксические ошибки и ошибки выполнения.Наиболее надежным и кроссплатформенным решением в управляемом приложении является программная генерация картинки со штрихкодом с последующей передачей объекта Картинка в соответствующую область табличного документа.
В типовых конфигурациях (таких как 1С:Управление торговлей 11, 1С:Комплексная автоматизация, 1С:ERP) уже реализован общий модуль подсистемы подключаемого оборудования — МенеджерОборудованияВызовСервера. Он предоставляет готовую функцию для генерации изображения штрихкода через серверную Native-компоненту.
Разберем по шагам, как подготовить макет и заполнить его программно:
КартинкаШтрихкода.Посмотрим на рабочий пример кода при обходе строк результата запроса:
Пока РезультатЗапроса.Следующий() Цикл
// Заполняем текстовые параметры строки
ЗаполнитьЗначенияСвойств(ОбластьТабличнаяЧасть.Параметры, РезультатЗапроса);
// Проверяем наличие штрихкода у позиции
Если ЗначениеЗаполнено(РезультатЗапроса.ШтрихКод) Тогда
// Получаем эталонный коэффициент перевода миллиметров в пиксели
Эталон = Обработки.ПечатьЭтикетокИЦенников.ПолучитьМакет("Эталон");
КоличествоМиллиметровВПикселе = Эталон.Рисунки.Квадрат100Пикселей.Высота / 100;
// Формируем параметры генерации штрихкода
ПараметрыШтрихкода = Новый Структура;
ПараметрыШтрихкода.Вставить("Ширина", Окр(ОбластьТабличнаяЧасть.Рисунки.КартинкаШтрихкода.Ширина / КоличествоМиллиметровВПикселе));
ПараметрыШтрихкода.Вставить("Высота", Окр(ОбластьТабличнаяЧасть.Рисунки.КартинкаШтрихкода.Высота / КоличествоМиллиметровВПикселе));
ПараметрыШтрихкода.Вставить("Штрихкод", РезультатЗапроса.ШтрихКод);
ПараметрыШтрихкода.Вставить("ТипКода", 1); // 1 соответствует формату EAN-13
ПараметрыШтрихкода.Вставить("ОтображатьТекст", Истина);
ПараметрыШтрихкода.Вставить("РазмерШрифта", 10);
// Генерируем картинку через серверную функцию БПО
ОбластьТабличнаяЧасть.Рисунки.КартинкаШтрихкода.Картинка = МенеджерОборудованияВызовСервера.ПолучитьКартинкуШтрихкода(ПараметрыШтрихкода);
Иначе
// Очищаем область рисунка, если у номенклатуры нет штрихкода
ОбластьТабличнаяЧасть.Рисунки.КартинкаШтрихкода.Картинка = Новый Картинка;
КонецЕсли;
ТабличныйДокумент.Вывести(ОбластьТабличнаяЧасть);
КонецЦикла;
Если печатная форма разрабатывается как полностью автономная внешняя обработка, которая не должна зависеть от версий типовых модулей конфигурации, можно использовать прямое подключение Native-компоненты 1С для печати штрихкодов.
Рассмотрим пример программной работы с компонентой:
// Подключаем Native-компоненту из общего макета или макета внешней обработки
РезультатПодключения = ПодключитьВнешнююКомпоненту("ОбщийМакет.КомпонентаПечатиШтрихкодов", "ВКШтрихкод", ТипПодключенияВнешнейКомпоненты.Изолированно);
Если РезультатПодключения Тогда
Генератор = Новый("AddIn.ВКШтрихкод.Barcode");
Генератор.АвтоТип = Ложь;
Генератор.ТипКода = 1; // 1 — EAN-13
Генератор.ЗначениеКода = РезультатЗапроса.ШтрихКод;
Генератор.ОтображатьТекст = Истина;
Генератор.РазмерШрифта = 10;
Генератор.Ширина = 200;
Генератор.Высота = 80;
ДвоичныеДанныеКартинки = Генератор.ПолучитьШтрихкод();
Если ДвоичныеДанныеКартинки <> Неопределено Тогда
ОбластьТабличнаяЧасть.Рисунки.КартинкаШтрихкода.Картинка = Новый Картинка(ДвоичныеДанныеКартинки);
КонецЕсли;
КонецЕсли;
Проанализируем ключевые моменты, на которые следует обратить внимание при настройке вывода:
РазмерКартинки в значение АвтоРазмер или РеальныйРазмер.Новый Картинка, если для текущей строки штрихкод в информационной базе не задан. В противном случае в ячейке может остаться изображение от предыдущей обработанной позиции.