Как исправить ошибку «получение элемента по индексу для значения не определено» при сканировании акцизной марки в РМК 1С:Розница?

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

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

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

Симптомы проблемы и сценарий воспроизведения ошибки

Давайте проанализируем ситуацию, в которой проявляется эта ошибка. Как показывает практика работы торговых точек, сбой происходит далеко не при каждой продаже алкоголя. Более того, если кассир сразу сканирует акцизную марку бутылки, система отрабатывает штатно — товар быстро и без проблем добавляется в чек.

Однако классический и наиболее правильный алгоритм продажи алкогольной продукции (рекомендованный ФС-РАР) выглядит иначе:

  1. Кассир сначала считывает стандартный штрихкод товара (EAN-13), расположенный на этикетке бутылки.
  2. Программа успешно идентифицирует номенклатуру, определяет, что это маркируемый алкоголь, и открывает диалоговое окно с требованием отсканировать акцизную марку.
  3. Кассир сканирует 2D-код акцизной марки с федеральной специальной марки (ФСМ).
  4. В этот момент на экране кассы вместо добавления товара в чек появляется окно критической ошибки платформы: «получение элемента по индексу для значения не определено».

Давайте выясним, почему порядок действий кассира кардинально влияет на стабильность работы программы.

Выясняем причину: почему марки появляются в базе в нижнем регистре?

В процессе исследования базы данных мы можем обнаружить удивительный факт: некоторые штрихкоды упаковок сохранены в справочнике ШтрихкодыУпаковокТоваров строчными (маленькими) буквами, например: 22n000004cvf7rda7q30... вместо стандартного верхнего регистра: 22N000004CVF7RDA7Q30....

Каким же образом данные элементы попадают в базу в таком виде? Выделим две основные причины:

  1. Импорт входящих ТТН ЕГАИС от поставщиков. При помарочном учете алкогольной продукции сведения о марках поступают в магазин в электронном виде через накладные ЕГАИС (в формате XML). Некоторые дистрибьюторы или производители при формировании файлов отправляют коды марок в нижнем регистре. При обработке входящей ТТН в старых релизах конфигурации 1С:Розница (в частности, в ветке 2.2.8) парсер XML-данных записывал эти штрихкоды в справочник «как есть», без принудительной конвертации символов в верхний регистр.
  2. Некорректные настройки сканера штрихкодов. Если сканер подключен в режиме эмуляции клавиатуры (Keyboard Wedge) и в момент сканирования на компьютере кассира включен режим Caps Lock или активна альтернативная раскладка клавиатуры, драйвер оборудования может инвертировать регистр передаваемых символов.

Технический анализ: почему падает платформа 1С?

Разберем, почему разница в регистре символов приводит к аварийному завершению работы РМК. Для этого сопоставим поведение платформы в двух разных сценариях работы:

Сценарий без ошибки (сканирование сразу по марке): Когда кассир считывает марку напрямую, система выполняет полнотекстовый SQL-запрос к базе данных для поиска соответствующей номенклатуры. Поиск в СУБД (MS SQL, PostgreSQL или файловой СУБД 1С) по умолчанию является регистронезависимым. База данных успешно находит нужную запись в справочнике ШтрихкодыУпаковокТоваров, сопоставляет её с алкогольной продукцией и добавляет товар в корзину.

Сценарий с ошибкой (сначала EAN-13, затем марка): Здесь логика работы программы кардинально меняется:

  1. При сканировании EAN-13 система находит номенклатуру и предварительно загружает из базы данных в оперативную память все зарегистрированные для этого товара марки (штрихкоды упаковок).
  2. Эти марки помещаются во встроенный объект платформы Соответствие (в коде за это отвечает переменная, условно назовем ее Результат), где ключом выступает сам текст штрихкода.
  3. Внимание! Объект Соответствие в платформе 1С:Предприятие является регистрозависимым. Если в базе марка была записана строчными буквами, то в коллекции Соответствие ключ сохранится в виде "22n...".
  4. Кассир считывает физическую марку с бутылки. Сканер передает её в стандартном верхнем регистре — "22N...".
  5. Программа выполняет поиск по коллекции: Результат[Штрихкод]. Из-за несовпадения регистров (строчные буквы в ключе против прописных в запросе) поиск возвращает пустое значение — Неопределено.
  6. Далее в коде конфигурации отсутствует проверка результата поиска на пустоту. Программа сразу пытается обратиться к элементам найденной коллекции по индексу (например, для получения массива упаковок): МассивУпаковок = Результат[Штрихкод][0]; Поскольку Результат[Штрихкод] вернул Неопределено, платформа выполняет операцию Неопределено[0], что моментально вызывает исключение: «Получение элемента по индексу для значения не определено».

Решение проблемы: исправляем ошибку раз и навсегда

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

Способ 1. Обновление конфигурации (рекомендуемый метод)

Разработчики 1С признали данное поведение ошибкой и исправили его в последующих релизах. Начиная с релиза 2.2.11.29 (и далее во всех версиях линейки 2.3), в модули работы с ЕГАИС и штрихкодами было добавлено принудительное преобразование всех считываемых и загружаемых марок к верхнему регистру с помощью функции ВРег(). Если у вас есть возможность, выполните обновление вашей конфигурации 1С:Розница до актуального релиза.

Способ 2. Временная доработка кода (если обновление невозможно)

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

  1. Откроем конфигуратор вашей базы данных.
  2. Найдем справочник ШтрихкодыУпаковокТоваров.
  3. Откроем его Модуль менеджера.
  4. Найдем процедуру, отвечающую за заполнение соответствия штрихкодов (ориентируемся по строке заполнения коллекции Результат.Вставить(...)).
  5. В месте, где происходит добавление штрихкода в коллекцию, применим функцию ВРег() для приведения ключа к верхнему регистру.

Пример изменения строки кода:


// Было:
Результат.Вставить(СтрокаТЧ.ЗначениеШтрихкода, МассивУпаковок);

// Стало:
Результат.Вставить(ВРег(СтрокаТЧ.ЗначениеШтрихкода), МассивУпаковок);

Это простое исправление гарантирует, что даже если марка записана в базе маленькими буквами, в коллекцию поиска она попадет в верхнем регистре, и сбой при сканировании прекратится.

Способ 3. Массовое исправление существующих марок в базе данных

Чтобы окончательно очистить базу от некорректных записей в нижнем регистре, нам необходимо преобразовать их к верхнему регистру. Для этого мы можем написать и запустить простую одноразовую обработку.

Рассмотрим пример кода внешней обработки, выполняющей обход справочника ШтрихкодыУпаковокТоваров:


Выборка = Справочники.ШтрихкодыУпаковокТоваров.Выбрать();
Пока Выборка.Следующий() Цикл
    // Проверяем, отличается ли текущий регистр от верхнего
    Если Выборка.ЗначениеШтрихкода <> ВРег(Выборка.ЗначениеШтрихкода) Тогда
        Попытка
            ОбъектМарки = Выборка.ПолучитьОбъект();
            ОбъектМарки.ЗначениеШтрихкода = ВРег(Выборка.ЗначениеШтрихкода);
            ОбъектМарки.Записать();
        Исключение
            ЗаписьЖурналаРегистрации("ИсправлениеМарок", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
        КонецПопытки;
    КонецЕсли;
КонецЦикла;

Важно: Перед запуском любого корректирующего кода обязательно выполните резервное копирование вашей информационной базы!

Способ 4. Правильная настройка сканера штрихкода

Для предотвращения искажения регистра символов в процессе сканирования крайне рекомендуется отказаться от работы сканера в режиме эмуляции клавиатуры. Выполним следующие настройки:

  1. Переведем сканер 2D-кодов в режим эмуляции Virtual COM Port (для этого необходимо отсканировать специальный управляющий штрихкод из инструкции к вашему сканеру).
  2. Установим на кассовый компьютер официальный драйвер виртуального COM-порта от производителя оборудования (например, Honeywell, Zebra, Datalogic).
  3. В программе 1С:Розница перейдем в меню «Администрирование» — «Подключаемое оборудование» и настроим сканер штрихкода на работу через СОМ-порт с использованием интерфейса 1С:Предприятие (NativeAPI).

Это полностью исключит влияние раскладки клавиатуры операционной системы на регистр передаваемых в 1С символов.

Способ 5. Временный обходной путь для кассиров в РМК

Если ошибка произошла прямо посреди рабочей смены и у вас нет возможности немедленно программировать или менять настройки оборудования, проинструктируйте кассира выполнять продажу по альтернативному сценарию:

  1. В интерфейсе РМК нажать кнопку «Поиск» (или клавишу F11).
  2. Выбрать пункт «Поиск по штрихкоду».
  3. Считать сканером штрихкод EAN-13 алкогольного товара.
  4. Выбрать найденную позицию в списке.
  5. Считать акцизную марку в появившемся окне запроса.

При таком алгоритме программа задействует другие механизмы сопоставления данных, которые не вызывают критического падения системы.

Используя приведенные инструкции, вы сможете быстро локализовать и устранить сбой, обеспечив бесперебойную работу кассового узла торговой точки!

← На главную