При работе с распределенными информационными базами (РИБ) в конфигурации 1С:Управление торговлей 11 администраторы и разработчики часто сталкиваются с критическими ошибками на этапе загрузки данных. Одной из самых неприятных является ошибка: Ошибка чтения файла сообщения обмена: Индекс находится за границами массива. Она полностью блокирует процесс синхронизации, из-за чего в периферийных узлах накапливаются необработанные изменения. Разберем подробно причины возникновения этой ситуации и пути ее решения.
Если мы проанализируем стек вызовов из лога ошибки, то увидим, что падение происходит в модуле менеджера регистра сведений УчетнаяПолитикаОрганизаций в строке 151 (или аналогичной в зависимости от релиза):
ЗаполнитьЗначенияСвойств(СтруктураПараметров, ТаблицаОрганизаций[0]);
Проанализируем эту строку кода. Программа пытается обратиться к первому элементу массива (или таблицы) ТаблицаОрганизаций по индексу 0. Ошибка «Индекс находится за границами массива» однозначно указывает на то, что массив пуст. То есть запрос к базе данных, который должен был выгрузить параметры учетной политики для конкретной организации, не вернул ни одной строки.
Выясним причину, почему таблица оказывается пустой. В контексте обмена РИБ это происходит в момент проведения документа после его загрузки. Документ пытается инициализировать параметры (например, для расчета себестоимости или отражения в реестре документов), обращается к учетной политике, а ее в данной базе не существует.
Рассмотрим самую частую причину, которая подтвердилась в практике пользователей. В 1С:УТ 11 часто используется механизм Интеркампани (передачи товаров между организациями). Рассмотрим ситуацию:
Передача товаров между организациями.УчетнаяПолитикаОрганизаций пусто. Происходит обращение к ТаблицаОрганизаций[0] и обмен аварийно завершается.Что нужно сделать: Проанализируем настройки синхронизации данных. Если вы используете передачи между организациями, необходимо, чтобы все организации, участвующие в схеме «Интеркампани», были включены в фильтр узла РИБ, даже если по ним не ведется оперативный учет в этой конкретной базе. После добавления организации в состав отправляемых данных и повторной выгрузки из центра, ошибка исчезнет.
Разберем ситуацию, когда организации в базе есть, но ошибка все равно сохраняется. Посмотрим на дату начала действия учетной политики. Проблема может возникнуть, если:
ПараметрыУчетнойПолитики(Организация, Период) ищет запись на дату документа и не находит ее.Рекомендация: Проверьте дату самого раннего документа в базе и установите дату начала действия учетной политики на один месяц раньше этой даты (например, на начало прошлого года). Это гарантирует, что для любого документа система найдет настройки в регистре.
В некоторых релизах 11.4.13.х наблюдалась явная недоработка типового кода — отсутствие проверки на пустоту таблицы перед обращением к индексу. Рассмотрим, как программно предотвратить падение обмена, если мы не можем или не хотим менять фильтры РИБ.
Мы можем создать расширение и переопределить метод в модуле менеджера регистра УчетнаяПолитикаОрганизаций. Добавим проверку количества строк в таблице:
&После("УчетныеПолитикиОрганизаций")
Функция ИмяПрефикс_УчетныеПолитикиОрганизаций(Организация, Период, Истина)
// ... логика получения данных ...
Если ТаблицаОрганизаций.Количество() = 0 Тогда
// Если данных нет, возвращаем пустую структуру или вызываем исключение с понятным текстом
Возврат Новый Структура;
КонецЕсли;
КонецФункции
Однако более корректно будет найти место в коде, указанное в ошибке (строка 151), и обернуть обращение к массиву в условие:
Если ТаблицаОрганизаций.Количество() > 0 Тогда
ЗаполнитьЗначенияСвойств(СтруктураПараметров, ТаблицаОрганизаций[0]);
Иначе
// Обработка ситуации, когда политика не найдена
// Можно записать в лог предупреждение, но не прерывать обмен
КонецЕсли;
Для стабильной работы РИБ в 1С:Управление торговлей 11 при использовании схем «Интеркампани» придерживайтесь следующих правил:
Учетная политика организаций должны быть переданы для корректной работы алгоритмов проведения.Проанализируйте ваш состав отправляемых данных, проверьте соответствие организаций в документах «Передача товаров» и фактическое наличие их политик в периферийной базе. В 90% случаев решение кроется именно в настройке состава данных узла обмена.