Как исправить ошибку «Элемент справочника со значением штрихкода уже существует» при пробитии чека с маркировкой?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Торговля и дистрибуция
← На главную

При работе с маркированной продукцией, такой как бутилированная вода, в конфигурации 1С:Управление торговлей 11.5 (включая версии 11.5.22.108 и выше), пользователи часто сталкиваются с критической ошибкой при пробитии чека: «Элемент справочника со значением штрихкода уже существует». Эта проблема блокирует розничные продажи и вызывает недоумение, так как визуально код маркировки кажется корректным, а система при этом ведет себя противоречиво: она пытается создать новый штрихкод, но сообщает, что он уже есть в базе.

В этой статье мы подробно разберем внутренние механизмы работы 1С с кодами маркировки, выясним причины возникновения конфликта уникальности и разработаем пошаговый план решения проблемы. При необходимости быстро исправить некорректные данные в базе можно использовать обработку для перепривязки и изменения реквизитов маркировки без подключения к Честному Знаку.

Разберем механику возникновения ошибки

Чтобы понять, почему возникает ошибка, проанализируем логику работы функции СоздатьШтрихкодУпаковки и сопутствующих механизмов интеграции с ИС МП (Честный ЗНАК). В системе 1С коды маркировки хранятся в справочнике ШтрихкодыУпаковокТоваров. Поиск существующей марки в базе при сканировании в чеке ККМ происходит не по самой строке кода, а по специально вычисленным хеш-суммам.

Алгоритм работы программы выглядит следующим образом:

  1. Кассир сканирует код маркировки.
  2. Система вычисляет на лету хеш-суммы для отсканированной строки (хеш значения, хеш нормализации, хеш-сумма).
  3. Программа выполняет поиск в справочнике ШтрихкодыУпаковокТоваров по этим хеш-суммам.
  4. Критический момент: Если из-за изменения алгоритмов нормализации или неверно записанных данных при приемке хеш в базе не совпадает с вновь вычисленным хешем, система считает, что этой марки в базе нет.
  5. Программа инициирует создание нового элемента в справочнике ШтрихкодыУпаковокТоваров.
  6. При попытке записи нового элемента срабатывает контроль уникальности по полю ЗначениеШтрихкода (сама строка кода). Поскольку такая строка уже физически существует в справочнике (но с другими хешами), СУБД или встроенный контроль платформы выдает ошибку.

Причина 1: Обновление алгоритмов нормализации и хеширования

Одной из наиболее частых причин в последних релизах УТ 11.5 является изменение правил формирования хеш-сумм. Если марка была заведена в систему в старой версии конфигурации (например, через ЭДО или приходный ордер), её хеши могли быть рассчитаны по старым правилам. При продаже в обновленной версии 1С применяет новые правила нормализации (удаление лишних символов, обработка криптохвоста), получает другой хеш и «теряет» связь с существующей записью.

Рассмотрим, как может выглядеть фрагмент кода, отвечающий за поиск по хешу (упрощенно):


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	Штрихкоды.Ссылка КАК Ссылка
    |ИЗ
    |	Справочник.ШтрихкодыУпаковокТоваров КАК Штрихкоды
    |ГДЕ
    |	Штрихкоды.ХэшСумма = &ХэшСумма
    |	И Штрихкоды.ЗначениеШтрихкода = &ЗначениеШтрихкода";

Запрос.УстановитьПараметр("ХэшСумма", ВычисленныйХэш);
Запрос.УстановитьПараметр("ЗначениеШтрихкода", СканированныйКод);
Результат = Запрос.Выполнить();

Если ВычисленныйХэш не совпал с тем, что хранится в поле ХэшСумма справочника, поиск вернет пустой результат, что приведет к попытке записи дубля.

Причина 2: Проблемы с символом-разделителем GS (ASCII 29)

Коды маркировки формата DataMatrix используют специальный непечатный символ GS1 (Group Separator), имеющий код ASCII 29. Проанализируем типичную ситуацию: при приемке товара сканер был настроен некорректно (например, в режиме эмуляции клавиатуры) и передал код без символа GS или заменил его пробелом. При продаже сканер может быть настроен правильно или использоваться другой драйвер, который честно передает ASCII 29.

Для системы это две разные строки. Однако при нормализации для записи в справочник 1С может пытаться привести их к общему виду, что в итоге вызывает коллизию: в справочнике уже есть запись, которая «считается» такой же, но из-за разницы в исходных данных (наличие/отсутствие GS) поиск по индексу или хешу провалился. Для исправления таких кодов можно использовать инструмент для добавления невидимых символов GS к кодам маркировки.

Причина 3: Кэш данных маркировки

Выясним роль регистра сведений КэшДанныхМаркировки. Система использует его для ускорения проверок. Если в этом регистре накопились некорректные записи, связанные с проблемным кодом, это может искажать логику функции СоздатьШтрихкодУпаковки. Программа может пытаться пересоздать объект, основываясь на неполных данных из кэша.

Способ решения 1: Пересчет хешей существующих марок

Если проблема массовая и вызвана обновлением релиза, нам необходимо привести хеши всех ранее записанных марок к актуальному формату. Для этого в типовых решениях предусмотрена специальная обработка. Пройдем по шагам:

  1. Перейдем в раздел НСИ и администрирование — Обслуживание — Корректировка данных.
  2. Найдем пункт Правила проверки полномочий или воспользуемся обработкой «Исправление штрихкодов упаковок» (в некоторых релизах она доступна через функции для технического специалиста).
  3. Запустим процедуру обновления хешей. Система перечитает все строки кодов маркировки из справочника ШтрихкодыУпаковокТоваров, заново вычислит ХэшЗначение, ХэшНормализации и ХэшСумма и перезапишет их.

Способ решения 2: Проверка регистра «Штрихкоды номенклатуры»

Хотя коды маркировки должны храниться исключительно в ШтрихкодыУпаковокТоваров, проанализируем ситуацию из практики: иногда пользователи или некорректно написанные обработки загрузки записывают КИЗы (коды идентификации) в обычный регистр сведений ШтрихкодыНоменклатуры. 1С при выполнении поиска может проверять оба источника. Если марка «засветилась» в регистре штрихкодов номенклатуры, это может блокировать её стандартную регистрацию как упаковки.

Рекомендация: Выполните поиск проблемного кода маркировки через консоль запросов по всем таблицам, где упоминаются штрихкоды. Если код найден в РегистрСведений.ШтрихкодыНоменклатуры, его следует оттуда удалить.

Способ решения 3: Настройка сканера штрихкодов

Проверим настройки торгового оборудования. Для корректной работы с водой и другими маркируемыми товарами сканер должен передавать префикс FNC1. Посмотрим на настройки драйвера в 1С:

Техническая отладка для программиста

Если вышеуказанные методы не помогли, необходимо прибегнуть к отладке. Поставим точку остановки в общем модуле в функции, отвечающей за создание упаковки. Нам нужно сравнить структуру ДанныеШтрихкода, которую система сформировала при сканировании, с данными, которые уже лежат в справочнике.

Обратите внимание на следующие параметры функции МенеджерОборудованияКлиент.ПолучитьДанныеШтрихкода:


// В процессе отладки проверьте содержимое этих полей
ДанныеШтрихкода.Текст; // Полная строка со всеми спецсимволами
ДанныеШтрихкода.ТипШтрихкода; // Должен быть DataMatrix
ДанныеШтрихкода.ХэшСумма; // Сравните это значение с тем, что в справочнике

Проанализируем ситуацию: если в базе код хранится как 01046...21... (короткий код), а вы сканируете полный код с криптохвостом (91... 92...), 1С может воспринимать их как разные объекты. В настройках Интеграции с ИС МП для бутилированной воды проверьте опцию «Продавать товары с неполным кодом маркировки». В некоторых случаях её отключение или, наоборот, включение позволяет обойти логическую ошибку создания дублей.

Итоги

Ошибка «Элемент справочника со значением штрихкода уже существует» — это следствие рассинхронизации между физическим кодом и его математическим представлением (хешем) в базе данных 1С. Для решения проблемы в первую очередь следует воспользоваться типовой обработкой пересчета хешей и проверить настройки сканирования на предмет передачи символов GS1. В исключительных случаях потребуется очистка регистра КэшДанныхМаркировки для тех позиций, по которым возникают коллизии.

← На главную