Ошибка 1С: Индекс находится за границами массива — Причины и решение
- Прерывание выполнения алгоритмов обработки коллекций в 1С:Предприятие.
- Ошибка времени выполнения:
{МодульОбъекта(Строка)}: Индекс находится за границами массива. - Сбой при обращении по квадратно-скобочному индексу к
Массив[Индекс], строкамТаблицаЗначений[Индекс]или колонкам.
1. Принцип индексации коллекций в 1С
В платформе 1С:Предприятие индексация всех коллекций (Массив, ТаблицаЗначений, ТабличнаяЧасть, ДеревоЗначений, СписокЗначений) является строго 0-ориентированной (начинается с нуля). Последний элемент всегда имеет индекс Коллекция.Количество() - 1, а верхняя граница массива возвращается методом Коллекция.ВГраница().
2. Анализ и локализация ошибки
Ошибка возникает в двух базовых случаях:
- Обращение к пустому массиву (индекс 0 при
Количество() = 0); - Использование индекса
>= Коллекция.Количество()либо отрицательного значения.
3. Примеры безопасного кода
Безопасный доступ по конкретному индексу:
Если МассивДанных.Количество() > 0 И Индекс <= МассивДанных.ВГраница() И Индекс >= 0 Тогда
Значение = МассивДанных[Индекс];
Иначе
// Обработка случая выхода за границы
Значение = Неопределено;
КонецЕсли;Корректный цикл по индексам:
// ПРАВИЛЬНО: до ВГраница()
Для Индекс = 0 По МассивДанных.ВГраница() Цикл
ТекущийЭлемент = МассивДанных[Индекс];
КонецЦикла;
// ИЛИ использование безопасного итератора Для Каждого:
Для Каждого ТекущийЭлемент Из МассивДанных Цикл
// Логика обработки
КонецЦикла;Безопасное удаление элементов в цикле (с конца):
// Удаление с конца предотвращает смещение индексов и выход за границы
Для Счетчик = -МассивДанных.ВГраница() По 0 Цикл
Индекс = -Счетчик;
Если НужноУдалить(МассивДанных[Индекс]) Тогда
МассивДанных.Удалить(Индекс);
КонецЕсли;
КонецЦикла; Частые вопросы (FAQ)
Почему возникает ошибка при удалении строк из Таблицы Значений в цикле от 0 до Количество()-1?
При вызове метода Удалить() общее количество строк уменьшается, а индексы последующих строк сдвигаются влево. Цикл доходит до старого предельного значения и обращается к уже несуществующему индексу. Удалять элементы необходимо с конца к началу (от ВГраница() до 0 с шагом -1).
Какое значение возвращает метод ВГраница() для пустого массива?
Для пустого массива метод ВГраница() возвращает значение -1. Цикл вида 'Для Индекс = 0 По Массив.ВГраница()' для пустого массива не выполнится ни разу, что исключает падение.
Поддерживает ли 1С отрицательные индексы (как в Python)?
Нет, обращение по отрицательному индексу (например, Массив[-1]) всегда вызывает ошибку 'Индекс находится за границами массива'.
Как быстро получить первый и последний элемент массива без риска падения?
Используйте конструкцию: Первый = ?(Массив.Количество() > 0, Массив[0], Неопределено); Последний = ?(Массив.Количество() > 0, Массив[Массив.ВГраница()], Неопределено).