Как исправить ошибку «Индекс находится за границами массива» при вводе акцизной марки в акте списания ЕГАИС в 1С:Бухгалтерии?

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

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

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

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

Проблема кроется в алгоритме валидации и сопоставления штрихкода в общем модуле или модуле интеграции с ЕГАИС в функции ЭтоШтрихкодАкцизнойМарки. Посмотрим на фрагмент типового кода, приводящий к сбою:


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

Обратим внимание на строку обращения к табличной части: Выборка.Упаковки.Выгрузить()[0].Упаковка. Здесь программный код выгружает вложенную таблицу Упаковки в объект ТаблицаЗначений и сразу пытается обратиться к первой строке по индексу [0] без предварительной проверки количества записей.

Если в справочнике КлассификаторАлкогольнойПродукцииЕГАИС у найденной алкогольной позиции табличная часть Упаковки не заполнена (содержит 0 строк), выгруженная таблица значений оказывается пустой. Попытка чтения нулевого индекса немедленно вызывает исключение платформы «Индекс находится за границами массива».

Решение 1. Заполнение данных в пользовательском режиме (без изменения конфигурации)

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

  1. Определим проблемную позицию алкогольной продукции. По коду марки или наименованию номенклатуры перейдем в справочник КлассификаторАлкогольнойПродукцииЕГАИС (раздел Администрирование или Склад / ЕГАИС).
  2. Проверим табличную часть упаковок. Откроем карточку алкогольной продукции и перейдем на вкладку или в раздел с сопоставлением упаковок (единиц измерения).
  3. Заполним недостающие данные. Добавим хотя бы одну строку в табличную часть Упаковки, указав сопоставленную упаковку или базовую единицу измерения номенклатуры (например, «бут» или «шт»).
  4. Сохраним элемент справочника. Нажмем кнопку Записать и закрыть.
  5. Альтернативный вариант: Выполним повторный запрос алкогольной продукции из ЕГАИС по коду ФСРАР или коду продукции, чтобы актуализировать классификатор и его связанные данные с серверов ЕГАИС.

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

Решение 2. Программное исправление через расширение или конфигуратор

Если используется версия ПРОФ или КОРП, устраним ошибку на уровне исходного кода, добавив безопасную проверку наличия записей в табличной части перед чтением по индексу.

Рассмотрим исправленный фрагмент кода:


Если Выборка.Следующий() Тогда
	СопоставленнаяНоменклатура = Новый Структура;
	СопоставленнаяНоменклатура.Вставить("НоменклатураЕГАИС", Выборка.Ссылка);
	СопоставленнаяНоменклатура.Вставить("Номенклатура", Выборка.Номенклатура);
	СопоставленнаяНоменклатура.Вставить("Характеристика", Выборка.Характеристика);
	
	ТаблицаУпаковок = Выборка.Упаковки.Выгрузить();
	Если ТаблицаУпаковок.Количество() > 0 Тогда
		СопоставленнаяНоменклатура.Вставить("Упаковка", ТаблицаУпаковок[0].Упаковка);
	Иначе
		СопоставленнаяНоменклатура.Вставить("Упаковка", Справочники.УпаковкиЕдиницыИзмерения.ПустаяСсылка());
	КонецЕсли;
КонецЕсли;

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

Особенности для базовых версий и обновлений

Разберем важные нюансы, с которыми сталкиваются пользователи:

  1. Откат на предыдущий релиз не всегда помогает. Если в самой базе данных уже присутствуют элементы классификатора ЕГАИС с незаполненной табличной частью Упаковки, ошибка продолжит воспроизводиться и на более старых релизах конфигурации.
  2. Установка патчей (исправлений). Для базовых версий рекомендуется проверить наличие официальных патчей расширений (.cfe) от разработчиков через раздел Администрирование — Обслуживание — Обновление программы — Установленные исправления (патчи).
  3. Обновление конфигурации. При выходе очередного релиза библиотеки интеграции с ЕГАИС данная уязвимость устраняется централизованно разработчиками 1С.
← На главную