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

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

В процессе работы с системой 1С:Документооборот пользователи могут столкнуться с критической ошибкой при попытке нажать кнопку «Исполнено» в задаче. Система выдает сообщение «Индекс находится за границами массива», что блокирует дальнейшее продвижение бизнес-процесса. В данной статье мы подробно разберем, почему возникает эта ситуация, как локализовать проблему с помощью инструментов разработчика и какие действия предпринять для ее окончательного устранения.

Выясним причину возникновения ошибки

Ошибка «Индекс находится за границами массива» в контексте 1С всегда означает одно: программный код пытается обратиться к элементу коллекции (массива, таблицы значений, списка значений) по порядковому номеру, которого не существует. Рассмотрим подробнее типичную ситуацию для 1С:Документооборот. Чаще всего это происходит при попытке программного обращения к таблице Предметы бизнес-процесса.

Проанализируем механику работы системы. Каждый бизнес-процесс, такой как «Исполнение», обычно связан с каким-либо документом. Этот документ записывается в табличную часть Предметы. Если в коде (особенно в доработанных модулях) прописано жесткое обращение к первому предмету (индекс 0), а список предметов по какой-то причине пуст, система закономерно выдает ошибку.

Шаг 1: Использование отладчика для поиска проблемного кода

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

  1. Запустим систему в режиме «Отладка» из конфигуратора.
  2. Воспроизведем ошибку в пользовательском сеансе. Когда появится окно с ошибкой, в некоторых случаях система позволяет нажать кнопку «Подробно», но если конфигурация доработана, лучше заранее установить «Остановку по ошибке» в меню Отладка -> Настройка параметров отладки.
  3. Если же ошибка перехватывается программно, проанализируем стек вызовов. Как показала практика, в подобных случаях проблемная строка может выглядеть следующим образом:

тг_Предмет = ПроцессИсполнение.Предметы[0].Предмет;

В данном примере мы видим прямое обращение к индексу [0]. Если коллекция Предметы не содержит ни одной строки, выполнение кода прервется.

Шаг 2: Анализ стека вызовов

Когда выполнение программы остановится на точке останова, нам необходимо изучить Стек вызовов (вызывается сочетанием клавиш Ctrl + Alt + C). Это позволит нам понять, какая цепочка процедур привела к ошибке. Проанализируем пример стека вызовов из реальной практики:

  1. ОбщийМодуль.тг_ОбщийМодульТеплогаз.Модуль.ЭтоПроцессИсполненияЗаявкиДляИТ — здесь происходит непосредственное обращение к предмету.
  2. БизнесПроцесс.Исполнение.Форма.ФормаЗадачиИсполнителя.Форма.тг_ЗадачаИТПринятаКИсполнению — вызов обработчика при принятии задачи.
  3. БизнесПроцесс.Исполнение.Форма.ФормаЗадачиИсполнителя.Форма.Исполнено — команда пользователя на форме задачи.

Из этого стека становится ясно, что ошибка происходит в кастомном модуле тг_ОбщийМодульТеплогаз. Система пытается проверить, является ли текущий процесс заявкой для ИТ-отдела, обращаясь к предмету процесса, но сам предмет в задачу не «прилетел».

Шаг 3: Выяснение причин отсутствия предметов

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

Шаг 4: Исправление программного кода (защитное программирование)

Чтобы исключить появление подобных ошибок в будущем, необходимо модифицировать код, добавив в него проверку на заполненность коллекции. Вместо прямого обращения к индексу, используем метод Количество().

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


Если ПроцессИсполнение.Предметы.Количество() > 0 Тогда
    тг_Предмет = ПроцессИсполнение.Предметы[0].Предмет;
    // Далее выполняем логику по работе с предметом
Иначе
    // Обрабатываем ситуацию, когда предмета нет
    Возврат Ложь; 
КонецЕсли;

Такой подход называется защитным программированием. Он гарантирует, что даже если данные в системе некорректны (предмет потерян), пользователь не увидит «падающее» окно с технической ошибкой. Вместо этого можно вывести информативное сообщение: "В данной задаче не указан основной предмет. Пожалуйста, обратитесь в техподдержку".

Шаг 5: Исправление данных в пользовательском режиме

Если процесс уже запущен и «висит» на исполнителе, вызывая ошибку, его не обязательно удалять. Выясним, как восстановить работоспособность задачи:

  1. Перейдем в список «Все процессы» или найдем процесс через карточку задачи.
  2. Откроем карточку бизнес-процесса «Исполнение».
  3. Обратим внимание на правую часть окна или вкладку «Предметы».
  4. Нажмем кнопку «Добавить» и выберем соответствующий документ (например, ту самую «Заявку для ИТ», из-за которой всё началось).
  5. После записи процесса попробуем снова нажать «Исполнено» в задаче. Теперь индекс [0] будет существовать, и ошибка исчезнет.

Резюме

Ошибка «Индекс находится за границами массива» в 1С:Документооборот чаще всего является следствием того, что в доработанном коде отсутствует проверка на наличие предметов в бизнес-процессе. Для решения проблемы мы рекомендуем:

Следуя этим инструкциям, вы сможете не только быстро исправлять текущие сбои, но и проектировать более отказоустойчивые системы на базе платформы 1С.

← На главную