При работе в программе 1С:Зарплата и управление персоналом (релиз 3.1.7.61) пользователи и системные администраторы часто сталкиваются с критической ошибкой, которая блокирует запись данных при изменении налогового органа организации или при создании нового подразделения. Ошибка сопровождается выводом системного сообщения о выходе индекса за границы массива в модуле обмена данными.
В этой статье мы подробно разберем технические причины возникновения этой неисправности, выясним, на какие объекты конфигурации она влияет, и рассмотрим несколько практических вариантов временного обхода и полного устранения данной проблемы.
Для начала проанализируем стек вызова и текст ошибки, который появляется при попытке записать карточку организации после смены ИФНС:
{ОбщийМодуль.РедактированиеПериодическихСведений.Модуль(537)}: Ошибка при вызове метода контекста (Записать) Набор.Записать;
по причине: Ошибка при выполнении обработчика - 'ПередЗаписью'
по причине: {ОбщийМодуль.ОбменДаннымиСобытия.Модуль(1042)}: Не удалось зарегистрировать изменения на узлах плана обмена ОбменЗарплата3Бухгалтерия3
по причине: {ОбщийМодуль.ОбменДаннымиСобытия.Модуль(1310)}: Ошибка выполнения правил регистрации объектов для плана обмена ОбменЗарплата3Бухгалтерия3.
Описание ошибки: {ОбщийМодуль.ОбменДаннымиСобытия.Модуль(2450)}: Ошибка при выполнении обработчика: "Перед обработкой";
Объект метаданных: РегистрСведений.ИсторияРегистрацийВНалоговомОргане
Описание ошибки: {(1)}: Индекс находится за границами массива
Если Не ЗначениеЗаполнено(Объект[0].РегистрацияВНалоговомОргане) Или ТипЗнч(Объект[0].СтруктурнаяЕдиница) = Тип("СправочникСсылка.ТерриторииВыполненияРабот") Тогда
Выясним причину этой системной ошибки. Проблема кроется в правилах регистрации объектов для плана обмена ОбменЗарплата3Бухгалтерия3. При записи сведений в регистр РегистрСведений.ИсторияРегистрацийВНалоговомОргане срабатывает подписка на событие, которая запускает обработчик «Перед обработкой».
В коде правил регистрации прописана проверка, которая обращается к первому элементу коллекции объектов: Объект[0]. Однако разработчики не учли важный нюанс: в некоторых случаях (например, при перезаписи пустых значений, удалении записей или программном изменении структуры) передаваемый массив (набор записей) Объект оказывается пустым. Попытка обратиться к первому элементу (индекс 0) пустого массива закономерно вызывает исключение «Индекс находится за границами массива».
Дополнительной технической сложностью является то, что в измерении данного регистра сведений используются определяемые типы данных, из-за чего логика сравнения типов в правилах регистрации дает сбой при определенных условиях.
Эта неисправность блокирует работу сразу в нескольких ключевых точках конфигурации:
Рассмотрим по шагам возможные варианты решения данной проблемы — от простых и быстрых временных мер до кардинального исправления.
Поскольку проблема носит массовый характер и признана разработчиками фирмы «1С» (код ошибки 10196565), наиболее правильным решением является обновление конфигурации. Ошибка была полностью исправлена в релизе 3.1.7.87.
Если у вас есть возможность провести плановое обновление программы, выполните обновление «1С:Зарплата и управление персоналом» до релиза 3.1.7.87 или выше. Это полностью устранит проблему без необходимости ручного вмешательства в конфигурацию или правила обмена.
Если обновиться прямо сейчас нет возможности, а внести изменения в карточку организации или создать подразделение нужно срочно, можно прибегнуть к временному отключению синхронизации. Этот способ хорош тем, что не требует изменения метаданных в конфигураторе.
Выполним следующие шаги:
Важно: При использовании этого метода измененные данные не зарегистрируются для автоматического обмена с бухгалтерией автоматически. После включения синхронизации может потребоваться зарегистрировать измененные объекты к обмену вручную через монитор регистрации изменений.
Для тех компаний, которым категорически не подходит временное отключение синхронизации (например, обмен выполняется непрерывно в автоматическом режиме), существует более элегантный способ — корректировка правил обмена.
Разберем этот процесс по шагам:
История регистраций в налоговом органе и История регистраций в налоговом органе вторичный.
Если Объект.Количество() > 0 Тогда
Если Не ЗначениеЗаполнено(Объект[0].РегистрацияВНалоговомОргане) Или ТипЗнч(Объект[0].СтруктурнаяЕдиница) = Тип("СправочникСсылка.TerritoriiVypolneniyaRabot") Тогда
Отказ = Истина;
КонецЕсли;
КонецЕсли;
Еще один безопасный и надежный способ обойти ошибку без редактирования кода вручную — использование правил регистрации из предыдущих стабильных версий программного продукта.
Проанализируем этот алгоритм:
Иногда эта ошибка блокирует работу системы еще на этапе обновления конфигурации в режиме «Предприятие», когда база выполняет обработку обновления данных и не дает пользователям войти в систему.
Если вы столкнулись с такой ситуацией, выполните следующие действия:
ЗапуститьБезВыполненияРегламентныхЗаданий.Мы надеемся, что предложенные методики помогут вам оперативно справиться с данной ошибкой и восстановить штатную работу пользователей в программе «1С:Зарплата и управление персоналом».