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

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

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

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

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

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

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

Что означает эта ошибка и как устроена нумерация в 1С

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

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

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

Типовые сценарии, в которых возникает ошибка

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

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

Разбор строки разделителем

Частый источник сбоя — функции разбиения строк: СтрРазделить(), СтрРазложить() в старых конфигурациях. Код ожидает, что после разделения получится, скажем, три части, и сразу обращается к элементу с индексом 2. Если в реальных данных разделителя нет или он встречается один раз, массив окажется короче — и возникнет ошибка. Типичный пример: разбор ФИО, адреса, строки обмена из файла.

Обращение к табличной части или выборке

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

Проблемы в типовых механизмах и обменах

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

Место в тексте ошибкиМодуль и номер строки

Сохраните полный текст — он указывает, где искать сбой

ПовторяемостьВсегда на одном действии

Скорее ошибка в коде или в конкретных данных

Появилась после обновленияНовая версия конфигурации

Проверьте обработчики обновления и известные ошибки релиза

Только у одного пользователя или в одной базеЛокальная проблема

Проверяйте данные конкретного объекта и кэш

Как локализовать место сбоя

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

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

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

Порядок диагностики
  1. 1
    Сохраните полный текст ошибки с указанием модуля и строки
  2. 2
    Определите действие, при котором ошибка воспроизводится стабильно
  3. 3
    Проверьте журнал регистрации на наличие связанных сообщений
  4. 4
    При доступе к конфигуратору повторите ситуацию под отладчиком с остановкой по ошибке
  5. 5
    Посмотрите размер коллекции и значение индекса в момент сбоя
  6. 6
    Определите, виноват код или данные, и переходите к исправлению

Исправление ошибки в прикладном коде

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

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

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

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

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

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

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

Иначе

Значение = ""; // значение по умолчанию

КонецЕсли;

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

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

Что делать пользователю без доступа к коду

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

Если ошибка появилась сразу после обновления конфигурации, проверьте, завершились ли все обработчики обновления: в типовых конфигурациях это видно в разделе «Администрирование» → «Обслуживание» → «Результаты обновления». Незавершённые отложенные обработчики — частая причина нестабильной работы после обновления.

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

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

Когда проблема в данных или в структуре базы

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

В этом случае порядок действий такой: сделайте резервную копию, затем выполните тестирование и исправление информационной базы (конфигуратор → «Администрирование» → «Тестирование и исправление») сначала в режиме только тестирования, без включения исправляющих действий. По результатам оцените, есть ли физические ошибки. Для клиент-серверных баз дополнительно имеет смысл проверить целостность средствами СУБД.

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

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

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

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

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

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

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

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

Итог

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

Ошибка означает обращение к несуществующему элементу коллекции (нумерация в 1С — с нуля). Диагностику начинайте с полного текста ошибки и стека вызовов, исправляйте причину — границы циклов, проверку размера коллекций, качество данных. Перед любыми действиями с рабочей базой делайте резервную копию.

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

Можно ли просто нажать «ОК» и продолжить работу?

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

Почему ошибка возникает только на одном документе, а на остальных всё работает?

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

Ошибка появилась после обновления конфигурации. Что проверить в первую очередь?

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

Поможет ли переустановка платформы 1С?

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

Чем опасно «заглушить» ошибку через Попытка/Исключение?

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

Как понять, что проблема в структуре базы, а не в коде?

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