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

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

Индекс за границами массива в 1С: причины и способы исправления

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

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

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

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

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

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

Типичные места возникновения: циклы с ручным управлением счётчиком, разбор строк через СтрРазделить() с обращением к элементам результата, обработка результата запроса, когда ожидалась одна строка, а вернулось ноль, работа с данными формы, когда табличная часть пуста, а код обращается к первой строке.

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

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

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

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

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

Порядок диагностики
  1. 1
    Получите текст ошибки с деталями: модуль, строка, контекст.
  2. 2
    Воспроизведите ошибку под отладчиком с остановкой по ошибке.
  3. 3
    В момент остановки проверьте размер коллекции и значение индекса.
  4. 4
    Проследите по стеку вызовов, откуда пришло некорректное значение.
  5. 5
    Исправьте источник данных или добавьте проверку границ.
  6. 6
    Проверьте исправление на данных, где ошибка воспроизводилась.

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

Цикл с неверной границей

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

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

Код вроде Части = СтрРазделить(Строка, ";"); Значение = Части[2]; падает, если в строке меньше трёх частей. Перед обращением проверяйте размер: Если Части.Количество() > 2 Тогда ... КонецЕсли;. То же относится к разбору данных из файлов, обменов и внешних источников — входные данные всегда считайте потенциально неполными.

Пустая выборка или таблица

Обращение Таблица[0] к пустой таблице значений гарантированно вызывает ошибку. Перед чтением первой строки проверяйте Если Таблица.Количество() > 0 Тогда. Для выборок из запроса используйте проверку Если Выборка.Следующий() Тогда вместо прямого обращения к полям без проверки.

Удаление элементов внутри цикла

Если в цикле с прямым перебором индексов удалять элементы коллекции, размер уменьшается, а счётчик продолжает расти — на последних итерациях индекс выходит за границы. Решения: обход коллекции с конца (Для Инд = -Коллекция.Количество() + 1 По 0 Цикл с отрицательным шагом либо вычисление индекса от конца), удаление после цикла по собранному списку, либо корректировка счётчика после удаления.

bsl
// Безопасное обращение к элементу массива
Индекс = 3;
Если Индекс >= 0 И Индекс < Массив.Количество() Тогда
    Значение = Массив[Индекс];
Иначе
    // обработка ситуации: значение по умолчанию или сообщение
КонецЕсли;

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

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

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

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

Профилактика: как писать код, устойчивый к ошибке

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

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

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

Типичные ошибки
01
Цикл от 1 до Количество() с обращением Массив[Инд] — на последней итерации индекс выходит за границу.
02
Обращение к Части[1] после СтрРазделить без проверки числа частей — падение на неполных данных.
03
Удаление элементов коллекции в прямом цикле по индексу — размер уменьшается, счётчик убегает вперёд.
04
Обращение Таблица[0] без проверки Количество() > 0 — ошибка на пустом результате запроса.
05
Маскировка ошибки пустой Попытка/Исключение без логирования — причина теряется, ошибка всплывает позже в другом месте.

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

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

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

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

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

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

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

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

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

Пустая коллекция на входе
Норма

Код корректно обрабатывает ситуацию (пропуск, значение по умолчанию)

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

Новая ошибка или аварийное завершение

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

Нет новых ошибок по обработанным объектам

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

Ошибки пишутся, но скрыты конструкцией Попытка/Исключение

Часто задаваемые вопросы

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

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

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

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

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

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

Как быстро понять, какой именно массив вызвал ошибку, если их несколько в строке?

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

Выдаёт ли эту ошибку СУБД или платформа 1С?

Это ошибка платформы 1С на уровне исполнения встроенного языка, а не СУБД. Поэтому перезапуск сервера СУБД или пересоздание базы проблему не решит — нужно исправлять код или данные, с которыми он работает.

Ошибка в расширении конфигурации. Как отладить?

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

Итог

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

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