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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

КонецЕсли;

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

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

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

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

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

КонецЦикла;

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

Цикл «Для Каждого» подходит для чтения данных, но не для удаления элементов из того же массива, по которому идёт обход. Удаление внутри такого цикла приводит к пропуску элементов или ошибке — для удаления используйте обратный обход по индексу (см. раздел ниже).

Перебор по индексу через цикл «Для»

Если внутри цикла нужен номер элемента — например, для нумерации строк в печатной форме или для удаления элементов — используйте классический цикл Для с явным диапазоном индексов:

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

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

КонецЦикла;

Обратите внимание: верхняя граница — Количество() - 1, поскольку индексация с нуля. Если написать просто По МассивТоваров.Количество(), на последней итерации будет обращение за границу массива.

Для удаления элементов во время обхода идите с конца массива к началу, чтобы сдвиг индексов не ломал логику:

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

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

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

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

КонецЕсли;

КонецЦикла;

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

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

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

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

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

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

Иначе

Сообщить("Значение не найдено");

КонецЕсли;

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

Учтите, что поиск по строкам чувствителен к регистру и пробелам. Если данные приходят из внешних источников, перед поиском нормализуйте значения: СокрЛП() для пробелов, при необходимости ВРег() или НРег() для регистра.

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

Получение данных из массива структур и объектов

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

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

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

МассивСтрок.Добавить(Элемент);

Для Каждого СтрокаМассива Из МассивСтрок Цикл

Сообщить(СтрокаМассива.Номенклатура + ": " + СтрокаМассива.Количество);

КонецЦикла;

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

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

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

// работаем со значением

КонецЕсли;

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

Откуда массивы приходят в прикладном коде

Чаще всего разработчик не создаёт массив вручную, а получает его из встроенных методов платформы. Полезно знать основные источники, чтобы сразу правильно обрабатывать результат:

  • ТаблицаЗначений.ВыгрузитьКолонку("ИмяКолонки") — массив значений колонки;
  • СтрокаТаблицы.ПолучитьЭлементы() для дерева значений — массив подчинённых строк;
  • СтрРазделить(Строка, ",") — массив подстрок после разбиения;
  • результаты методов работы с файлами, например НайтиФайлы() — массив объектов «Файл»;
  • параметры обработчиков событий формы, где выбранные значения передаются массивом.

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

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

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

Размер массива в отладчике
Норма

Количество() соответствует ожидаемому числу элементов

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

Массив пуст или элементов больше/меньше, чем должно быть — проверяйте источник данных

Тип элементов
Норма

ТипЗнч() возвращает ожидаемый тип (Строка, Структура, Ссылка)

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

Элементы имеют тип Неопределено — источник вернул пустые значения

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

Возвращён индекс от 0 до Количество()-1

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

Неопределено — значение отсутствует, проверьте регистр и пробелы

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

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

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

Чем отличается перебор «Для Каждого» от цикла «Для»?

«Для Каждого» перебирает элементы напрямую без индексов — это безопаснее и короче, но не даёт номера позиции. Цикл «Для» с индексом нужен, когда требуется позиция элемента или удаление элементов во время обхода.

Почему Найти() возвращает Неопределено, хотя значение в массиве есть?

Чаще всего причина в различии регистра символов или лишних пробелах в строках. Примените СокрЛП() и приведение регистра к обеим сторонам сравнения. Также убедитесь, что типы совпадают: строка «5» и число 5 — разные значения.

Можно ли обратиться к элементу массива по имени, как в структуре?

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

Как безопасно удалить элементы из массива во время перебора?

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

Как передать массив с клиента на сервер в управляемой форме?

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

Итог

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

Индексация массивов в 1С начинается с нуля. Для точечного доступа используйте Массив[Индекс] с проверкой границ, для полного обхода — цикл «Для Каждого», для поиска — метод Найти() с проверкой на Неопределено. Удаляйте элементы только обратным обходом по индексу.