Интеграция учетных систем 1С с государственной системой ветеринарного контроля ВЕТИС (компонент «Меркурий») — критически важная задача для всех предприятий, работающих с подконтрольной продукцией. Однако в процессе настройки подключения к ВЕТИС.API в некоторых релизах конфигураций (в частности, в 1С:Управление торговлей 11.4.8 и связанных решениях) пользователи сталкиваются с аварийным завершением работы. На этапе «Заполнение служебных данных» система выдает критическую ошибку: «Не удалось заполнить виды продукции по группам приказа ветис по причине индекс находится за границами массива».
В этой статье мы подробно разберем, почему возникает этот сбой, проанализируем проблемный код конфигурации и рассмотрим три практических способа решения проблемы, а также обсудим важные нюансы работы в системе «Меркурий», несоблюдение которых может привести к блокировке учетной записи.
Давайте проведем мини-расследование и заглянем в отладчик. Ошибка происходит в общем модуле ДопустимыеЦелиВЕТИС внутри функции ПереченьПродукцииАттестованныхСпециалистов(ГруппыПродукции). Проанализируем логику работы этой функции.
Программа обращается к макету ПереченьПродукцииАттестованныхСпециалистов, который встроен в обработку КлассификаторыВЕТИС. В этом макете хранится классификатор продукции, распределенной по группам согласно приказам Минсельхоза РФ. Алгоритм считывает строки макета построчно, пытается получить информацию о номере приказа и группе продукции и выполняет следующий код:
ГруппаПриказаСтрока = СокрЛП(Макет.Область(НомерСтроки, 1).Текст);
ГруппаПриказаСтрока = СокрЛП(СтрРазделить(ГруппаПриказаСтрока, ".")[1]);
Разберем детально, что здесь происходит:
СтрРазделить(ГруппаПриказаСтрока, ".") разбивает текстовую строку из первой колонки макета в массив, используя точку в качестве разделителя.СтрРазделить возвращает массив, состоящий всего из одного элемента с индексом 0. Попытка обратиться к несуществующему элементу с индексом 1: [1] приводит к падению платформы с ошибкой «Индекс находится за границами массива».Это классический «баг» релиза конфигурации, возникший из-за отсутствия проверки на длину полученного массива в коде парсера макета.
---
Рассмотрим подробнее три основных способа устранения этой ошибки: от официального обновления до быстрого исправления «на лету» без снятия конфигурации с поддержки.
Если у вас есть возможность оперативно обновить базу, это самый правильный путь. Ошибка была официально признана разработчиками 1С и исправлена в последующих релизах «1С:Управление торговлей» (начиная с ветки 11.4.9) и соответствующих версиях БИС (Библиотеки интеграции с государственными информационными системами). В новых релизах был исправлен как сам макет классификатора, так и добавлен безопасный обход элементов массива в коде.
Если обновлять всю конфигурацию долго или сложно (например, база сильно доработана), мы можем исправить ошибку самостоятельно. Крайне не рекомендуется править код напрямую в основной конфигурации, снимая её с поддержки. Гораздо безопаснее использовать механизм Расширений конфигурации.
Давайте создадим расширение и переопределим функцию ПереченьПродукцииАттестованныхСпециалистов с использованием безопасной проверки длины массива. Напишем следующий код:
&Вместо("ПереченьПродукцииАттестованныхСпециалистов")
Функция ИСПР_ПереченьПродукцииАттестованныхСпециалистов(ГруппыПродукции)
Таблица = Новый ТаблицаЗначений;
Таблица.Колонки.Добавить("ГруппаПриказа", Новый ОписаниеТипов("ПеречислениеСсылка.ГруппыПродукцииАттестованныхСпециалистов"));
Таблица.Колонки.Добавить("ВидПродукцииИдентификатор", Метаданные.ОпределяемыеТипы.УникальныйИдентификаторВЕТИС.Тип);
Таблица.Колонки.Добавить("ВидПродукцииНаименование", Метаданные.ОпределяемыеТипы.СтрокаВЕТИС.Тип);
Макет = Обработки.КлассификаторыВЕТИС.ПолучитьМакет("ПереченьПродукцииАттестованныхСпециалистов");
КоличествоСтрок = Макет.ВысотаТаблицы;
ДобавленныеСтроки = Новый Соответствие;
Для НомерСтроки = 2 По КоличествоСтрок Цикл
ГруппаПриказаСтрока = СокрЛП(Макет.Область(НомерСтроки, 1).Текст);
// Безопасное разделение строки с проверкой количества элементов
ЧастиСтроки = СтрРазделить(ГруппаПриказаСтрока, ".");
Если ЧастиСтроки.Количество() > 1 Тогда
ГруппаПриказаСтрока = СокрЛП(ЧастиСтроки[1]);
Иначе
ГруппаПриказаСтрока = СокрЛП(ЧастиСтроки[0]);
КонецЕсли;
ТипПродукцииНаименование = СокрЛП(Макет.Область(НомерСтроки, 2).Текст);
ВидПродукцииИдентификатор = СокрЛП(Макет.Область(НомерСтроки, 9).Текст);
ВидПродукцииНаименование = СокрЛП(Макет.Область(НомерСтроки, 7).Текст);
ГруппаПриказа = ГруппыПродукции.Получить(ГруппаПриказаСтрока);
Если ГруппаПриказа = Неопределено Тогда
СтрокаПоиска = ГруппаПриказаСтрока + " / " + ТипПродукцииНаименование;
ГруппаПриказа = ГруппыПродукции.Получить(СтрокаПоиска);
КонецЕсли;
ЗаполненныеВиды = ДобавленныеСтроки.Получить(ГруппаПриказа);
Если ЗаполненныеВиды = Неопределено Тогда
ЗаполненныеВиды = Новый Соответствие;
ДобавленныеСтроки.Вставить(ГруппаПриказа, ЗаполненныеВиды);
КонецЕсли;
СтрокаТаблицы = ЗаполненныеВиды.Получить(ВидПродукцииИдентификатор);
Если СтрокаТаблицы <> Неопределено Тогда
Если СтрНайти(СтрокаТаблицы.ВидПродукцииНаименование, ВидПродукцииНаименование) = 0 Тогда
СтрокаТаблицы.ВидПродукцииНаименование = СтрокаТаблицы.ВидПродукцииНаименование + ", "+ ВидПродукцииНаименование;
КонецЕсли;
Продолжить;
КонецЕсли;
НоваяСтрока = Таблица.Добавить();
НоваяСтрока.ГруппаПриказа = ГруппаПриказа;
НоваяСтрока.ВидПродукцииИдентификатор = ВидПродукцииИдентификатор;
НоваяСтрока.ВидПродукцииНаименование = ВидПродукцииНаименование;
ЗаполненныеВиды.Вставить(ВидПродукцииИдентификатор, НоваяСтрока);
КонецЦикла;
Возврат Таблица;
КонецФункции
Благодаря этой доработке программа не упадет при анализе проблемных строк макета, а корректно обработает их. Настройка подключения к ВЕТИС.API завершится успешно.
Если вы не хотите менять программный код, можно пойти по пути исправления самого источника данных — встроенного макета. Для этого:
КлассификаторыВЕТИС.ПереченьПродукцииАттестованныхСпециалистов (это табличный документ).Важное предупреждение: Просто пропускать эти строки в цикле с помощью конструкции Попытка...Исключение...Продолжить; крайне нежелательно! Этот макет напрямую сопоставляет виды продукции и права уполномоченных лиц на их оформление. Если вы просто пропустите строки по определенным группам товаров, ваши аттестованные специалисты в 1С потеряют техническую возможность выписывать исходящие ветеринарно-сопроводительные документы (ВСД) на эту продукцию, так как система посчитает, что у них нет на это законных прав.
---
Начало работы с системой «Меркурий» требует от пользователей предельной концентрации внимания. В отличие от ЕГАИС, где многие проверки заблокированы на уровне самой системы, «Меркурий» позволяет совершать ошибки, но жестко наказывает за них постфактум силами инспекторов Россельхознадзора и автоматических аналитических модулей искусственного интеллекта.
Проанализируем ключевые правила безопасности при работе с ВСД:
Чем грозят нарушения? За некритические ошибки профиль уполномоченного лица могут временно заблокировать на срок от 3 до 20 дней. При систематических или грубых нарушениях (например, повторное гашение «просрочки» или оформление продукции без подтверждения происхождения) учетная запись блокируется на срок от 1 до 6 месяцев, а на юридическое лицо могут быть наложены крупные административные штрафы.