Как исправить ошибку «Индекс находится за границами массива» при подключении к ВЕТИС в 1С?

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

Интеграция учетных систем 1С с государственной системой ветеринарного контроля ВЕТИС (компонент «Меркурий») — критически важная задача для всех предприятий, работающих с подконтрольной продукцией. Однако в процессе настройки подключения к ВЕТИС.API в некоторых релизах конфигураций (в частности, в 1С:Управление торговлей 11.4.8 и связанных решениях) пользователи сталкиваются с аварийным завершением работы. На этапе «Заполнение служебных данных» система выдает критическую ошибку: «Не удалось заполнить виды продукции по группам приказа ветис по причине индекс находится за границами массива».

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

Выясняем причину: почему падает код 1С?

Давайте проведем мини-расследование и заглянем в отладчик. Ошибка происходит в общем модуле ДопустимыеЦелиВЕТИС внутри функции ПереченьПродукцииАттестованныхСпециалистов(ГруппыПродукции). Проанализируем логику работы этой функции.

Программа обращается к макету ПереченьПродукцииАттестованныхСпециалистов, который встроен в обработку КлассификаторыВЕТИС. В этом макете хранится классификатор продукции, распределенной по группам согласно приказам Минсельхоза РФ. Алгоритм считывает строки макета построчно, пытается получить информацию о номере приказа и группе продукции и выполняет следующий код:


ГруппаПриказаСтрока = СокрЛП(Макет.Область(НомерСтроки, 1).Текст);
ГруппаПриказаСтрока = СокрЛП(СтрРазделить(ГруппаПриказаСтрока, ".")[1]);

Разберем детально, что здесь происходит:

  1. Метод СтрРазделить(ГруппаПриказаСтрока, ".") разбивает текстовую строку из первой колонки макета в массив, используя точку в качестве разделителя.
  2. Большинство строк макета имеют вид: «Приказ 647. Группа 05, 96, 97, строка 4. Рыба и морепродукты.». При разделении по точке получается массив из нескольких элементов. Программа ожидает, что вторым элементом (с индексом 1) всегда будет идти текст группы (например, « Группа 05, 96, 97, строка 4»).
  3. Однако в некоторых строках макета (например, на строке 11456 для Группы 04) разработчики допустили опечатку, и текст начинается сразу со слов: «Группа 04, строка 5» без предварительного указания номера приказа и точки.
  4. В результате для этих строк функция СтрРазделить возвращает массив, состоящий всего из одного элемента с индексом 0. Попытка обратиться к несуществующему элементу с индексом 1: [1] приводит к падению платформы с ошибкой «Индекс находится за границами массива».

Это классический «баг» релиза конфигурации, возникший из-за отсутствия проверки на длину полученного массива в коде парсера макета.

---

Варианты решения проблемы

Рассмотрим подробнее три основных способа устранения этой ошибки: от официального обновления до быстрого исправления «на лету» без снятия конфигурации с поддержки.

Способ 1. Обновление конфигурации (Официальный путь)

Если у вас есть возможность оперативно обновить базу, это самый правильный путь. Ошибка была официально признана разработчиками 1С и исправлена в последующих релизах «1С:Управление торговлей» (начиная с ветки 11.4.9) и соответствующих версиях БИС (Библиотеки интеграции с государственными информационными системами). В новых релизах был исправлен как сам макет классификатора, так и добавлен безопасный обход элементов массива в коде.

Способ 2. Быстрое исправление кода через расширение конфигурации

Если обновлять всю конфигурацию долго или сложно (например, база сильно доработана), мы можем исправить ошибку самостоятельно. Крайне не рекомендуется править код напрямую в основной конфигурации, снимая её с поддержки. Гораздо безопаснее использовать механизм Расширений конфигурации.

Давайте создадим расширение и переопределим функцию ПереченьПродукцииАттестованныхСпециалистов с использованием безопасной проверки длины массива. Напишем следующий код:


&Вместо("ПереченьПродукцииАттестованныхСпециалистов")
Функция ИСПР_ПереченьПродукцииАттестованныхСпециалистов(ГруппыПродукции)
    
    Таблица = Новый ТаблицаЗначений;
    Таблица.Колонки.Добавить("ГруппаПриказа",             Новый ОписаниеТипов("ПеречислениеСсылка.ГруппыПродукцииАттестованныхСпециалистов"));
    Таблица.Колонки.Добавить("ВидПродукцииИдентификатор", Метаданные.ОпределяемыеТипы.УникальныйИдентификаторВЕТИС.Тип);
    Таблица.Колонки.Добавить("ВидПродукцииНаименование",  Метаданные.ОпределяемыеТипы.СтрокаВЕТИС.Тип);
    
    Макет = Обработки.КлассификаторыВЕТИС.ПолучитьМакет("ПереченьПродукцииАттестованныхСпециалистов");
    КоличествоСтрок = Макет.ВысотаТаблицы;
    
    ДобавленныеСтроки = Новый Соответствие;
    Для НомерСтроки = 2 По КоличествоСтрок Цикл
        
        ГруппаПриказаСтрока = СокрЛП(Макет.Область(НомерСтроки, 1).Текст);
        
        // Безопасное разделение строки с проверкой количества элементов
        ЧастиСтроки = СтрРазделить(ГруппаПриказаСтрока, ".");
        Если ЧастиСтроки.Количество() > 1 Тогда
            ГруппаПриказаСтрока = СокрЛП(ЧастиСтроки[1]);
        Иначе
            ГруппаПриказаСтрока = СокрЛП(ЧастиСтроки[0]);
        КонецЕсли;
        
        ТипПродукцииНаименование  = СокрЛП(Макет.Область(НомерСтроки, 2).Текст);
        ВидПродукцииИдентификатор = СокрЛП(Макет.Область(НомерСтроки, 9).Текст);
        ВидПродукцииНаименование  = СокрЛП(Макет.Область(НомерСтроки, 7).Текст);
        
        ГруппаПриказа = ГруппыПродукции.Получить(ГруппаПриказаСтрока);
        Если ГруппаПриказа = Неопределено Тогда
            СтрокаПоиска = ГруппаПриказаСтрока + " / " + ТипПродукцииНаименование;
            ГруппаПриказа = ГруппыПродукции.Получить(СтрокаПоиска);
        КонецЕсли;
        
        ЗаполненныеВиды = ДобавленныеСтроки.Получить(ГруппаПриказа);
        Если ЗаполненныеВиды = Неопределено Тогда
            ЗаполненныеВиды = Новый Соответствие;
            ДобавленныеСтроки.Вставить(ГруппаПриказа, ЗаполненныеВиды);
        КонецЕсли;
        
        СтрокаТаблицы = ЗаполненныеВиды.Получить(ВидПродукцииИдентификатор);
        Если СтрокаТаблицы <> Неопределено Тогда
            Если СтрНайти(СтрокаТаблицы.ВидПродукцииНаименование, ВидПродукцииНаименование) = 0 Тогда
                СтрокаТаблицы.ВидПродукцииНаименование = СтрокаТаблицы.ВидПродукцииНаименование + ", "+ ВидПродукцииНаименование;
            КонецЕсли;
            Продолжить;
        КонецЕсли;
        
        НоваяСтрока = Таблица.Добавить();
        
        НоваяСтрока.ГруппаПриказа             = ГруппаПриказа;
        НоваяСтрока.ВидПродукцииИдентификатор = ВидПродукцииИдентификатор;
        НоваяСтрока.ВидПродукцииНаименование  = ВидПродукцииНаименование;
        
        ЗаполненныеВиды.Вставить(ВидПродукцииИдентификатор, НоваяСтрока);
        
    КонецЦикла;
    
    Возврат Таблица;
    
КонецФункции

Благодаря этой доработке программа не упадет при анализе проблемных строк макета, а корректно обработает их. Настройка подключения к ВЕТИС.API завершится успешно.

Способ 3. Редактирование макета классификатора

Если вы не хотите менять программный код, можно пойти по пути исправления самого источника данных — встроенного макета. Для этого:

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

Важное предупреждение: Просто пропускать эти строки в цикле с помощью конструкции Попытка...Исключение...Продолжить; крайне нежелательно! Этот макет напрямую сопоставляет виды продукции и права уполномоченных лиц на их оформление. Если вы просто пропустите строки по определенным группам товаров, ваши аттестованные специалисты в 1С потеряют техническую возможность выписывать исходящие ветеринарно-сопроводительные документы (ВСД) на эту продукцию, так как система посчитает, что у них нет на это законных прав.

---

Важные правила работы в ВЕТИС «Меркурий»

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

Проанализируем ключевые правила безопасности при работе с ВСД:

Чем грозят нарушения? За некритические ошибки профиль уполномоченного лица могут временно заблокировать на срок от 3 до 20 дней. При систематических или грубых нарушениях (например, повторное гашение «просрочки» или оформление продукции без подтверждения происхождения) учетная запись блокируется на срок от 1 до 6 месяцев, а на юридическое лицо могут быть наложены крупные административные штрафы.

← На главную