При автоматизации розничной торговли табачной продукцией многие организации сталкиваются со специфической проблемой. Для разделения сигарет по максимальным розничным ценам (МРЦ) в системе заводится учет по характеристикам, а на пачки наклеиваются внутренние штрихкоды (например, формата EAN-13, начинающиеся на «2»). Однако при продаже таких товаров в Рабочем месте кассира (РМК) возникает системный конфликт. После сканирования внутреннего штрихкода программа запрашивает марку, но при ее считывании выдает ошибку: «Код маркировки не соответствует номенклатуре» либо повторно открывает окно сканирования.
В этой статье мы подробно разберем, почему возникает данная проблема, проанализируем внутренние механизмы работы конфигурации «1С:Розница» (на примере редакции 2.3) с маркированным товаром и рассмотрим несколько практических путей решения — от изменения бизнес-процесса до доработки кода системы.
Для того чтобы понять природу ошибки, рассмотрим, как именно «1С:Розница» обрабатывает сканирование маркированной продукции. Процесс состоит из следующих шагов:
DataMatrix (кода маркировки).GTIN (он всегда эквивалентен заводскому штрихкоду EAN-8 или EAN-13).GTIN из считанной марки и пытается сопоставить его со штрихкодом, по которому товар был добавлен в чек. Поскольку в чеке фигурирует ваш внутренний штрихкод (начинающийся на «2»), а из марки считан заводской GTIN производителя, программа обнаруживает расхождение и выдает предупреждение о несоответствии номенклатуры.Таким образом, логика «1С» защищает систему от пересортицы (чтобы кассир не добавил в чек дешевые сигареты, а списал марку от дорогих), но блокирует возможность использования внутренних штрихкодов для ведения характеристик по МРЦ.
Рассмотрим наиболее правильный, с точки зрения методологии фирмы «1С» и требований Честного Знака, вариант. Расклейка внутренних штрихкодов для разделения по МРЦ — это устаревший подход, который применялся до полноценного внедрения маркировки. В современных релизах «1С:Розница» реализован автоматический подбор цены.
В структуре кода маркировки табачной продукции уже содержатся данные о максимальной розничной цене, установленной заводом-изготовителем. Нам не нужно создавать отдельные характеристики под каждую цену. Достаточно выполнить следующие настройки:
При такой схеме кассир сканирует заводской штрихкод пачки (или сразу напрямую код маркировки DataMatrix). Система сама извлекает значение МРЦ из марки и автоматически устанавливает актуальную цену продажи в документе, пересчитывая ее на лету. Это полностью исключает ручной труд по наклейке штрихкодов и дублирование характеристик в базе данных.
Если характеристики по какой-то причине необходимы (например, для специфического партионного или складского учета), проанализируем состояние регистра сведений, где хранятся привязки кодов. Очень часто ошибка несоответствия марки возникает из-за некорректно заполненных данных в базе.
Выясним, к чему привязаны штрихкоды в вашей системе:
ШтрихкодыУпаковокТоваров (в зависимости от релиза название может быть ШтрихкодыУпаковок).Если бизнес-процесс требует оставить и внутренние штрихкоды характеристик, и сканирование марки, придется воспользоваться «напильником» и изменить программный код проверки соответствия. Наша цель — объяснить системе, что внутренний штрихкод и считанный из марки заводской GTIN принадлежат одной и той же номенклатуре.
Рассмотрим, как это реализовать через расширение конфигурации, чтобы сохранить систему на поддержке.
В конфигурации за проверку штрихкодов отвечает общий модуль интеграции с ИС МП (например, функции проверки в модуле ШтрихкодированиеМОТПКлиентСервер или модулях обработки ПроверкаИПодборПродукцииИСМП). Нам необходимо переопределить функцию сравнения считанного штрихкода с полученным из марки GTIN.
Проанализируем пример кода, который можно внедрить в расширение конфигурации для обхода жесткого сопоставления:
&Вместо("ПроверитьСоответствиеШтрихкодаИМарки")
Процедура Расш_ПроверитьСоответствиеШтрихкодаИМарки(Знач ШтрихкодТовара, Знач КодМаркировки, Отказ)
// Получаем GTIN из считанного кода маркировки
GTIN_ИзМарки = ПолучитьGTINИзКодаМаркировки(КодМаркировки);
// Получаем номенклатуру по нашему внутреннему штрихкоду
НоменклатураПоШК = ПолучитьНоменклатуруПоШтрихкоду(ШтрихкодТовара);
// Получаем номенклатуру по GTIN из марки
НоменклатураПоGTIN = ПолучитьНоменклатуруПоШтрихкоду(GTIN_ИзМарки);
// Если обе номенклатуры ведут на одну и ту же карточку товара,
// то разрешаем сопоставление, несмотря на разницу в характеристиках и ШК
Если ЗначениеЗаполнено(НоменклатураПоШК) И (НоменклатураПоШК = НоменклатураПоGTIN) Тогда
// Отключаем признак отказа, так как номенклатура совпадает
Отказ = Ложь;
Возврат;
КонецЕсли;
// Если это разные товары, вызываем стандартную проверку
ПродолжитьВызов(ШтрихкодТовара, КодМаркировки, Отказ);
КонецПроцедуры
При использовании этого решения кассиру придется сканировать пачку дважды: сначала внутренний штрихкод для выбора характеристики с МРЦ, а затем марку DataMatrix. Программа сопоставит их по базовой номенклатуре и успешно добавит товар в чек.
Важное предупреждение: При отключении жесткого контроля сопоставления возрастает риск человеческого фактора. Кассир может отсканировать внутренний штрихкод от одной марки сигарет, а считать марку с совершенно другой пачки. Система пропустит эту операцию, но при отправке чека в Честный Знак уйдут некорректные данные, что может повлечь за собой штрафные санкции за пересортицу маркированного товара.
Иногда при сканировании марки табачной продукции возникает ошибка неверного формата штрихкода. Это связано с тем, что в старых релизах «1С:Розница 2.3» в таблице допустимых символов отсутствовали некоторые знаки (например, скобки), которые могут встречаться в кодах маркировки.
Рассмотрим функцию АлфавитКодамаркировки() в общем модуле ШтрихкодированиеМОТПКлиентСервер. В типовом коде она выглядит следующим образом:
Функция АлфавитКодамаркировки() Экспорт
Возврат "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!""%&'*+-./_,:;=<>?";
КонецФункции
Как мы видим, в этой строке отсутствуют символы скобок ( и ), которые могут выступать разделителями групп данных в коде маркировки. Если ваш сканер штрихкодов настроен в режиме эмуляции клавиатуры и передает скобки в поток ввода, «1С» не сможет корректно распознать код.
Для исправления этой ситуации добавьте недостающие символы в возвращаемую строку функции через расширение или обновите конфигурацию до актуального релиза, где эта ошибка уже исправлена разработчиками фирмы «1С».