При оформлении документа Акт списания ЕГАИС (с причиной «Реализация» или иной причиной, требующей помарочного учета) в процессе сканирования или ручного ввода акцизной марки может возникать критическая ошибка: «Индекс находится за границами массива». В результате добавление алкогольной продукции в документ блокируется, и провести списание становится невозможно.
Проанализируем техническую причину возникновения данной ошибки, разберем проблемный фрагмент программного кода и рассмотрим по шагам способы решения проблемы как для пользователей, так и для программистов 1С.
Проблема кроется в алгоритме валидации и сопоставления штрихкода в общем модуле или модуле интеграции с ЕГАИС в функции ЭтоШтрихкодАкцизнойМарки. Посмотрим на фрагмент типового кода, приводящий к сбою:
КодКлассификатораНоменклатурыЕГАИС = КодКлассификатораНоменклатурыЕГАИС(Штрихкод);
Запрос = Новый Запрос(
"ВЫБРАТЬ ПЕРВЫЕ 1
| КлассификаторАлкогольнойПродукцииЕГАИС.Ссылка КАК Ссылка,
| КлассификаторАлкогольнойПродукцииЕГАИС.Номенклатура КАК Номенклатура,
| КлассификаторАлкогольнойПродукцииЕГАИС.Характеристика КАК Характеристика,
| КлассификаторАлкогольнойПродукцииЕГАИС.Упаковки.(
| Ссылка,
| НомерСтроки,
| ИдентификаторУпаковки,
| Упаковка
| ) КАК Упаковки
|ИЗ
| Справочник.КлассификаторАлкогольнойПродукцииЕГАИС КАК КлассификаторАлкогольнойПродукцииЕГАИС
|ГДЕ
| КлассификаторАлкогольнойПродукцииЕГАИС.Код = &КодКлассификатораНоменклатурыЕГАИС");
Запрос.Параметры.Вставить("КодКлассификатораНоменклатурыЕГАИС", КодКлассификатораНоменклатурыЕГАИС);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
СопоставленнаяНоменклатура = Новый Структура;
СопоставленнаяНоменклатура.Вставить("НоменклатураЕГАИС", Выборка.Ссылка);
СопоставленнаяНоменклатура.Вставить("Номенклатура", Выборка.Номенклатура);
СопоставленнаяНоменклатура.Вставить("Характеристика", Выборка.Характеристика);
СопоставленнаяНоменклатура.Вставить("Упаковка", Выборка.Упаковки.Выгрузить()[0].Упаковка);
КонецЕсли;
Обратим внимание на строку обращения к табличной части: Выборка.Упаковки.Выгрузить()[0].Упаковка. Здесь программный код выгружает вложенную таблицу Упаковки в объект ТаблицаЗначений и сразу пытается обратиться к первой строке по индексу [0] без предварительной проверки количества записей.
Если в справочнике КлассификаторАлкогольнойПродукцииЕГАИС у найденной алкогольной позиции табличная часть Упаковки не заполнена (содержит 0 строк), выгруженная таблица значений оказывается пустой. Попытка чтения нулевого индекса немедленно вызывает исключение платформы «Индекс находится за границами массива».
Данный способ подходит для любых версий программы, включая базовые версии, где редактирование конфигуратора заблокировано разработчиками. Разберем порядок действий:
КлассификаторАлкогольнойПродукцииЕГАИС (раздел Администрирование или Склад / ЕГАИС).Упаковки, указав сопоставленную упаковку или базовую единицу измерения номенклатуры (например, «бут» или «шт»).После корректного заполнения табличной части выгрузка таблицы вернет как минимум одну строку, и считывание марки в акте списания пройдет без ошибок.
Если используется версия ПРОФ или КОРП, устраним ошибку на уровне исходного кода, добавив безопасную проверку наличия записей в табличной части перед чтением по индексу.
Рассмотрим исправленный фрагмент кода:
Если Выборка.Следующий() Тогда
СопоставленнаяНоменклатура = Новый Структура;
СопоставленнаяНоменклатура.Вставить("НоменклатураЕГАИС", Выборка.Ссылка);
СопоставленнаяНоменклатура.Вставить("Номенклатура", Выборка.Номенклатура);
СопоставленнаяНоменклатура.Вставить("Характеристика", Выборка.Характеристика);
ТаблицаУпаковок = Выборка.Упаковки.Выгрузить();
Если ТаблицаУпаковок.Количество() > 0 Тогда
СопоставленнаяНоменклатура.Вставить("Упаковка", ТаблицаУпаковок[0].Упаковка);
Иначе
СопоставленнаяНоменклатура.Вставить("Упаковка", Справочники.УпаковкиЕдиницыИзмерения.ПустаяСсылка());
КонецЕсли;
КонецЕсли;
Такая доработка гарантирует, что даже при полностью пустой табличной части классификатора алкогольной продукции платформа 1С не прервет выполнение операции исключением, а подставит пустое значение упаковки.
Разберем важные нюансы, с которыми сталкиваются пользователи:
Упаковки, ошибка продолжит воспроизводиться и на более старых релизах конфигурации..cfe) от разработчиков через раздел Администрирование — Обслуживание — Обновление программы — Установленные исправления (патчи).