Как исправить ошибку «Индекс находится за границами массива» при заполнении начисления зарплаты в 1С:ЗУП 3.1.18.151

Программист 1С v8.3 (Управляемые формы) 1С:Зарплата и Управление Персоналом
← На главную

Обновление программных продуктов «1С» — это всегда ответственный процесс, который иногда преподносит неприятные сюрпризы. Одной из наиболее резонансных проблем в релизе Зарплата и управление персоналом 3.1.18.151 стала критическая ошибка при попытке автоматического заполнения документа НачислениеЗарплатыИВзносов. Пользователи сталкиваются с системным сообщением «Индекс находится за границами массива», после чего расчет прерывается. В этой статье мы подробно разберем причины возникновения этой ситуации и рассмотрим пошаговые алгоритмы её решения.

Анализируем симптомы проблемы

Прежде чем переходить к техническим правкам, давайте проанализируем, как именно проявляется данная ошибка. Рассмотрим типичный сценарий:

  1. Бухгалтер создает документ Начисление зарплаты и взносов.
  2. Выбирает организацию и месяц начисления.
  3. Нажимает кнопку Заполнить.
  4. Программа начинает фоновое выполнение задачи, которое завершается аварийно с ошибкой в модуле МенеджерРасчетаЗарплаты.

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

Выясняем техническую причину сбоя

Разберем ситуацию с точки зрения программного кода. Ошибка «Индекс находится за границами массива» обычно возникает, когда программа пытается обратиться к элементу коллекции по индексу, который не существует (например, обращение к 11-му элементу в массиве из 10 элементов). В контексте релиза 3.1.18.151 это происходит в механизме Менеджер расчета зарплаты.

Проанализируем работу системы в этот момент. При заполнении документа программа обращается к различным регистрам для получения данных о стажах, графиках и условиях труда. В версии КОРП была внедрена подсистема Охрана труда. Если в базе данных есть записи о назначении рабочих мест сотрудникам, введенные задним числом или имеющие некорректные (пересекающиеся) периоды, функция сбора данных формирует таблицу или массив, структура которого не соответствует ожиданиям расчетного модуля. В итоге, при итерации по этой структуре, счетчик циклов выходит за пределы фактически полученных данных.

Способ 1. Установка официального исправления (Патч)

Самый быстрый и правильный способ решения — использование механизма исправления ошибок (патчей). Фирма «1С» оперативно выпустила специальный патч для версии КОРП. Рассмотрим, как его применить:

  1. Перейдем в раздел Администрирование — Обслуживание — Обновление программы.
  2. Выберем пункт Установленные исправления (патчи).
  3. Нам необходимо убедиться в наличии патча с номером EF_50014202.
  4. Если патч отсутствует, его следует загрузить через сервис автоматического обновления или установить вручную, скачав с портала ИТС.

Данный патч корректирует логику работы модуля МенеджерРасчетаЗарплаты, добавляя проверку на существование индекса перед обращением к данным условий труда. Важно: этот патч предназначен для версии КОРП. Если вы работаете в версии ПРОФ, данный идентификатор может быть недоступен, так как блок «Охрана труда» в ПРОФ отсутствует. Однако, если ошибка сохраняется в ПРОФ, переходим к следующим вариантам.

Способ 2. Обходной путь через механизм «Подбор»

Если нет возможности немедленно установить патч или обновить конфигурацию, воспользуемся временным решением, которое позволяет сдать отчетность вовремя. Проанализируем, почему Подбор работает лучше, чем Заполнить:

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

Рассмотрим последовательность действий:

  1. Очистим проблемный документ.
  2. Нажмем кнопку Подбор.
  3. В открывшемся окне нажмем комбинацию клавиш Ctrl + A (выделить всех) или выберем сотрудников нужного подразделения.
  4. Нажмем Выбрать. Данные будут перенесены в документ, и расчет запустится автоматически для каждого добавленного сотрудника.

Способ 3. Проверка и корректировка кадровых данных

Поскольку мы выяснили, что причина кроется в «кривых» данных, попробуем их локализовать. Рассмотрим, на что стоит обратить внимание в проблемных подразделениях:

Во-первых, проверим регистр сведений Параметры периодов стажа ПФР. Иногда при обновлении в нем дублируются записи, что сбивает алгоритмы расчета. Во-вторых, проанализируем последних принятых или переведенных сотрудников. Посмотрим на следующие моменты:

Попробуем временно исключить из расчета последнего принятого сотрудника в проблемном подразделении. Если без него документ Заполнить отрабатывает штатно — мы нашли источник проблемы. В этом случае необходимо перепровести кадровые документы по данному сотруднику, чтобы структура записей в регистрах обновилась.

Способ 4. Радикальное решение — обновление релиза

Ветку 3.1.18 нельзя назвать самой стабильной, и релиз .151 был лишь одним из этапов. Рассмотрим возможность перехода на более поздние версии. Ошибка «Индекс находится за границами массива» была полностью устранена на уровне кода конфигурации в последующих выпусках. Посмотрим на рекомендуемые релизы:

Использование отладки для локализации (для программистов)

Если вы хотите точно увидеть место сбоя, разберем порядок действий при отладке. Настроим остановку по ошибке:

  1. В Конфигураторе откроем меню Отладка — Настройка параметров отладки.
  2. Установим флаг Останавливаться по ошибке.
  3. Запустим сеанс в режиме Предприятия и вызовем ошибку.

Система остановится в модуле МенеджерРасчетаЗарплаты. Скорее всего, вы увидите код, похожий на этот:


Для Каждого СтрокаДанных Из ТаблицаФильтрПолученияДвижений Цикл
    ТекущийОбъект = МассивОбъектов[Индекс]; // Здесь Индекс может быть больше размера массива
    // Логика обработки
КонецЦикла;

Проанализируем содержимое переменной ТаблицаФильтрПолученияДвижений. Если в ней строк больше, чем элементов в МассивОбъектов, значит, запрос вернул данные, для которых не были подготовлены структуры в памяти. Это подтверждает необходимость применения патча EF_50014202, который добавляет необходимые проверки соответствия размеров коллекций.

Подведем итог: Ошибка является чисто программной и вызвана недоработкой в коде релиза 3.1.18.151. Лучшее решение — установка патча или обновление. В качестве временной меры используйте механизм Подбора, который позволяет миновать проблемный участок кода.

← На главную