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

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

Как получить элемент массива в 1С

Как получить элемент массива в 1С по индексу, перебором и через Найти. Синтаксис, примеры кода, обработка ошибок и типичные ошибки разработчиков.

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

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

Главный риск при работе с массивом — обращение по несуществующему индексу. Такая ошибка прерывает выполнение кода с сообщением «Индекс находится за границами массива». Поэтому перед прямым обращением всегда проверяют размер массива через Количество() или ВГраница().

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

Самый частый способ — прямое обращение через квадратные скобки. Индекс указывается целым числом от 0 до Количество() - 1. Следующий пример создаёт массив и извлекает из него первый и последний элементы:

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

Массив.Добавить("Январь");

Массив.Добавить("Февраль");

Массив.Добавить("Март");

Первый = Массив[0]; // "Январь"

Последний = Массив[Массив.Количество() - 1]; // "Март"

Метод Количество() возвращает число элементов, поэтому индекс последнего элемента всегда на единицу меньше размера. Это классическая точка ошибки: разработчики, привыкшие к нумерации с единицы (как в запросах и таблицах значений в некоторых контекстах), обращаются к Массив[Массив.Количество()] и получают ошибку выхода за границы.

Альтернативный вариант — метод Получить(), который работает аналогично квадратным скобкам:

Элемент = Массив.Получить(1); // то же, что Массив[1]

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

Проверка границ перед обращением

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

Индекс = 5;

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

Элемент = Массив[Индекс];

Иначе

Элемент = Неопределено;

КонецЕсли;

Отдельно проверяйте случай пустого массива. Если массив только что создан и в него ничего не добавляли, любое обращение по индексу завершится ошибкой. Условие Массив.Количество() > 0 — минимальная защита перед чтением первого элемента.

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

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

Для Каждого Элемент Из Массив Цикл

Сообщить(Элемент);

КонецЦикла;

Если внутри цикла нужен и сам индекс, применяется классический цикл Для со счётчиком от 0 до ВГраница():

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

Сообщить("Элемент " + Инд + ": " + Массив[Инд]);

КонецЦикла;

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

Порядок действий
  1. 1
    Создайте массив: Массив = Новый Массив и заполните его методом Добавить()
  2. 2
    Определите нужный индекс — помните, что нумерация с нуля
  3. 3
    Проверьте границы: индекс от 0 до Массив.ВГраница()
  4. 4
    Получите элемент: Элемент = Массив[Индекс]
  5. 5
    Проверьте результат в отладчике или через Сообщить()

Поиск элемента по значению

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

Индекс = Массив.Найти("Февраль");

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

Элемент = Массив[Индекс]; // "Февраль"

Иначе

Сообщить("Элемент не найден");

КонецЕсли;

Сравнение выполняется по значению. Для строк учитывайте регистр и пробелы: «Февраль» и «февраль» — разные значения. Для объектов (ссылок на справочники, документы) сравнение идёт по ссылке, что обычно и требуется на практике.

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

Получение элементов вложенных массивов и массивов в структурах

Элементом массива может быть другой массив. Обращение к вложенному элементу выполняется последовательными квадратными скобками:

Вложенный = Новый Массив;

Вложенный.Добавить("А");

Вложенный.Добавить("Б");

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

Массив.Добавить(Вложенный);

Значение = Массив[0][1]; // "Б"

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

Строка = Новый Структура("Номенклатура, Количество", "Товар", 5);

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

Массив.Добавить(Строка);

Имя = Массив[0].Номенклатура; // "Товар"

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

Альтернативы: когда массив не лучший выбор

Для получения значения по ключу вместо числового индекса удобнее Соответствие — аналог словаря. Поиск по ключу в соответствии быстрее перебора массива и не требует метода Найти:

Соответствие = Новый Соответствие;

Соответствие.Вставить("Январь", 1);

Значение = Соответствие.Получить("Январь"); // 1

Фиксированный массив подходит, когда состав элементов известен заранее и не должен меняться — например, список видов расчёта. Список значений используют, когда элементам нужны представления и пометки, например для интерактивного выбора пользователем.

Сравнение вариантов

Массив

Доступ по индексу с нуля, методы Найти и ВГраница. Подходит для упорядоченных списков, перебора и передачи между процедурами.

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

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

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

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

Типичные ошибки при получении элементов

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

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

Ещё одна частая ситуация — путаница между Неопределено и индексом 0. Проверка Если Индекс Тогда некорректна: индекс 0 приводится к Ложь, и найденный первый элемент будет ошибочно считаться отсутствующим. Всегда сравнивайте результат Найти явно: Индекс <> Неопределено.

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

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

Значение элемента
Норма

Переменная содержит ожидаемое значение, видно в отладчике

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

Неопределено или значение соседнего элемента — сбит индекс

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

Числовой индекс от 0 до ВГраница()

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

Неопределено — значение не найдено, обращение по нему вызовет ошибку

Работа цикла
Норма

Обработано ровно Количество() элементов

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

Элементы пропущены — возможно удаление внутри цикла

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

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

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

Что вернёт Массив.Найти(), если элемент не найден?

Значение Неопределено, а не -1 и не 0. Поэтому результат всегда проверяют сравнением Индекс <> Неопределено, прежде чем обращаться по полученному индексу.

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

Обратиться по индексу Массив.ВГраница() или Массив.Количество() - 1 — оба выражения эквивалентны. Перед этим убедитесь, что массив не пуст, иначе получите ошибку выхода за границы.

Можно ли получить элемент массива по строковому ключу?

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

Чем отличается Массив[0] от Массив.Получить(0)?

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

Как безопасно получить элемент, если массив может быть пустым?

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

Итог

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

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