В розничной торговле нередко возникает требование использовать артикул номенклатуры в качестве идентификатора весового товара при формировании этикеток на фасовочных весах. Разберем практическую задачу: штрихкод стандарта EAN-13 формируется весами по схеме, где первые 5 символов отводятся под артикул позиции, а последующие знаки кодируют вес. Рассмотрим, какими путями можно решить эту задачу в 1С:Розница 2.2 — с изменением программного кода и штатным архитектурным методом без модификации типовых процедур.
Прежде чем приступать к доработкам, проанализируем структуру штрихкода формата EAN-13. Полный штрихкод содержит ровно 13 цифр:
Артикул справочника Номенклатура имеет строковый тип, а контроль уникальности на уровне платформы для него не установлен. Если в базе окажутся товары с одинаковыми артикулами, запрос вернет первую попавшуюся позицию, что создаст пересорт на кассовом узле.КодыТоваровSKU. Если переписать логику только в обработке сканирования и обойти этот регистр, штатная выгрузка номенклатуры в весы перестанет функционировать.Рассмотрим штатный подход, который сохраняет полную работоспособность типовых механизмов и обновляемость конфигурации. Конфигурация 1С:Розница изначально рассчитана на работу с весовыми кодами через регистр сведений КодыТоваровSKU.
Посмотрим, как устроен типовой алгоритм: система ожидает в штрихкоде префикс весового товара и внутренний код SKU. Если код артикула является числовым (например, пятизначное число, начинающееся с двойки), нет необходимости менять код функции сканирования — достаточно сделать так, чтобы артикул выступал в роли номера SKU.
Разберем по шагам, как настроить этот процесс:
SKU. Это можно сделать групповой обработкой справочника либо регламентным заданием.ПередЗаписью или ПриЗаписи для справочника Номенклатура:
// В общем модуле расширения или доработки
Процедура СинхронизацияАртикулаИSKUПередЗаписью(Источник, Отказ) Экспорт
Если Источник.ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
// Проверяем, что артикул заполнен и состоит из цифр
Если ЗначениеЗаполнено(Источник.Артикул) Тогда
Попытка
ЧисловойКод = Число(СокрЛП(Источник.Артикул));
МенеджерЗаписи = РегистрыСведений.КодыТоваровSKU.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Номенклатура = Источник.Ссылка;
МенеджерЗаписи.Прочитать();
Если МенеджерЗаписи.SKU <> ЧисловойКод Тогда
МенеджерЗаписи.Номенклатура = Источник.Ссылка;
МенеджерЗаписи.SKU = ЧисловойКод;
МенеджерЗаписи.Записать(Истина);
КонецЕсли;
Исключение
// Обработка нечисловых символов в артикуле
КонецПопытки;
КонецЕсли;
КонецПроцедуры
Такой подход избавляет от изменения сложных общих модулей обработки штрихкодов кассового узла и сохраняет штатную выгрузку в фасовочные весы.
Если специфика проекта или весового оборудования жестко требует разбора нестандартной структуры (5 символов артикула + 7 символов веса без префикса фасовки), разберем доработку функции ПолученШтрихкодИзСШК. Чтобы не снимать конфигурацию с поддержки, перенесем логику в расширение конфигурации с использованием аннотации &Вместо или &ИзменениеИКонтроль.
Выясним причину ошибок в исходном коде: в типовом модуле длина кода и смещение позиции веса рассчитываются из констант префиксов. Если префикс отсутствует, а артикул начинается с первого символа, смещения должны быть пересчитаны жестко:
Лев(Штрихкод, 5) или Сред(Штрихкод, 1, 5).Сред(Штрихкод, 6, 7) — строго 7 символов до 12-го знака включительно, отсекая 13-й контрольный символ.Номенклатура по полю Артикул вместо регистра КодыТоваровSKU.Посмотрим на исправленный фрагмент кода для перехвата штрихкода весового товара:
// Фрагмент доработанной процедуры разбора штрихкода
Если ТипШтрихкода = ПланыВидовХарактеристик.ТипыШтрихкодов.EAN13 И СтрДлина(Штрихкод) = 13 Тогда
// Проверяем условие задачи: штрихкод начинается с цифры 2
Если Лев(Штрихкод, 1) = "2" Тогда
АртикулТовара = СокрЛП(Сред(Штрихкод, 1, 5));
СтрокаВеса = Сред(Штрихкод, 6, 7); // 4 знака целых, 3 знака дробных
Попытка
ВесТовара = Число(СтрокаВеса) / 1000;
Исключение
ВесТовара = 0;
КонецПопытки;
Если ВесТовара > 0 Тогда
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| Номенклатура.Ссылка КАК Номенклатура,
| ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка) КАК Характеристика,
| ЗНАЧЕНИЕ(Справочник.УпаковкиНоменклатуры.ПустаяСсылка) КАК Упаковка,
| &Количество КАК Количество
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Артикул = &Артикул
| И НЕ Номенклатура.ЭтоГруппа";
Запрос.УстановитьПараметр("Артикул", АртикулТовара);
Запрос.УстановитьПараметр("Количество", ВесТовара);
РезультатЗапроса = Запрос.Выполнить();
Если НЕ РезультатЗапроса.Пустой() Тогда
Выборка = РезультатЗапроса.Выбрать();
Выборка.Следующий();
НеизвестныеДанныеПО = Ложь;
СтруктураПараметров = Новый Структура;
СтруктураПараметров.Вставить("НеизвестныеДанныеПО", НеизвестныеДанныеПО);
СтруктураПараметров.Вставить("ЗначенияПоиска", Новый Массив);
СтруктураПараметров.Вставить("Действие", "ПроверкаВесовыхТоваров");
СтруктураПараметров.Вставить("ДанныеПО", Штрихкод);
СтруктураШтрихкода = Новый Структура;
ОбщегоНазначенияРТ.ПеренестиСтрокуВыборкиВСтруктуру(РезультатЗапроса, Выборка, СтруктураШтрихкода);
Если СтруктураДействий.Свойство("ИспользоватьКоличество") Тогда
СтруктураШтрихкода.Количество = СтруктураШтрихкода.Количество * СтруктураДействий.ИспользоватьКоличество;
КонецЕсли;
СтруктураПараметров.ЗначенияПоиска.Добавить(СтруктураШтрихкода);
СтруктураПараметровКлиента = Форма.ОбработатьДанныеПОВФормеСервер(СтруктураПараметров, СтруктураПараметровКлиента);
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Проанализируем плюсы и минусы обоих решений:
Для надежной промышленной эксплуатации в 1С:Розница 2.2 оптимально использовать синхронизацию поля Артикул со штатным регистром КодыТоваровSKU, избегая вмешательства в алгоритмы обработки торгового оборудования.