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