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