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

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

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

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

Массив в 1С — это упорядоченная коллекция значений, к каждому элементу которой можно обратиться по числовому индексу. Главная особенность, которую нужно запомнить сразу: нумерация элементов начинается с нуля, а не с единицы. Первый элемент имеет индекс 0, второй — 1, последний — индекс, равный количеству элементов минус один.

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

Создание массива и первое обращение к элементу

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

// Создание и заполнение массива

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

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

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

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

// Обращение к элементам по индексу

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

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

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

Квадратные скобки работают и на чтение, и на запись. Чтобы изменить элемент, присвойте значение по индексу: Товары[1] = "Новое значение";. Важно: записывать можно только в существующие позиции — присвоение по индексу за пределами массива вызовет ошибку.

Методы Получить, Количество и ВГраница

Кроме квадратных скобок, для чтения элемента существует метод Получить(Индекс). Оба варианта эквивалентны: Товары.Получить(0) вернёт то же значение, что и Товары[0]. На практике чаще используют скобки — запись короче и привычнее.

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

Если Товары.Количество() > 2 Тогда

Третий = Товары[2]; // безопасное обращение

КонецЕсли;

// Последний элемент массива

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

Перебор элементов массива в цикле

Чаще всего обращение к элементам происходит не по одному, а в цикле. Есть два основных способа перебора, и выбор зависит от того, нужен ли вам индекс элемента.

Цикл «Для Каждого» — когда индекс не нужен

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

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

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

КонецЦикла;

Цикл «Для» по индексам — когда нужна позиция элемента

Если требуется знать позицию элемента или изменять элементы по месту, используйте цикл по индексам от 0 до ВГраница().

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

Товары[Инд] = СокрЛП(Товары[Инд]); // изменение элемента

КонецЦикла;

Сравнение способов перебора

Для Каждого ... Из

Короче и безопаснее; подходит для чтения. Не даёт индекс и неудобен для замены элементов.

Для по индексам

Позволяет изменять элементы и знать их позицию; требует аккуратности с границами массива.

Обращение к элементу двумерного массива

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

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

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

Строка1.Добавить("Ячейка 1-1");

Строка1.Добавить("Ячейка 1-2");

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

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

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

Поиск элемента и безопасное обращение

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

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

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

Найденный = Товары[Индекс];

КонецЕсли;

Также полезны методы Вставить(Индекс, Значение) для добавления элемента в середину и Удалить(Индекс) для удаления. После удаления индексы всех последующих элементов сдвигаются на единицу — если вы удаляете элементы в цикле, перебирайте массив с конца, иначе пропустите часть элементов.

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

Типичные ошибки и как их избежать

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

Защитный шаблон прост: перед обращением убедитесь, что индекс находится в диапазоне от 0 до ВГраница(). Если индекс вычисляется динамически, добавьте явную проверку.

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

Значение = Товары[Индекс];

Иначе

// индекс вне диапазона — обработать ситуацию

КонецЕсли;

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

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

Индекс в допустимом диапазоне
Норма

Индекс от 0 до ВГраница() включительно

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

Индекс отрицательный или равен Количество()

Массив заполнен
Норма

Количество() больше нуля

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

Количество() = 0, обращение к любому индексу вызовет ошибку

Результат Найти()
Норма

Возвращён числовой индекс

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

Возвращено Неопределено — значения нет в массиве

Когда вместо массива лучше другая коллекция

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

Итог

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

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

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

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

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

Чем отличаются Количество() и ВГраница()?

Количество() возвращает число элементов, ВГраница() — индекс последнего элемента, то есть Количество() минус 1. Для пустого массива Количество() равно 0, а ВГраница() равен -1.

Что будет, если обратиться к несуществующему индексу?

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

Как получить последний элемент массива?

Через Массив[Массив.ВГраница()]. Предварительно убедитесь, что массив не пуст: если Количество() равно 0, обращение вызовет ошибку.

Можно ли изменить элемент массива через цикл Для Каждого?

Напрямую заменить элемент через переменную цикла нельзя — она содержит копию ссылки на значение. Для замены используйте цикл по индексам и присваивание через Массив[Инд] = НовоеЗначение.

Как проверить, есть ли значение в массиве?

Используйте метод Найти(Значение): он вернёт индекс элемента или Неопределено, если значения нет. Сравнение результата с Неопределено и есть проверка наличия.