К статье
Практический материал

Разработка и Конфигурация · 9 мин

Что значит в 1С «Индекс находится за границами массива»

Что означает ошибка «Индекс находится за границами массива» в 1С, где она возникает, как найти причину в коде и исправить без риска для данных.

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

Массив в 1С — это упорядоченная коллекция значений, где каждый элемент имеет порядковый номер, начиная с нуля. Если массив содержит три элемента, допустимые индексы — 0, 1 и 2. Попытка прочитать элемент с индексом 3 или -1 немедленно вызывает ошибку и прерывает выполнение кода.

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

Что означает эта ошибка технически

Во встроенном языке 1С массив создаётся конструктором Новый Массив и заполняется методом Добавить(). Количество элементов возвращает метод Количество(), а верхняя допустимая граница индекса — метод ВГраница(), который равен Количество() - 1. Для пустого массива ВГраница() возвращает -1, то есть обращение даже к нулевому элементу уже вызовет ошибку.

Типичные конструкции, где возникает проблема: прямое обращение вида Массив[5] без проверки длины, цикл Для Инд = 0 По Массив.Количество() Цикл (здесь последняя итерация выходит за границу, потому что максимальный индекс на единицу меньше количества), а также работа с результатом функций, которые могут вернуть пустой массив.

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

Где чаще всего возникает ошибка

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

Также ошибка часто встречается в следующих местах:

  • обработки загрузки данных из файлов (Excel, CSV), где строки имеют разное число колонок;
  • обмены и интеграции, когда ответ внешнего сервиса пришёл пустым или неполным;
  • отчёты и печатные формы, где табличная часть документа пуста, а код обращается к её первой строке;
  • рекурсивные алгоритмы и разбор деревьев значений с ручным управлением индексами.
Ошибка у всех пользователейПроблема в коде конфигурации

Искать причину в общем модуле или обработке

Ошибка на конкретном документеПроблема в данных

Проверить табличные части и реквизиты этого объекта

Ошибка при обменеНеполные данные из внешнего источника

Смотреть журнал обмена и состав полученного пакета

Ошибка после обновленияИзменилось поведение типового кода

Сравнить с предыдущей версией модуля

Как найти место ошибки

Первый шаг — прочитать полный текст сообщения. 1С обычно указывает модуль, номер строки и фрагмент кода, где произошло обращение за границы. Если сообщение выводится пользователю, попросите скопировать его целиком или сделать скриншот: одна фраза «индекс за границами» без контекста почти ничего не даёт.

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

Порядок поиска причины
  1. 1
    Скопируйте полный текст ошибки с указанием модуля и строки
  2. 2
    Откройте указанную строку в конфигураторе и определите, к какому массиву идёт обращение
  3. 3
    В отладчике проверьте значение индекса и Количество() элементов массива
  4. 4
    Проследите, где массив заполняется, и почему элементов меньше, чем ожидается
  5. 5
    Исправьте расчёт индекса или добавьте проверку границ, затем повторите сценарий

Когда отладка недоступна (ошибка только на рабочей базе), добавьте временное логирование: перед проблемной строкой запишите в журнал регистрации размер массива и значение индекса. Это безопасно и позволяет собрать факты без остановки работы пользователей.

Как исправить: типовые приёмы

Самый надёжный приём — заменить перебор по индексам на цикл Для Каждого Элемент Из Массива Цикл, который вообще не использует индексы и не может выйти за границы. Если индекс нужен для логики, перед обращением проверяйте условие Индекс <= Массив.ВГраница() или просто Массив.Количество() > 0 для обращения к первому элементу.

bsl
Если Массив.Количество() > Индекс Тогда
    Значение = Массив[Индекс];
Иначе
    Значение = Неопределено;
КонецЕсли;

При разборе строк заранее проверяйте результат: после СтрРазделить(Строка, \";\") сравните Части.Количество() с ожидаемым числом полей и обработайте несоответствие отдельной веткой — например, пропустите строку файла с записью в протокол. При обращении к табличной части документа убедитесь, что она не пуста, прежде чем брать первую строку.

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

Если ошибка возникает у пользователя, а не у разработчика

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

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

Типичные ошибки при исправлении

Типичные ошибки
01
Замена Количество() на ВГраница() только в одном месте — аналогичный цикл в соседней процедуре продолжает падать
02
Проверка только на пустоту массива, тогда как индекс может превышать границу и в непустом массиве
03
Исправление «в лоб» через Попытка/Исключение без анализа причины — ошибка прячется, а данные обрабатываются неполностью
04
Исправление сразу на рабочей базе без тестирования на копии — риск испортить реальные данные

Как проверить, что проблема решена

После исправления повторите исходный сценарий на тех же данных, где ошибка воспроизводилась, и на «пограничных» случаях: пустой массив, один элемент, максимально длинный набор данных. Убедитесь, что код не просто перестал падать, но и обрабатывает все элементы — иногда после добавления проверки границ последний элемент молча пропускается, что тоже является дефектом.

Контрольные точки

Как проверить результат

Исходный сценарий
Норма

Выполняется без ошибки, данные обработаны полностью

Тревожный признак

Ошибка ушла, но часть данных потерялась

Пустой массив
Норма

Код корректно пропускает обработку или выдаёт понятное сообщение

Тревожный признак

Падение или молчаливый пропуск без записи в протокол

Журнал регистрации
Норма

Нет новых записей об ошибке за период проверки

Тревожный признак

Ошибка появляется на других данных или у других пользователей

Итог

Что важно запомнить

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

Частые вопросы

Почему ошибка появляется только иногда, на одних и тех же действиях?

Потому что она зависит от данных: массив заполняется по-разному для разных документов, строк файла или ответов сервиса. Ищите, чем отличается «падающий» случай — чаще всего это пустая табличная часть, отсутствующее поле или меньшее число частей после разбора строки.

Можно ли просто обернуть код в Попытка/Исключение?

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

Ошибка возникает в типовой конфигурации без доработок — что делать?

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

Чем ВГраница() отличается от Количество()?

Количество() возвращает число элементов, а ВГраница() — максимальный допустимый индекс, то есть Количество() минус 1. Для пустого массива Количество() равно 0, а ВГраница() равно -1. В циклах по индексам верхней границей должна быть именно ВГраница().

Может ли эта ошибка испортить данные в базе?

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