При работе с маркированной продукцией, такой как бутилированная вода, в конфигурации 1С:Управление торговлей 11.5 (включая версии 11.5.22.108 и выше), пользователи часто сталкиваются с критической ошибкой при пробитии чека: «Элемент справочника со значением штрихкода уже существует». Эта проблема блокирует розничные продажи и вызывает недоумение, так как визуально код маркировки кажется корректным, а система при этом ведет себя противоречиво: она пытается создать новый штрихкод, но сообщает, что он уже есть в базе.
В этой статье мы подробно разберем внутренние механизмы работы 1С с кодами маркировки, выясним причины возникновения конфликта уникальности и разработаем пошаговый план решения проблемы. При необходимости быстро исправить некорректные данные в базе можно использовать обработку для перепривязки и изменения реквизитов маркировки без подключения к Честному Знаку.
Чтобы понять, почему возникает ошибка, проанализируем логику работы функции СоздатьШтрихкодУпаковки и сопутствующих механизмов интеграции с ИС МП (Честный ЗНАК). В системе 1С коды маркировки хранятся в справочнике ШтрихкодыУпаковокТоваров. Поиск существующей марки в базе при сканировании в чеке ККМ происходит не по самой строке кода, а по специально вычисленным хеш-суммам.
Алгоритм работы программы выглядит следующим образом:
ШтрихкодыУпаковокТоваров по этим хеш-суммам.ШтрихкодыУпаковокТоваров.Одной из наиболее частых причин в последних релизах УТ 11.5 является изменение правил формирования хеш-сумм. Если марка была заведена в систему в старой версии конфигурации (например, через ЭДО или приходный ордер), её хеши могли быть рассчитаны по старым правилам. При продаже в обновленной версии 1С применяет новые правила нормализации (удаление лишних символов, обработка криптохвоста), получает другой хеш и «теряет» связь с существующей записью.
Рассмотрим, как может выглядеть фрагмент кода, отвечающий за поиск по хешу (упрощенно):
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Штрихкоды.Ссылка КАК Ссылка
|ИЗ
| Справочник.ШтрихкодыУпаковокТоваров КАК Штрихкоды
|ГДЕ
| Штрихкоды.ХэшСумма = &ХэшСумма
| И Штрихкоды.ЗначениеШтрихкода = &ЗначениеШтрихкода";
Запрос.УстановитьПараметр("ХэшСумма", ВычисленныйХэш);
Запрос.УстановитьПараметр("ЗначениеШтрихкода", СканированныйКод);
Результат = Запрос.Выполнить();
Если ВычисленныйХэш не совпал с тем, что хранится в поле ХэшСумма справочника, поиск вернет пустой результат, что приведет к попытке записи дубля.
Коды маркировки формата DataMatrix используют специальный непечатный символ GS1 (Group Separator), имеющий код ASCII 29. Проанализируем типичную ситуацию: при приемке товара сканер был настроен некорректно (например, в режиме эмуляции клавиатуры) и передал код без символа GS или заменил его пробелом. При продаже сканер может быть настроен правильно или использоваться другой драйвер, который честно передает ASCII 29.
Для системы это две разные строки. Однако при нормализации для записи в справочник 1С может пытаться привести их к общему виду, что в итоге вызывает коллизию: в справочнике уже есть запись, которая «считается» такой же, но из-за разницы в исходных данных (наличие/отсутствие GS) поиск по индексу или хешу провалился. Для исправления таких кодов можно использовать инструмент для добавления невидимых символов GS к кодам маркировки.
Выясним роль регистра сведений КэшДанныхМаркировки. Система использует его для ускорения проверок. Если в этом регистре накопились некорректные записи, связанные с проблемным кодом, это может искажать логику функции СоздатьШтрихкодУпаковки. Программа может пытаться пересоздать объект, основываясь на неполных данных из кэша.
Если проблема массовая и вызвана обновлением релиза, нам необходимо привести хеши всех ранее записанных марок к актуальному формату. Для этого в типовых решениях предусмотрена специальная обработка. Пройдем по шагам:
ШтрихкодыУпаковокТоваров, заново вычислит ХэшЗначение, ХэшНормализации и ХэшСумма и перезапишет их.Хотя коды маркировки должны храниться исключительно в ШтрихкодыУпаковокТоваров, проанализируем ситуацию из практики: иногда пользователи или некорректно написанные обработки загрузки записывают КИЗы (коды идентификации) в обычный регистр сведений ШтрихкодыНоменклатуры. 1С при выполнении поиска может проверять оба источника. Если марка «засветилась» в регистре штрихкодов номенклатуры, это может блокировать её стандартную регистрацию как упаковки.
Рекомендация: Выполните поиск проблемного кода маркировки через консоль запросов по всем таблицам, где упоминаются штрихкоды. Если код найден в РегистрСведений.ШтрихкодыНоменклатуры, его следует оттуда удалить.
Проверим настройки торгового оборудования. Для корректной работы с водой и другими маркируемыми товарами сканер должен передавать префикс FNC1. Посмотрим на настройки драйвера в 1С:
Если вышеуказанные методы не помогли, необходимо прибегнуть к отладке. Поставим точку остановки в общем модуле в функции, отвечающей за создание упаковки. Нам нужно сравнить структуру ДанныеШтрихкода, которую система сформировала при сканировании, с данными, которые уже лежат в справочнике.
Обратите внимание на следующие параметры функции МенеджерОборудованияКлиент.ПолучитьДанныеШтрихкода:
// В процессе отладки проверьте содержимое этих полей
ДанныеШтрихкода.Текст; // Полная строка со всеми спецсимволами
ДанныеШтрихкода.ТипШтрихкода; // Должен быть DataMatrix
ДанныеШтрихкода.ХэшСумма; // Сравните это значение с тем, что в справочнике
Проанализируем ситуацию: если в базе код хранится как 01046...21... (короткий код), а вы сканируете полный код с криптохвостом (91... 92...), 1С может воспринимать их как разные объекты. В настройках Интеграции с ИС МП для бутилированной воды проверьте опцию «Продавать товары с неполным кодом маркировки». В некоторых случаях её отключение или, наоборот, включение позволяет обойти логическую ошибку создания дублей.
Ошибка «Элемент справочника со значением штрихкода уже существует» — это следствие рассинхронизации между физическим кодом и его математическим представлением (хешем) в базе данных 1С. Для решения проблемы в первую очередь следует воспользоваться типовой обработкой пересчета хешей и проверить настройки сканирования на предмет передачи символов GS1. В исключительных случаях потребуется очистка регистра КэшДанныхМаркировки для тех позиций, по которым возникают коллизии.