В процессе автоматизации розничной торговли алкогольной продукцией одной из самых неприятных проблем является некорректная идентификация номенклатуры при сканировании акцизных марок. Представьте ситуацию: кассир на кассе или кладовщик на складе при вскрытии тары сканирует акцизную марку бутылки одного бренда, а в документе 1С автоматически появляется совершенно другая позиция номенклатуры. При этом обычный линейный штрихкод (EAN-13) распознается абсолютно верно. Эта проблема особенно характерна для конфигураций «1С:Розница 2.2» и старых релизов линейки 2.3.
В этой статье мы подробно разберем, почему возникает этот сбой, проанализируем внутренние механизмы платформы 1С по учету алкогольной маркировки и предоставим пошаговый алгоритм устранения ошибки, который поможет вам раз и навсегда навести порядок в базе данных.
Давайте подробно рассмотрим ситуацию на конкретном примере. В базе данных есть две очень похожие позиции:
331924).331922).При сканировании марки от бутылки «ОЛД» программа подставляет правильный товар. Однако при сканировании марки от бутылки «ЯНГ» система упорно меняет её на «ОЛД». Почему так происходит, если сопоставление номенклатуры ЕГАИС, на первый взгляд, выполнено без ошибок?
Основная причина кроется в механизме кэширования связей кодов маркировки и физических товаров в 1С. Архитектура интеграции ЕГАИС и государственной информационной системы маркировки разработана таким образом, чтобы минимизировать нагрузку на базу данных при повторных операциях. Рассмотрим подробнее, как именно 1С связывает марку с карточкой товара.
При первом сканировании акцизной марки система дешифрует зашитый в ней уникальный код. В марках старого и нового образца алкогольный код (алкокод) представлен в виде буквенно-цифровой последовательности Base36. Программа выполняет декодирование этой последовательности в привычный числовой формат (Base10), чтобы сопоставить его с классификатором ЕГАИС. В старых релизах 1С:Розница существовали математические ошибки округления при таком преобразовании для очень близких по значению алкокодов. В результате марка товара «А» ошибочно распознавалась системой как марка товара «Б».
После распознавания марка связывается с конкретной карточкой номенклатуры, и эта связь записывается в специальный кэш — справочник ШтрихкодыУпаковокИТоваров. При последующих сканированиях этой марки (например, при оформлении вскрытия тары или чека ККМ) программа уже не обращается к сложным алгоритмам декодирования и сопоставления. Она мгновенно обращается к кэшу и автоматически подтягивает ту номенклатуру, связь с которой была записана ранее — пусть даже эта запись была создана ошибочно.
Чтобы окончательно решить проблему подмены товаров при сканировании, недостаточно просто проверить сопоставление в карточках номенклатуры. Нам потребуется очистить поврежденные связи в кэше и проверить регистры сведений. Рассмотрим этот процесс по шагам.
В первую очередь нам необходимо удалить ошибочные записи связи марки с неверным товаром. Сделать это стандартными средствами интерфейса кассира невозможно, поэтому нам понадобятся права администратора системы.
ШтрихкодыУпаковокИТоваров.В некоторых случаях некорректная работа алгоритмов подбора может быть связана со сбившимися статусами марок в системе. Проанализируем регистр сведений, отвечающий за это состояние:
АкцизныеМаркиЕГАИС.Также важно исключить перекрестное сопоставление алкокодов в системе. Для этого:
СоответствиеНоменклатурыЕГАИС.0001912000002331924 жестко привязан только к одной карточке «ЛОРД БАЙРОН ЯНГ», а алкокод 0001912000002331922 — к «ЛОРД БАЙРОН ОЛД».Если подобных позиций в вашей базе накопилось много, ручной поиск в справочнике ШтрихкодыУпаковокИТоваров может занять слишком много времени. Программист может написать простую обработку для автоматической очистки некорректных связей. Рассмотрим пример кода на встроенном языке 1С для группового удаления ошибочных привязок:
// Пример программной очистки кэшированных штрихкодов упаковки
Процедура ОчиститьОшибочныеШтрихкоды(ОшибочныйТовар, ПравильныйТовар) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Штрихкоды.Ссылка КАК Ссылка,
| Штрихкоды.ЗначениеШтрихкода КАК ЗначениеШтрихкода
|ИЗ
| Справочник.ШтрихкодыУпаковокИТоваров КАК Штрихкоды
|ГДЕ
| Штрихкоды.Номенклатура = &ОшибочныйТовар";
Запрос.УстановитьПараметр("ОшибочныйТовар", ОшибочныйТовар);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
// Проверяем, действительно ли штрихкод/марка относится к другому товару
// Здесь можно добавить проверку по алкокоду внутри марки
Если Найти(Выборка.ЗначениеШтрихкода, "331924") > 0 Тогда
Попытка
ОбъектШтрихкода = Выборка.Ссылка.ПолучитьОбъект();
// Либо перепривязываем к правильному товару:
ОбъектШтрихкода.Номенклатура = ПравильныйТовар;
ОбъектШтрихкода.Записать();
ЗаписьЖурналаРегистрации("Событие.ИсправлениеШтрихкода",
УровеньЖурналаРегистрации.Информация, , ,
"Успешно перенаправлен штрихкод: " + Выборка.ЗначениеШтрихкода);
Исключение
ВызватьИсключение "Не удалось обновить штрихкод упаковки: " + КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
КонецПопытки;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Для того чтобы система больше не допускала таких сбоев, рекомендуется выполнить следующие действия:
Используя приведенные инструкции, вы сможете оперативно устранить сбои при сканировании и обеспечить стабильную и бесперебойную работу вашего кассового узла и склада.