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