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

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

Массив в 1С: что это и как с ним работать

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

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

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

Массив может быть одномерным и многомерным, а его размер не фиксируется жёстко — элементы добавляются и удаляются динамически. Ниже разобраны объявление, основные методы, перебор, типичные ошибки и ситуации, когда вместо массива лучше выбрать другую коллекцию.

Что такое массив и где он применяется

Массив — объект встроенного языка, который хранит произвольное количество значений любого типа: чисел, строк, дат, ссылок на объекты базы, других массивов и даже структур. Элементы внутри одного массива не обязаны быть одного типа, хотя на практике смешивание типов затрудняет обработку и считается плохим стилем.

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

Как создать и заполнить массив

Массив создаётся конструктором «Новый Массив». Без параметров получается пустой массив; если передать число, создаётся массив указанной размерности с незаполненными элементами (значение Неопределено). Для многомерного массива размерности перечисляются через запятую.

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

1c
Товары = Новый Массив;
Товары.Добавить("Номенклатура1");
Товары.Добавить("Номенклатура2");
// Обращение по индексу
Первый = Товары[0];
// Проверка размера
Размер = Товары.Количество();

Полезные методы для управления составом: Удалить(Индекс) убирает элемент, Очистить() опустошает массив целиком, Найти(Значение) возвращает индекс первого совпадения или Неопределено, ВГраница() даёт индекс последнего элемента. Перед удалением в цикле помните, что индексы оставшихся элементов смещаются.

Как перебрать элементы массива

Существует два основных способа обхода. Первый — цикл «Для Каждого … Из … Цикл», который последовательно отдаёт каждое значение без ручной работы с индексами. Он короче и безопаснее: нельзя случайно выйти за границы массива. Второй — классический цикл «Для … По … Цикл» с обращением по индексу; он нужен, когда важна позиция элемента или требуется обход с конца.

1c
// Вариант 1: без индексов
Для Каждого Товар Из Товары Цикл
    Сообщить(Товар);
КонецЦикла;

// Вариант 2: по индексам, с конца
Для Инд = 0 По Товары.ВГраница() Цикл
    ОбратныйИнд = Товары.ВГраница() - Инд;
    Сообщить(Товары[ОбратныйИнд]);
КонецЦикла;

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

Многомерные массивы и вложенные структуры

Конструктор «Новый Массив(3, 5)» создаёт двумерный массив — три строки по пять элементов. Обращение идёт через двойные скобки: Массив[0][2]. На практике многомерные массивы применяются редко: для табличных данных удобнее таблица значений, где у колонок есть имена и типы.

Более живучий приём — массив структур: каждый элемент массива является структурой с именованными полями (например, «Ссылка», «Количество», «Цена»). Такой подход сочетает порядковый доступ массива и читаемость именованных полей, и часто используется для передачи строк данных между серверными функциями.

Чем массив отличается от других коллекций 1С

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

КоллекцияДоступ к элементуКогда выбирать
МассивПо числовому индексуУпорядоченные наборы, передача списков, простые циклы
Список значенийПо индексу, с представлением и пометкойИнтерактивный выбор пользователем, отображение на форме
СоответствиеПо произвольному ключуБыстрый поиск по ключу, подсчёт уникальных значений
Таблица значенийСтроки с именованными колонкамиТабличные данные, сортировка, свёртка, итоги
Маршрут решения

Как выбрать коллекцию

Нужно просто собрать значения и пройти по ним цикломИспользуйте массив
Нужно быстро проверять наличие значения или исключать дублиИспользуйте соответствие с ключом-значением
Данные табличные, с несколькими полями и итогамиИспользуйте таблицу значений
Список должен показываться пользователю с флажкамиИспользуйте список значений

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

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

Типичные ошибки
01
Обращение по индексу без проверки границ — ошибка выполнения и остановка обработки
02
Удаление элементов в цикле Для Каждого — пропуск элементов или исключение
03
Смешение типов в одном массиве без проверок — ошибки приведения при обработке
04
Поиск значения перебором в большом массиве внутри цикла — квадратичное замедление кода
05
Ожидание, что массив передан в функцию по значению — побочные изменения исходных данных

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

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

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

Размер массива после заполнения
Норма

Количество() равно числу добавленных элементов

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

Размер меньше ожидаемого — часть веток кода не сработала

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

Индекс в диапазоне от 0 до ВГраница()

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

Индекс равен Количество() — выход за границу

Передача в запрос
Норма

Параметр с оператором В принимает массив напрямую

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

Массив вставлен строкой в текст запроса — синтаксическая ошибка

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

Массив напрямую передаётся как параметр запроса с оператором «В»: Запрос.УстановитьПараметр("Ссылки", МассивСсылок). Это стандартный способ фильтрации по списку значений, и он работает быстрее, чем динамическая сборка текста запроса. Пустой массив в таком параметре корректно вернёт пустой результат, но логику отчёта стоит предусмотреть заранее.

В управляемых формах массив свободно передаётся между клиентскими и серверными процедурами, если содержит сериализуемые значения (примитивы, ссылки, структуры из них). Объекты типа «ТаблицаЗначений» или «ДеревоЗначений» так передать нельзя — для них существуют реквизиты формы. Учитывайте также, что каждый серверный вызов с большим массивом — это пересылка данных; при массовых обработках лучше выполнять всю логику в одной серверной процедуре.

Итог

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

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

Частые вопросы о массивах в 1С

Может ли массив содержать элементы разных типов?

Да, язык это разрешает: в одном массиве могут лежать строки, числа и ссылки. Однако при обработке каждый элемент придётся проверять функцией ТипЗнч, иначе операции над значением неподходящего типа вызовут ошибку. Практичнее держать массивы однотипными.

Как отсортировать массив?

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

Чем проверить, есть ли значение в массиве?

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

Как объединить два массива в один?

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

Что вернёт обращение к пустому массиву по индексу 0?

Ошибку выполнения «Индекс находится за границами массива», которая прервёт выполнение кода. Перед обращением проверяйте условие Массив.Количество() > 0 либо обрабатывайте массив только в цикле, который для пустой коллекции просто не выполнит ни одной итерации.

Можно ли сохранить массив в базе данных?

Напрямую — нет: реквизиты объектов не хранят тип «Массив». Варианты сохранения: преобразовать массив в строку (например, через разделитель или формат JSON с помощью ЗаписьJSON), сохранить в хранилище значения через Новый ХранилищеЗначения(Массив) либо разложить элементы в табличную часть объекта.