При работе в 1С:Управление нашей фирмой (УНФ) пользователи часто сталкиваются с ситуацией, когда при нажатии кнопки «Сгенерировать» программа выдает штрихкод формата EAN-13, который уже назначен другому товару. На первый взгляд это кажется невозможным, ведь диапазон внутренних штрихкодов огромен. Однако, из-за особенностей механизмов платформы 1С и специфики хранения данных, такие сбои случаются. В этой статье мы подробно разберем, почему это происходит и как навести порядок в системе штрихкодирования.
Прежде чем исправлять ошибку, давайте проанализируем, как система понимает, какой следующий код нужно выдать. Для внутренних нужд в 1С обычно используется префикс «20» (или диапазон от 20 до 29). Алгоритм работает по следующему принципу:
ШтрихкодыНоменклатуры.EAN-13).Проблема кроется в том, что штрихкод в 1С — это строка, а не число. Рассмотрим подробнее, к чему это приводит.
Проанализируем ситуацию: если в базу вручную был введен штрихкод, который выбивается из общей логики (например, слишком длинный или со странным префиксом), функция МАКСИМУМ в запросе может вернуть некорректный результат. Если в последовательности есть код 209999999999, система может решить, что лимит исчерпан, или начать отсчет заново с 200000000001, который уже давно занят.
Что нужно сделать:
Откроем регистр сведений «Штрихкоды номенклатуры» (через «Все функции» или «Функции для технического специалиста»). Отсортируем список по колонке «Штрихкод» по возрастанию. Прокрутим список в самый низ и внимательно изучим последние 20–30 записей. Если мы видим там коды, введенные вручную, которые нарушают числовую последовательность, их необходимо исправить или удалить.
Выясним, разрешено ли в вашей базе в принципе создавать дубли. В 1С:УНФ существует функциональная опция, которая управляет этим поведением.
Рассмотрим путь к настройке:
Если эта галочка установлена, система не будет блокировать запись дубля. Даже если генератор по какой-то причине предложил старый код, программа «молча» запишет его. Рекомендуется снять этот флаг, чтобы система выдавала предупреждение при попытке записи дубликата. Это поможет локализовать проблему в момент ее возникновения.
Если вы работаете в распределенной информационной базе, причина дублей почти всегда кроется в настройках узлов. Представим, что Магазин №1 и Магазин №2 генерируют коды независимо. Без специальных настроек они оба начнут с кода 200000000001. При синхронизации возникнет коллизия.
Чтобы этого избежать, необходимо для каждого узла РИБ задать свой уникальный префикс штрихкода. Например:
В этом случае диапазоны никогда не пересекутся.
Иногда штатный механизм 1С не просто ищет «максимальный + 1», а пытается найти свободный номер внутри существующего диапазона (так называемые «дырки» после удаления старых товаров). Если этот алгоритм работает некорректно, он может выдать номер, который числится «свободным» в индексе, но фактически занят в таблице данных (проблема кэширования или итогов).
Для решения этой проблемы на уровне кода можно использовать следующий подход (пример для разработчика):
Функция ПолучитьСледующийСвободныйШтрихкод(Префикс) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| Штрихкоды.Штрихкод КАК Штрихкод
|ИЗ
| РегистрСведений.ШтрихкодыНоменклатуры КАК Штрихкоды
|ГДЕ
| Штрихкоды.Штрихкод ПОДОБНО &Префикс
|УПОРЯДОЧИТЬ ПО
| Штрихкоды.Штрихкод УБЫВ";
Запрос.УстановитьПараметр("Префикс", Префикс + "%");
// Далее следует логика очистки строки от контрольного символа
// и инкрементация числовой части
КонецФункции
Рассмотрим алгоритм действий, который поможет вам восстановить корректную генерацию:
MAX. Перезапустите службу сервера 1С или выполните очистку серверного кэша.20.Проанализировав ситуацию, можно сделать вывод: в 90% случаев проблема решается либо удалением одного-единственного «кривого» штрихкода (например, 2099999999999), который кто-то ввел ради шутки или по ошибке, либо настройкой уникальных префиксов для разных узлов базы данных. Помните, что EAN-13 требует строгого соблюдения структуры, и любое отклонение в длине строки в регистре сбивает штатные механизмы 1С.