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