При использовании кассовых аппаратов АТОЛ в режиме принтера чеков (документов) без установленного или активированного фискального накопителя пользователи конфигурации 1С:Розница (в частности, релиза 2.2.6) могут столкнуться с аварийным завершением операции печати чека. Система выдает сообщение об ошибке: «Индекс находится за границами массива». Проанализируем причину этой проблемы и рассмотрим по шагам все возможные способы её устранения.
Разберем внутренний механизм работы подсистемы «Библиотека подключаемого оборудования» (БПО). При отправке чека на печать конфигурация запрашивает текущий статус устройства через команду GetCurrentStatus. В штатном режиме работы онлайн-кассы с фискальным накопителем драйвер возвращает массив параметров, содержащий заводской номер ФН на определенной позиции.
Если устройство работает в режиме чекопечатающей машинки (ЧПМ / ЕНВД) без ФН, драйвер ККТ возвращает массив с меньшим количеством элементов. В коде ранних релизов конфигурации обращение к заводскому номеру ФН происходило напрямую по фиксированному индексу:
РезультатКоманды = ОбработчикДрайвераМодуль.ВыполнитьКоманду("GetCurrentStatus", ВходныеПараметры, ВыходныеПараметры, ОбъектДрайвера, ПодключенноеУстройство.Параметры, ПодключенноеУстройство.ПараметрыПодключения);
Если РезультатКоманды Тогда
// Увеличиваем инкремент номера последнего чека
ВыходныеПараметры[1] = ВыходныеПараметры[1] + 1;
ЗаводскойНомерФН = ВыходныеПараметры[5];
КонецЕсли;
Так как шестой элемент массива с индексом 5 в ответе отсутствует, платформа генерирует исключение выхода за границы массива. Выясним, какими способами можно восстановить работоспособность кассового узла.
Рассмотрим доработку кода, которая позволяет безопасно получать данные из массива вне зависимости от того, вернул ли драйвер заводской номер ФН.
МенеджерОборудованияКлиент или специализированные модули драйвера БПО).ВыходныеПараметры.Посмотрим на пример корректного фрагмента кода:
// Вместо прямого присвоения:
// ЗаводскойНомерФН = ВыходныеПараметры[5];
// Прописываем безопасное получение значения:
ЗаводскойНомерФН = ?(ВыходныеПараметры.Количество() > 5, ВыходныеПараметры[5], Неопределено);
Обратите внимание: аналогичные вызовы могут встречаться в нескольких процедурах подсистемы подключения оборудования, поэтому рекомендуется выполнить поиск по тексту ВыходныеПараметры[5] во всей конфигурации и обезопасить каждое вхождение.
Проанализируем штатный путь решения проблемы. Начиная с релизов ветки 2.2.7 и выше, разработчики 1С обновили Библиотеку подключаемого оборудования. В типовой код были внесены проверки длины массивов ответов драйвера, что полностью устраняет ошибку при работе с кассами без ФН.
Этот вариант является наиболее рекомендуемым, так как сохраняет конфигурацию на полной типовой поддержке поставщика без необходимости ручной модификации кода.
Если обновление конфигурации или правка кода невозможны в текущий момент (например, при использовании базовой версии без возможности доработок), рассмотрим вариант изменения типа подключения кассы в 1С:
При такой схеме вызов метода GetCurrentStatus будет происходить по альтернативной ветке алгоритма БПО, где опрос фискального накопителя не выполняется, и чек пробьется без ошибок.