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

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

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

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

Массив в 1С — это упорядоченная коллекция значений, к каждому элементу которой можно обратиться по числовому индексу. В отличие от многих других языков, встроенный язык 1С использует квадратные скобки для доступа к элементу: Массив[Индекс]. Индексация начинается с нуля, то есть первый элемент имеет индекс 0, а последний — индекс Количество - 1.

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

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

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

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

Товары = Новый Массив;

Товары.Добавить("Номенклатура А");

Товары.Добавить("Номенклатура Б");

Товары.Добавить("Номенклатура В");

// Чтение по индексу

ПервыйТовар = Товары[0]; // "Номенклатура А"

ВторойТовар = Товары[1]; // "Номенклатура Б"

// Запись по индексу

Товары[1] = "Номенклатура Б (изменена)";

Индексом может быть любое выражение, дающее целое число: переменная, результат функции, арифметическое выражение. Например, Товары[Товары.Количество() - 1] вернёт последний элемент. Дробное число в индексе приведёт к ошибке, поэтому при вычислениях используйте Цел() или Окр(), если результат может быть нецелым.

Нумерация с нуля и границы массива

Главное, что нужно запомнить: верхняя граница массива — это Количество() - 1, а не Количество(). Для массива из трёх элементов допустимые индексы — 0, 1 и 2. Обращение к Массив[3] вызовет исключение «Индекс находится за границами массива», и выполнение процедуры прервётся.

Для получения верхней границы удобно использовать метод ВГраница(): он возвращает индекс последнего элемента или -1 для пустого массива. Это особенно полезно в циклах, где не нужно каждый раз писать Количество() - 1.

Если Товары.ВГраница() >= 0 Тогда

Последний = Товары[Товары.ВГраница()];

КонецЕсли;

Перебор массива: обращение по индексу в цикле

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

// Перебор без индекса

Для Каждого Товар Из Товары Цикл

Сообщить(Товар);

КонецЦикла;

// Перебор с индексом

Для Индекс = 0 По Товары.ВГраница() Цикл

НомерСтроки = Индекс + 1; // человекочитаемый номер

Сообщить("Строка " + НомерСтроки + ": " + Товары[Индекс]);

КонецЦикла;

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

Для Индекс = -Товары.ВГраница() По 0 Цикл

РеальныйИндекс = -Индекс;

Если Товары[РеальныйИндекс] = Неопределено Тогда

Товары.Удалить(РеальныйИндекс);

КонецЕсли;

КонецЦикла;

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

Безопасное обращение по вычисленному индексу
  1. 1
    Вычислите индекс и сохраните его в переменную
  2. 2
    Проверьте, что индекс >= 0
  3. 3
    Проверьте, что индекс <= Массив.ВГраница()
  4. 4
    Только после обеих проверок обратитесь к Массив[Индекс]
  5. 5
    Обработайте ветку «Иначе» — задайте поведение при недопустимом индексе

Обращение к индексу в типовых сценариях

Результат СтрРазделить

Функция СтрРазделить() возвращает массив подстрок. Обращение к конкретной части строки — типичный случай работы по индексу. Здесь важно учитывать, что разделителей в строке может оказаться меньше, чем ожидалось, и массив будет короче.

Части = СтрРазделить("Иванов;Иван;Иванович", ";");

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

Фамилия = Части[0];

Имя = Части[1];

Отчество = Части[2];

КонецЕсли;

Двумерные данные: массив массивов

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

Строка1 = Новый Массив;

Строка1.Добавить("Товар");

Строка1.Добавить(100);

Таблица = Новый Массив;

Таблица.Добавить(Строка1);

ЗначениеЯчейки = Таблица[0][1]; // 100

Поиск индекса элемента

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

Индекс = Товары.Найти("Номенклатура Б");

Если Индекс <> Неопределено Тогда

Товары[Индекс] = "Номенклатура Б (новая)";

КонецЕсли;

bsl
Индекс = Массив.Найти(ИскомоеЗначение);
Если Индекс <> Неопределено Тогда
    Элемент = Массив[Индекс];
КонецЕсли;

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

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

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

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

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

Значение индекса в отладчике
Норма

Целое число от 0 до Количество() - 1

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

Отрицательное, дробное или больше верхней границы

Содержимое массива
Норма

Массив заполнен ожидаемым количеством элементов

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

Массив пуст или короче ожидаемого из-за логики заполнения

Поведение после Удалить()
Норма

Перебор идёт с конца, пропусков нет

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

Элементы пропускаются или возникает выход за границы

Типичные ошибки при работе с индексами

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

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

Отдельно стоит упомянуть смешение массива с другими коллекциями. У структуры и соответствия обращение по ключу выглядит похоже — Структура["Ключ"], — но для соответствия отсутствующий ключ вернёт Неопределено без ошибки, а для массива несуществующий индекс всегда вызывает исключение. Эта разница важна при переносе логики между типами коллекций.

Чем заменить массив, если индексы неудобны

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

Сравнение коллекций

Массив

Доступ по числовому индексу, порядок гарантирован. Подходит для упорядоченных списков и перебора; поиск значения — только перебором или Найти()

Соответствие

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

СписокЗначений

Элемент с представлением и пометкой, доступ по индексу и по значению. Удобен для интерактивных списков выбора

ТаблицаЗначений

Строки с именованными колонками, поиск и отбор методами. Для структурированных данных удобнее, чем массив массивов

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

Итог

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

Обращение к элементу массива — Массив[Индекс], нумерация с нуля, последняя позиция — ВГраница(). Вычисленные индексы проверяйте до обращения, удаляйте элементы при обратном переборе, а результат Найти() всегда сравнивайте с Неопределено.

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

С какого индекса начинается массив в 1С?

С нуля. Первый элемент — Массив[0], последний — Массив[Массив.Количество() - 1] или Массив[Массив.ВГраница()]. Это отличается от нумерации строк табличного документа, где отсчёт идёт с единицы, что иногда вызывает путаницу.

Как узнать индекс элемента в цикле «Для Каждого»?

Напрямую — никак, цикл «Для Каждого» не предоставляет индекс. Либо заведите переменную-счётчик и увеличивайте её внутри цикла, либо используйте классический цикл Для Индекс = 0 По Массив.ВГраница() Цикл, где индекс доступен напрямую.

Что вернёт обращение к отрицательному индексу, например Массив[-1]?

Исключение «Индекс находится за границами массива». В отличие от некоторых языков, в 1С отрицательный индекс не означает отсчёт с конца. Для последнего элемента используйте Массив[Массив.ВГраница()].

Можно ли изменить размер массива после создания?

Да. Метод Добавить() расширяет массив на один элемент, Вставить(Индекс, Значение) вставляет элемент в середину со сдвигом остальных, Удалить(Индекс) убирает элемент, а Очистить() удаляет все. Задать размер напрямую можно только при создании: Новый Массив(10) создаст массив из десяти элементов со значением Неопределено.

Как обратиться к элементу массива, полученного из функции, не сохраняя его в переменную?

Такая возможность зависит от версии платформы: в современных версиях допустимо обращение вида ПолучитьМассив()[0] непосредственно к результату функции. Если код должен работать на старых релизах, надёжнее сначала присвоить результат переменной и затем обращаться по индексу.

Чем отличается обращение по индексу в массиве и в таблице значений?

Синтаксис похож — Таблица[0] вернёт первую строку, — но результатом будет объект «СтрокаТаблицыЗначений», к полям которой обращаются по имени колонки: Таблица[0].Сумма. У массива элемент — это само значение без именованных полей.