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

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

Ошибка «Индекс находится за границами массива» в 1С: как найти и исправить

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

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

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

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

Что означает ошибка и где она возникает

В языке 1С массивы, таблицы значений, списки значений, строки и другие коллекции индексируются с нуля. У массива из трёх элементов допустимые индексы — 0, 1 и 2. Обращение к элементу с индексом 3 или -1 приводит к ошибке «Индекс находится за границами массива». То же справедливо для обращения к символу строки по номеру или к строке табличной части по индексу.

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

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

Воспроизводится ли ошибка на конкретном документе или отчёте у любого пользователя

Ошибка только на одном объектеПроблемные данные

Что особенного в документе: пустые строки, незаполненные реквизиты, обмены

Ошибка после обновления или доработкиРегрессия в коде

Какие модули менялись в последнем обновлении или доработке

Ошибка во внешней обработкеОшибка в коде обработки

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

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

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

Если диалог недоступен или ошибка возникает в фоновом задании, откройте журнал регистрации (Администрирование → Обслуживание → Журнал регистрации), отфильтруйте по уровню «Ошибка» и нужному времени. В комментарии события будет тот же текст с указанием модуля и строки.

Для точной диагностики полезно воспроизвести ошибку под отладчиком. В конфигураторе включите отладку (Отладка → Начать отладку), установите точку останова на найденной строке и повторите действие пользователя. В табло переменных видно фактическое количество элементов коллекции и значение индекса в момент сбоя — это сразу показывает, почему граница нарушена.

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

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

Чаще всего встречается обращение к элементу после поиска, который ничего не нашёл. Например, код разбивает строку функцией СтрРазделить и сразу берёт второй элемент, предполагая, что разделитель точно есть. Если в данных разделителя нет, массив содержит один элемент, и обращение к индексу 1 вызывает ошибку.

Второй распространённый случай — цикл с некорректными границами. Классическая ошибка: перебор от 1 до Количество() вместо диапазона от 0 до Количество() - 1, или обращение к элементу Индекс + 1 на последней итерации цикла. Также ошибка возникает при удалении элементов коллекции в прямом цикле: после удаления индексы сдвигаются, и счётчик выходит за фактические границы.

Третий сценарий — работа с результатом запроса или колонкой таблицы значений, когда код предполагает наличие строк, а выборка пуста. Обращение к Выборка[0] или Таблица[0] без проверки, что таблица не пустая, даёт ту же ошибку на пустых данных.

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

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

Ошибка во внешней обработке или отчёте

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

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

Универсальный принцип исправления: перед обращением к элементу по индексу проверять, что индекс находится в допустимых границах. Для массива это условие вида Индекс >= 0 И Индекс < Массив.Количество(). Для коллекций, где поиск может вернуть Неопределено (методы Найти, НайтиСтроки), сначала проверяется результат поиска и только потом выполняется обращение.

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

Пример безопасного обращения после разбиения строки:

Части = СтрРазделить(СтрокаДанных, ";");

Если Части.Количество() >= 2 Тогда

Значение = Части[1];

Иначе

Значение = "";

// или запись в журнал регистрации о некорректных данных

КонецЕсли;

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

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

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

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

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

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

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

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

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

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

Исходная операция
Норма

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

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

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

Пустые данные
Норма

Документ без строк или с пустыми реквизитами обрабатывается корректно

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

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

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

Нет новых ошибок по изменённому модулю за период работы

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

Появляются ошибки в смежных операциях

Работа других пользователей
Норма

Смежные сценарии (проведение, отчёты) работают как раньше

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

После правки сломались другие операции

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

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

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

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

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

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

Ошибка возникает только у одного пользователя. Что это значит?

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

Как исправить ошибку, если конфигурация на поддержке без возможности изменения?

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

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

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

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

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