В процессе работы розничных магазинов часто возникает ситуация, когда стандартных реквизитов в печатных формах документов недостаточно. Одной из самых востребованных задач является добавление штрихкода товара в документ Установка цен номенклатуры. Это необходимо для того, чтобы продавцы или кладовщики могли быстро идентифицировать товар с помощью сканера, не вчитываясь в длинные наименования или мелкие артикулы. Рассмотрим, как реализовать эту задачу в конфигурациях на базе «обычных форм» (например, Управление торговлей для Казахстана 2.2 или УТ 10.3), сохраняя при этом возможность обновления программы.
Прежде всего, проанализируем, где именно хранятся данные. В большинстве типовых конфигураций 1С штрихкод не является реквизитом самого справочника Номенклатура. Данные о штрихкодах хранятся в подчиненном регистре сведений Штрихкоды. Следовательно, просто «вытащить» поле в макет не получится — нам потребуется программно обратиться к этому регистру для каждой позиции в документе.
Второй важный момент: у одного товара может быть несколько штрихкодов (на разные единицы измерения или разные виды упаковок). Нам нужно решить, какой именно код выводить: основной, первый попавшийся или код, соответствующий единице измерения, указанной в документе.
Поскольку конфигурация находится на поддержке, использование внешней печатной формы — самый безопасный метод. Мы не меняем логику основной программы, а просто добавляем новый вариант печати. Рассмотрим процесс пошагово:
УстановкаЦенНоменклатуры, перейдем на вкладку «Макеты» и сохраним стандартную печатную форму во внешний файл .ert или .mxl (или создадим новую внешнюю обработку).ШтрихкодТекстом.
Функция ПолучитьШтрихкодТовара(АктуальнаяНоменклатура, АктуальнаяЕдиница = Неопределено) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| Штрихкоды.Штрихкод КАК Штрихкод
|ИЗ
| РегистрСведений.Штрихкоды КАК Штрихкоды
|ГДЕ
| Штрихкоды.Владелец = &Владелец";
Запрос.УстановитьПараметр("Владелец", АктуальнаяНоменклатура);
РезультатЗапроса = Запрос.Выполнить();
Если Не РезультатЗапроса.Пустой() Тогда
Выборка = РезультатЗапроса.Выбрать();
Выборка.Следующий();
Возврат Выборка.Штрихкод;
КонецЕсли;
Возврат "";
КонецФункции
Проанализируем этот код: мы используем конструкцию ВЫБРАТЬ ПЕРВЫЕ 1, чтобы избежать дублирования строк, если у товара несколько кодов. В реальной задаче желательно добавить условие по единице измерения, чтобы сканер находил именно ту упаковку, цена на которую установлена в документе.
Если ваша база работает на платформе 8.3, даже при использовании «обычных форм», можно задействовать механизм расширений. Это позволит добавить колонку прямо в экранную форму документа, чтобы продавцы видели штрихкод в интерфейсе 1С.
Разберем, как это сделать:
УстановкаЦенНоменклатуры.ПриВыводеСтроки (для обычных форм) или воспользуемся обработчиком ПриЧтенииНаСервере для заполнения данных.Посмотрим на пример кода для обработчика ПриВыводеСтроки:
&НаКлиенте
Процедура Расш_ПриВыводеСтрокиТовары(Элемент, ОформлениеСтроки, ДанныеСтроки)
// Получаем данные штрихкода (лучше кешировать запросы для производительности)
Штрихкод = ПолучитьШтрихкодИзРегистра(ДанныеСтроки.Номенклатура);
ОформлениеСтроки.Ячейки.Штрихкод.УстановитьТекст(Штрихкод);
КонецПроцедуры
Важный нюанс: Постоянное обращение к серверу в событии ПриВыводеСтроки может существенно замедлить работу программы при прокрутке списка. Проанализируем ситуацию: лучше один раз при открытии формы или при изменении товара заполнить скрытую колонку в табличной части, а затем просто отображать её.
Если задача стоит именно в том, чтобы «пикать» сканером в лист бумаги, недостаточно просто вывести цифры (например, 4601234567890). Сканер не считывает текст, ему нужна графическая «зебра». Выясним, что для этого требуется:
Во-первых, в макет печатной формы нужно вставить объект Рисунок с типом 1С:Печать штрихкодов. Если эта компонента не установлена на компьютере, система выдаст ошибку.
Во-вторых, необходимо программно передать значение штрихкода в этот объект при выводе каждой строки. Рассмотрим пример логики:
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
// Заполняем текстовые параметры
ОбластьСтрока.Параметры.Товар = ТекущаяСтрока.Номенклатура;
ОбластьСтрока.Параметры.Цена = ТекущаяСтрока.Цена;
// Работаем с графическим объектом штрихкода
РисунокШтрихкод = ОбластьСтрока.Рисунки.Штрихкод;
РисунокШтрихкод.Объект.Сообщение = ПолучитьШтрихкодТовара(ТекущаяСтрока.Номенклатура);
РисунокШтрихкод.Объект.ТипКода = 1; // Например, EAN13
ТабДок.Вывести(ОбластьСтрока);
Совет: Если установка компоненты 1C:BarCode на все компьютеры затруднительна, можно использовать специализированные шрифты, такие как EAN13.ttf. В этом случае штрихкод выводится в обычную ячейку как текст, но для этой ячейки устанавливается данный шрифт. Это значительно упрощает поддержку решения.
Если программиста нет под рукой, а задачу нужно решить «вчера», проанализируем стандартные возможности. В конфигурациях типа УТ часто есть встроенная обработка Печать ценников и этикеток. Мы можем зайти в документ «Установка цен номенклатуры», нажать кнопку «Печать» (или воспользоваться кнопкой заполнения в обработке печати этикеток) и выбрать пункт «Этикетки». Система сама подберет штрихкоды, цены из этого документа и сформирует лист, который можно распечатать. Это не совсем «колонка в документе», но функционально полностью решает задачу идентификации товара и проверки цен.
Подводя итог, отметим: добавление штрихкода в документ — задача технически несложная, но требующая аккуратности в работе с производительностью запросов и компонентами печати. Мы рекомендуем использовать внешнюю печатную форму, так как это гарантирует стабильность работы основной программы при последующих обновлениях.