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

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

1С: как прочитать массив — способы обхода и поиска элементов

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

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

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

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

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

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

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

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

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

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

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

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

Значение = Массив[0];

Иначе

// массив пуст — обрабатываем ситуацию отдельно

КонецЕсли;

Перебор всех элементов циклом «Для Каждого»

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

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

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

КонецЦикла;

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

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

Обход массива по индексу циклом «Для»

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

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

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

КонецЦикла;

Обратите внимание на вычитание единицы: количество элементов на единицу больше максимального индекса. Цикл Для Индекс = 1 По Массив.Количество() — частая ошибка: первый элемент будет пропущен, а последняя итерация вызовет выход за границы.

Если внутри цикла элементы удаляются, обходите массив в обратном порядке — от конца к началу. Тогда удаление элемента не сместит индексы ещё не обработанных элементов:

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

ТекущийИндекс = Массив.Количество() - 1 - Индекс;

Если Массив[ТекущийИндекс] = Неопределено Тогда

Массив.Удалить(ТекущийИндекс);

КонецЕсли;

КонецЦикла;

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

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

Подходит для простого перебора всех значений. Не даёт индекс элемента и не позволяет изменять массив внутри цикла.

Для ... По с обращением по индексу

Нужен, когда важен номер элемента или требуется удалять элементы. Требует аккуратности с границами.

Методы Найти() и ВГраница()

Используются для точечного поиска и проверки диапазона без полного перебора.

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

Чтобы проверить, есть ли значение в массиве, и получить его позицию, используйте метод Найти(). Он возвращает индекс первого найденного элемента или Неопределено, если значение не найдено.

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

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

Сообщить("Найдено на позиции " + Индекс);

Иначе

Сообщить("Значение в массиве отсутствует");

КонецЕсли;

Метод сравнивает значения по равенству, поэтому для ссылочных типов (документы, справочники) поиск работает по ссылке, а не по представлению. Строка «Второй» и строка «второй» — разные значения: сравнение регистрозависимое.

Дополнительно полезны методы: ВГраница() — возвращает максимальный допустимый индекс (для пустого массива — -1), Количество() — число элементов. Проверка Если Индекс <= Массив.ВГраница() — компактный способ убедиться, что индекс допустим перед чтением.

Чтение массива в запросе и выгрузка из результата

Частая практическая задача — не просто прочитать массив, а использовать его в запросе, например для отбора по списку номенклатуры. Массив передаётся в запрос как параметр и применяется в условии В (&Массив):

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Товары.Ссылка КАК Номенклатура

|ИЗ

| Справочник.Номенклатура КАК Товары

|ГДЕ

| Товары.Ссылка В (&СписокТоваров)";

Запрос.УстановитьПараметр("СписокТоваров", МассивТоваров);

Результат = Запрос.Выполнить().Выгрузить();

Обратная операция — получить массив из результата запроса: выгрузите таблицу значений и прочитайте колонку методом ВыгрузитьКолонку(), который возвращает именно массив:

ТаблицаРезультата = Запрос.Выполнить().Выгрузить();

МассивСсылок = ТаблицаРезультата.ВыгрузитьКолонку("Номенклатура");

// далее массив читается любым из описанных способов

Также массивы возвращают многие встроенные методы платформы: НайтиФайлы(), СтрРазделить(), методы работы с JSON через ПрочитатьJSON() при чтении в структуру. Полученный из них массив читается теми же циклами и обращением по индексу.

Порядок действий при чтении массива
  1. 1
    Определите задачу: один элемент, все элементы или поиск значения
  2. 2
    Проверьте Массив.Количество(), если планируете обращение по индексу
  3. 3
    Для перебора всех значений используйте Для Каждого ... Из ... Цикл
  4. 4
    Для поиска используйте Массив.Найти() и сравните результат с Неопределено
  5. 5
    Проверьте результат: выведите значения через Сообщить() или отладчик

Чтение массива в отладчике

Когда код ведёт себя неожиданно, быстрее всего прочитать содержимое массива в отладчике конфигуратора. Установите точку останова после заполнения массива, запустите отладку и посмотрите значение переменной.

Массив в окне «Выражение» или «Локальные переменные» отображается как сворачиваемый список: рядом с переменной показывается количество элементов, а при разворачивании — каждый элемент с индексом и значением. Элементы сложных типов (структуры, таблицы значений) разворачиваются дальше.

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

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

Частые ошибки и как их избежать

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

Вторая группа ошибок связана с типами элементов. Массив в 1С нетипизированный: в одном массиве могут лежать строки, числа и ссылки. Перед операцией с элементом (сложение, сравнение, вызов метода объекта) при необходимости проверяйте тип через ТипЗнч(), иначе получите ошибку приведения типов.

Третья — модификация массива во время обхода. Добавление или удаление элементов внутри цикла меняет индексацию и размер коллекции, что приводит к пропускам или выходу за границы. Правило простое: сначала читаем и собираем изменения, потом модифицируем.

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

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

Содержимое массива
Норма

В отладчике видны все элементы с ожидаемыми значениями

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

Массив пуст или содержит Неопределено там, где ожидались ссылки

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

Перед чтением выполнена проверка Количество() или ВГраница()

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

Код читает Массив[0] без проверок

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

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

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

Результат сравнивается с 0 или -1

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

Чем массив отличается от списка значений в 1С?

Массив — простая коллекция с доступом по индексу, без дополнительных возможностей. Список значений хранит пары «значение + представление», умеет сортировку, пометки и используется в интерфейсных элементах (например, для отборов). Для внутренних вычислений обычно достаточно массива, для передачи данных в элементы формы — списка значений.

Как узнать, пуст ли массив?

Проверьте Массив.Количество() = 0 или Массив.ВГраница() = -1. Обе проверки равнозначны; первая читается нагляднее. Сам по себе массив, объявленный через Новый Массив, уже существует, но пуст — обращение к любому индексу вызовет ошибку.

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

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

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

При чтении JSON через ПрочитатьJSON с параметром чтения в структуру вложенные массивы преобразуются в объекты типа «Массив». Дальше они читаются стандартно: циклом Для Каждого или по индексу. Учтите, что числа и даты из JSON могут потребовать дополнительного преобразования типов.

Почему цикл Для Каждого не видит изменений массива?

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

Итог

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

Массив в 1С читается по индексу с нуля, циклом «Для Каждого» для перебора и методом Найти() для поиска. Перед обращением по индексу всегда проверяйте Количество() или ВГраница(), результат Найти() сравнивайте с Неопределено, а массив не изменяйте внутри цикла обхода.