При работе с алкогольной продукцией, обработке товарно-транспортных накладных (ТТН) или выполнении корректировки остатков ЕГАИС пользователи и программисты могут столкнуться с критической ошибкой платформы:
{ОбщийМодуль.КорректировкаОстатковЕГАИСПереопределяемый.Модуль(254)}: Индекс находится за границами массива
В строке сбоя выполняется обращение к элементу таблицы или массива по расчетному номеру строки:
СтрокаТаблицы = ТаблицаСопоставления[Выборка.НомерСтроки - 1];
В результате работа с документами блокируется, система не дает войти в форму ТТН или провести документ. Разберем детально, почему возникает эта неполадка и какими способами ее можно устранить.
Проанализируем техническую причину сбоя. Платформа 1С строго контролирует границы коллекций: элементы индексируются от нуля до Количество() - 1. Если переданный индекс отрицательный либо превышает максимальный номер элемента, выполнение программы немедленно прерывается.
В типовом механизме обращение Выборка.НомерСтроки - 1 предполагает, что коллекция ТаблицаСопоставления строго синхронизирована с обходом выборки или табличной частью документа по количеству и порядку строк. Однако на практике эта логика нарушается по нескольким причинам:
ТаблицаСопоставления часто формируется с предварительным отбором (например, отсекаются невалидные марки, позиции без сопоставления или дубликаты), тогда как исходная выборка содержит все строки без фильтрации. Когда итератор доходит до строки с номером больше, чем число элементов в таблице сопоставления, генерируется исключение.НомерСтроки теряет линейную последовательность 1, 2, 3... Соответственно, смещение перестает указывать на корректный индекс.НомерСтроки <= 0: Если в выборку попадает строка с незаполненным или нулевым номером (например, результат группировки запроса или не сохраненная в базе строка), расчет 0 - 1 = -1 приводит к попытке обратиться по отрицательному индексу, что недопустимо.Разберем основной и самый правильный путь решения проблемы. Данная ошибка была официально признана разработчиками фирмы «1С» как программный дефект типового релиза конфигурации. В последующих версиях механизм позиционного сопоставления строк был переработан.
КорректировкаОстатковЕГАИСПереопределяемый.Если быстро обновить информационную базу невозможно (например, конфигурация сильно доработана или требуется согласование регламентного окна), исправим ошибку самостоятельно. Чтобы не снимать типовую конфигурацию с поддержки, используем расширение.
Рассмотрим два варианта доработки метода в расширении (директива &Вместо или &ИзменениеИКонтроль):
Вариант А: Проверка границ индекса перед обращением
Добавим валидацию индекса, чтобы исключить аварийное завершение работы:
ИндексСтроки = Выборка.НомерСтроки - 1;
Если ИндексСтроки >= 0 И ИндексСтроки < ТаблицаСопоставления.Количество() Тогда
СтрокаТаблицы = ТаблицаСопоставления[ИндексСтроки];
Иначе
СтрокаТаблицы = Неопределено;
КонецЕсли;
Вариант Б: Поиск строки по ключу связи
Более надежный подход заключается в отказе от номеров строк и переходе на поиск по идентификатору алкогольной продукции или номенклатуре. Посмотрим на пример реализации через метод НайтиСтроки():
ПараметрыОтбора = Новый Структура;
ПараметрыОтбора.Вставить("АлкогольнаяПродукция", Выборка.АлкогольнаяПродукция);
НайденныеСтроки = ТаблицаСопоставления.НайтиСтроки(ПараметрыОтбора);
Если НайденныеСтроки.Количество() > 0 Тогда
СтрокаТаблицы = НайденныеСтроки[0];
Иначе
СтрокаТаблицы = Неопределено;
КонецЕсли;
Выясним, какие пользовательские данные могли спровоцировать расхождение размерности коллекций. Часто сбой проявляется только на определенных накладных, в которых нарушено сопоставление алкогольной продукции.
На форумах часто предлагают просто обернуть сбойную строку в блок Попытка ... Исключение. Разберем, почему делать это категорически не рекомендуется при работе с ЕГАИС:
Индексный доступ в данном алгоритме используется для заполнения ключевых сведений о марках, справках 1 и 2, либо сопоставленных кодах алкогольной продукции. Если перехватить ошибку пустой «заглушкой», текущая итерация не получит строку сопоставления. Это приведет к формированию акта или регистратора с пустыми реквизитами, расхождению остатков между УТМ и 1С и последующему отклонению документов со стороны ЕГАИС.
Поэтому решение должно заключаться исключительно в обновлении алгоритма или корректном поиске сопоставленных данных.