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

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

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

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

Массив в 1С — это коллекция значений, доступ к которым осуществляется по числовому индексу. Индексация начинается с нуля: первый элемент имеет индекс 0, последний — индекс на единицу меньше количества элементов. Это ключевое отличие от многих других конструкций платформы, и именно здесь начинающие разработчики допускают больше всего ошибок.

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

Ниже разобраны все рабочие способы с примерами кода, проверками границ массива и разбором типичных ошибок, которые приводят к исключениям «Индекс находится за границами массива».

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

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

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

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

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

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

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

ВторойЭлемент = Массив[1]; // "Февраль"

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

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

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

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

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

Индекс = 5;

Если Массив.Количество() > Индекс Тогда

Значение = Массив[Индекс];

Иначе

Значение = Неопределено;

КонецЕсли;

Для проверки непустого массива достаточно условия Если Массив.Количество() > 0 Тогда. Отдельной функции проверки пустоты у массива нет, в отличие от строк, где есть ПустаяСтрока().

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

Порядок безопасного получения значения
  1. 1
    Убедитесь, что переменная содержит массив, а не Неопределено
  2. 2
    Проверьте Массив.Количество() > 0
  3. 3
    Убедитесь, что нужный индекс меньше Количество()
  4. 4
    Получите значение через Массив[Индекс] или Массив.Получить(Индекс)
  5. 5
    При необходимости проверьте тип полученного значения перед использованием

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

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

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

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

КонецЦикла;

Если внутри цикла нужен и индекс элемента (например, для нумерации строк или обращения к параллельному массиву), используйте классический цикл со счётчиком:

Для Индекс = 0 По Массив.Количество() - 1 Цикл

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

КонецЦикла;

Обратная граница Количество() - 1 здесь критична. Распространённая ошибка — написать По Массив.Количество() без вычитания единицы: цикл дойдёт до несуществующего индекса и выбросит исключение на последней итерации.

Поиск значения в массиве методом Найти()

Если индекс неизвестен, но известно само значение, метод Найти() вернёт индекс первого вхождения или Неопределено, если элемент не найден:

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

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

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

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

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

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

КонецЕсли;

Важно помнить: Найти() возвращает не значение, а индекс. Проверка результата на Неопределено обязательна — иначе следующее обращение по индексу упадёт. Сравнение при поиске выполняется с учётом типа: число 1 и строка "1" — разные значения.

Для простой проверки наличия значения достаточно одного условия без получения самого элемента: Если Массив.Найти(ИскомоеЗначение) <> Неопределено Тогда. Это стандартный способ избежать дублей при заполнении массива.

Получение значений из массива структур

На практике массивы часто хранят не примитивные значения, а структуры — например, строки параметров отбора или данные, полученные из JSON. В этом случае сначала получают элемент массива, затем обращаются к свойству структуры:

СтрокаДанных = МассивСтруктур[0];

Наименование = СтрокаДанных.Наименование;

// Или в одну строку:

Наименование = МассивСтруктур[0].Наименование;

Если структура может не содержать нужного свойства, используйте метод Свойство(), который безопасно вернёт значение через переменную:

ЗначениеСвойства = Неопределено;

Если МассивСтруктур[0].Свойство("Цена", ЗначениеСвойства) Тогда

// Свойство найдено, значение в переменной ЗначениеСвойства

КонецЕсли;

Аналогично работают массивы строк таблиц значений и массивы объектов: сначала извлекается элемент по индексу, затем — нужное поле. Цепочка обращений выглядит как МассивСтрок[0].Номенклатура.

Альтернативные способы и смежные коллекции

Не всегда массив — оптимальная коллекция для задачи получения значения. Если данные ищутся по ключу, а не по позиции, удобнее соответствие: Соответствие.Получить(Ключ) возвращает значение по ключу или Неопределено без исключений. Это безопаснее массива при поиске.

Если массив получен из строки через СтрРазделить(), помните, что все его элементы — строки, даже если выглядят как числа. Для числовых вычислений потребуется явное преобразование через Число() с обработкой возможного исключения.

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

Сравнение способов получения значения

Массив[Индекс] / Получить()

Когда индекс известен. Самый быстрый способ, но требует проверки границ

Цикл Для Каждого

Когда нужны все элементы. Безопасен, не требует индексов

Метод Найти()

Когда известно значение, а не позиция. Возвращает индекс или Неопределено

Соответствие.Получить(Ключ)

Альтернатива, когда поиск идёт по ключу. Не вызывает исключений при отсутствии ключа

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

Большинство проблем с получением значений из массива сводится к нескольким повторяющимся ситуациям. Знание этих паттернов позволяет находить ошибки в чужом коде за секунды.

Типичные ошибки
01
Индексация с единицы: попытка получить первый элемент как Массив[1] вместо Массив[0] — получается второй элемент или ошибка
02
Цикл По Массив.Количество() без вычитания единицы — исключение на последней итерации
03
Обращение к элементу пустого массива без проверки Количество()
04
Использование результата Найти() как индекса без проверки на Неопределено
05
Поиск значения другого типа: Найти("5") в массиве чисел всегда вернёт Неопределено

Отдельный источник проблем — функции, которые могут вернуть Неопределено вместо массива. Перед любыми операциями с результатом такой функции проверяйте тип: Если ТипЗнч(Результат) = Тип("Массив") Тогда.

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

Как проверить корректность кода

Обращение по индексу
Норма

Индекс всегда меньше Массив.Количество()

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

Индекс вычисляется без проверки границ

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

Есть проверка на Неопределено перед использованием

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

Результат сразу используется как индекс

Граница цикла
Норма

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

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

Цикл до Количество() включительно

Часто задаваемые вопросы

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

Через индекс 0: Первый = Массив[0]. Перед обращением убедитесь, что массив не пуст: Если Массив.Количество() > 0 Тогда. Индексация массивов в 1С начинается с нуля, а не с единицы.

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

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

Что возвращает метод Найти(), если значения нет в массиве?

Метод возвращает значение Неопределено. Это не число и не индекс, поэтому результат нельзя использовать для обращения к массиву без проверки: Если Индекс <> Неопределено Тогда.

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

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

Как проверить, что массив пустой?

Условием Если Массив.Количество() = 0 Тогда. Отдельной функции проверки пустоты у массива нет. Если переменная может содержать не массив, а Неопределено, сначала проверьте тип через ТипЗнч().

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

Нет, массив поддерживает только числовые индексы. Для доступа по строковому ключу используйте соответствие: Соответствие.Получить("Ключ") вернёт значение или Неопределено без исключения.

Итог

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

Значение из массива получают по индексу с нуля: Массив[0] или Массив.Получить(0). Перед обращением проверяйте Количество(), результат Найти() — на Неопределено, а границу цикла задавайте как Количество() - 1. Для поиска по ключу вместо массива используйте соответствие.