Как устранить ошибку Индекс находится за границами массива при пробитии чека в 1С:Розница

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

При использовании кассовых аппаратов АТОЛ в режиме принтера чеков (документов) без установленного или активированного фискального накопителя пользователи конфигурации 1С:Розница (в частности, релиза 2.2.6) могут столкнуться с аварийным завершением операции печати чека. Система выдает сообщение об ошибке: «Индекс находится за границами массива». Проанализируем причину этой проблемы и рассмотрим по шагам все возможные способы её устранения.

Причина возникновения ошибки

Разберем внутренний механизм работы подсистемы «Библиотека подключаемого оборудования» (БПО). При отправке чека на печать конфигурация запрашивает текущий статус устройства через команду GetCurrentStatus. В штатном режиме работы онлайн-кассы с фискальным накопителем драйвер возвращает массив параметров, содержащий заводской номер ФН на определенной позиции.

Если устройство работает в режиме чекопечатающей машинки (ЧПМ / ЕНВД) без ФН, драйвер ККТ возвращает массив с меньшим количеством элементов. В коде ранних релизов конфигурации обращение к заводскому номеру ФН происходило напрямую по фиксированному индексу:


РезультатКоманды = ОбработчикДрайвераМодуль.ВыполнитьКоманду("GetCurrentStatus", ВходныеПараметры, ВыходныеПараметры, ОбъектДрайвера, ПодключенноеУстройство.Параметры, ПодключенноеУстройство.ПараметрыПодключения);
Если РезультатКоманды Тогда
    // Увеличиваем инкремент номера последнего чека
    ВыходныеПараметры[1] = ВыходныеПараметры[1] + 1;
    ЗаводскойНомерФН = ВыходныеПараметры[5];
КонецЕсли;

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

Способ 1. Исправление программного кода конфигурации или создание расширения

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

  1. Откроем конфигурацию в режиме Конфигуратор (или создадим новое расширение конфигурации, если используется версия ПРОФ/КОРП и конфигурация находится на поддержке).
  2. Найдем модули обработки кассовых операций (например, МенеджерОборудованияКлиент или специализированные модули драйвера БПО).
  3. Заменим прямое обращение к элементу массива на тернарный оператор с предварительной проверкой общего количества элементов в массиве ВыходныеПараметры.

Посмотрим на пример корректного фрагмента кода:


// Вместо прямого присвоения:
// ЗаводскойНомерФН = ВыходныеПараметры[5];

// Прописываем безопасное получение значения:
ЗаводскойНомерФН = ?(ВыходныеПараметры.Количество() > 5, ВыходныеПараметры[5], Неопределено);

Обратите внимание: аналогичные вызовы могут встречаться в нескольких процедурах подсистемы подключения оборудования, поэтому рекомендуется выполнить поиск по тексту ВыходныеПараметры[5] во всей конфигурации и обезопасить каждое вхождение.

Способ 2. Обновление конфигурации 1С:Розница

Проанализируем штатный путь решения проблемы. Начиная с релизов ветки 2.2.7 и выше, разработчики 1С обновили Библиотеку подключаемого оборудования. В типовой код были внесены проверки длины массивов ответов драйвера, что полностью устраняет ошибку при работе с кассами без ФН.

  1. Создадим резервную копию информационной базы.
  2. Выполним обновление конфигурации 1С:Розница до актуального релиза.
  3. Обновим компоненты интеграции драйверов ККТ через меню Администрирование > Подключаемое оборудование > Драйверы оборудования.

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

Способ 3. Перенастройка типа оборудования в 1С

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

  1. Перейдем в раздел Администрирование > Подключаемое оборудование.
  2. Удалим или отключим текущий экземпляр устройства из группы ККТ с передачей данных.
  3. Добавим аппарат в раздел Фискальные регистраторы (старый протокол) или настроим его как Принтер чеков, используя соответствующие классические драйверы (например, ДТО 8.x в режиме работы без передачи данных).
  4. Проведем повторный тест устройства и проверим печать чека из рабочего места кассира (РМК).

При такой схеме вызов метода GetCurrentStatus будет происходить по альтернативной ветке алгоритма БПО, где опрос фискального накопителя не выполняется, и чек пробьется без ошибок.

← На главную