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