Разработка и Конфигурация · 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"
При работе с такой структурой проверяйте границы обоих уровней: сначала что строка существует во внешнем массиве, затем что ячейка существует во вложенном. Если данные табличные и структура сложная, часто удобнее использовать таблицу значений вместо массива массивов.
Поиск элемента и безопасное обращение
Метод Найти(Значение) возвращает индекс первого найденного элемента или Неопределено, если значения нет. Результат нужно проверять перед обращением по индексу.
Индекс = Товары.Найти("Номенклатура Б");
Если Индекс <> Неопределено Тогда
Найденный = Товары[Индекс];
КонецЕсли;
Также полезны методы Вставить(Индекс, Значение) для добавления элемента в середину и Удалить(Индекс) для удаления. После удаления индексы всех последующих элементов сдвигаются на единицу — если вы удаляете элементы в цикле, перебирайте массив с конца, иначе пропустите часть элементов.
Типичные ошибки и как их избежать
Самая частая ошибка — «Индекс находится за границами массива». Она возникает при обращении к несуществующему индексу: отрицательному, равному количеству элементов или большему. Вторая по частоте причина сбоев — попытка обратиться к элементу пустого массива.
Защитный шаблон прост: перед обращением убедитесь, что индекс находится в диапазоне от 0 до ВГраница(). Если индекс вычисляется динамически, добавьте явную проверку.
Если Индекс >= 0 И Индекс <= Товары.ВГраница() Тогда
Значение = Товары[Индекс];
Иначе
// индекс вне диапазона — обработать ситуацию
КонецЕсли;
Как проверить корректность обращения
Индекс от 0 до ВГраница() включительно
Индекс отрицательный или равен Количество()
Количество() больше нуля
Количество() = 0, обращение к любому индексу вызовет ошибку
Возвращён числовой индекс
Возвращено Неопределено — значения нет в массиве
Когда вместо массива лучше другая коллекция
Массив оптимален, когда важен порядок элементов и обращение по позиции. Если данные ищутся по ключу, а не по номеру, удобнее соответствие — обращение идёт по произвольному ключу. Если нужен список с представлением для интерфейса, подойдёт список значений. Для табличных данных с именованными колонками правильный выбор — таблица значений.
Что важно запомнить
К элементу массива обращаются по индексу в квадратных скобках, нумерация с нуля. Границы контролируют методами Количество() и ВГраница(), результат Найти() проверяют на Неопределено. Для перебора без индекса используйте Для Каждого, для изменения элементов — цикл по индексам.
Частые вопросы
С какого индекса начинается массив в 1С?
С нуля. Первый элемент — Массив[0], последний — Массив[Массив.ВГраница()]. Это отличается, например, от строк табличных документов, где нумерация идёт с единицы.
Чем отличаются Количество() и ВГраница()?
Количество() возвращает число элементов, ВГраница() — индекс последнего элемента, то есть Количество() минус 1. Для пустого массива Количество() равно 0, а ВГраница() равен -1.
Что будет, если обратиться к несуществующему индексу?
Платформа прервёт выполнение с ошибкой «Индекс находится за границами массива». Чтобы этого избежать, проверяйте индекс перед обращением или используйте попытку-исключение.
Как получить последний элемент массива?
Через Массив[Массив.ВГраница()]. Предварительно убедитесь, что массив не пуст: если Количество() равно 0, обращение вызовет ошибку.
Можно ли изменить элемент массива через цикл Для Каждого?
Напрямую заменить элемент через переменную цикла нельзя — она содержит копию ссылки на значение. Для замены используйте цикл по индексам и присваивание через Массив[Инд] = НовоеЗначение.
Как проверить, есть ли значение в массиве?
Используйте метод Найти(Значение): он вернёт индекс элемента или Неопределено, если значения нет. Сравнение результата с Неопределено и есть проверка наличия.