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

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

Индекс находится за границами массива в 1С: что это и как исправить

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

Ошибка «Индекс находится за границами массива» — одна из самых частых ошибок времени выполнения в 1С:Предприятие. Она появляется, когда код пытается обратиться к элементу массива, таблицы значений, строки или другой коллекции по номеру, которого не существует. Например, массив содержит три элемента (индексы 0, 1, 2), а программа запрашивает элемент с индексом 3 или больше — в этот момент платформа прерывает выполнение и выдаёт сообщение об ошибке.

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

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

Что означает эта ошибка простыми словами

Массив в 1С — это упорядоченный набор значений, где каждый элемент имеет номер (индекс), начиная с нуля. Если в массиве пять элементов, допустимые индексы — от 0 до 4. Попытка прочитать элемент с индексом 5, 10 или -1 приводит к исключению «Индекс находится за границами массива». То же правило действует для строк (обращение к символу по номеру), таблиц значений и других индексируемых коллекций.

Типичный код, вызывающий ошибку, выглядит так: программа вычисляет индекс по формуле, например Массив[НомерСтроки], где НомерСтроки оказалась больше, чем количество элементов. Часто проблема возникает при обработке файлов, разборе строк с разделителями, обходе табличных частей документов — везде, где размер данных заранее неизвестен.

Где искать причину: как читать текст ошибки

Сообщение об ошибке обычно содержит указание на место в коде: имя модуля, номер строки и фрагмент выражения. Например: {ОбщийМодуль.ОбменДанными.Модуль(152)}: Индекс находится за границами массива. Это значит, что в общем модуле «ОбменДанными» на строке 152 выполняется обращение к элементу за пределами коллекции.

Порядок действий при анализе: откройте конфигуратор, найдите указанный модуль через поиск (Ctrl+Shift+F по имени модуля), перейдите на нужную строку. Посмотрите, к какой переменной идёт обращение по индексу, и проследите, откуда берётся значение индекса — из счётчика цикла, из параметра функции, из результата функции Найти() или вычисляется по формуле.

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

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

Типичные сценарии возникновения ошибки

Обращение к элементу без проверки результата поиска

Частая ситуация: функция СтрНайти() или Найти() не нашла вхождение и вернула 0 или -1, а код использует это значение как индекс без проверки. Например, разбор строки «Фамилия Имя Отчество» через СтрРазделить(Строка, " ") с последующим обращением к Части[2]: если в данных оказалось только фамилия и имя, третьего элемента нет — и возникает ошибка.

Цикл с неверными границами

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

Обход табличной части с удалением строк

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

Ошибка в обработке обмена или загрузке файлов

При загрузке данных из Excel, CSV или XML структура файла может отличаться от ожидаемой: меньше колонок, пустые строки, лишние разделители. Код, обращающийся к Колонки[5], упадёт, если в файле только четыре колонки. Здесь помогает проверка Если Части.Количество() > 5 Тогда ... перед обращением.

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

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

Ошибка у всех после обновленияОшибка в новом коде конфигурации

Проверьте доработки и журнал изменений

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

Проверьте структуру файла или источника

Как исправить ошибку в коде

Универсальный принцип — перед обращением к элементу по индексу убедиться, что индекс находится в допустимых пределах. Базовая проверка выглядит так:

Если Индекс >= 0 И Индекс < Массив.Количество() Тогда

Значение = Массив[Индекс];

Иначе

// Обработка ситуации: пропуск, значение по умолчанию, запись в журнал

КонецЕсли;

Там, где индекс не нужен сам по себе, предпочтительнее цикл Для Каждого — он исключает выход за границы по построению. При разборе строк используйте проверку количества частей после СтрРазделить(). При работе с результатами поиска всегда проверяйте, что найденное значение не равно Неопределено или -1, прежде чем использовать его как индекс.

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

Что делать пользователю без доступа к конфигуратору

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

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

Маршрут решения

Как выбрать действие

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

Проверка результата после исправления

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

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

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

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

Повторение исходной операции
Норма

Операция выполняется без сообщения об ошибке

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

Ошибка возникает снова на той же строке

Проверка на минимальных данных
Норма

Код корректно обрабатывает пустую коллекцию и один элемент

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

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

Корректность итогового результата
Норма

Данные обработаны полностью, ничего не пропущено

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

Часть строк или элементов потерялась после исправления

Частые ошибки при исправлении

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

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

Типичные ошибки
01
Скрытие ошибки через Попытка/Исключение без анализа причины — данные обрабатываются неполностью
02
Исправление индекса вычитанием единицы без понимания логики — смещается вся обработка
03
Правка кода прямо в рабочей базе без копии — риск сломать работу всех пользователей
04
Игнорирование причины в данных при ошибке в типовом коде — проблема повторится на другой записи
Итог

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

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

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

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

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

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

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

Ошибка в типовой конфигурации без доработок — это баг 1С?

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

Можно ли найти проблемное место без конфигуратора?

Частично. Текст ошибки с именем модуля и номером строки позволяет понять, какая подсистема затронута, а воспроизведение на разных данных — локализовать проблемный объект. Но для исправления кода всё равно потребуется конфигуратор и навыки разработки.

Чем отличается эта ошибка от «Поле объекта не обнаружено»?

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

Нужно ли обновлять платформу, чтобы избавиться от ошибки?

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