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

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

Как добавить массив в 1С: полное руководство с примерами

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

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

Разработчики применяют массивы постоянно: чтобы передать список документов в функцию, собрать отобранные ссылки из запроса, сформировать параметры печати или вернуть из процедуры несколько значений сразу. Практически любая нетривиальная обработка во встроенном языке 1С так или иначе работает с массивами.

В материале ниже разобраны создание массива, все способы добавления элементов, перебор, поиск, удаление, а также типичные ошибки, которые приводят к падению кода или неочевидным дефектам. Примеры приведены на встроенном языке 1С:Предприятие 8 и работают как в толстом, так и в тонком и веб-клиенте.

Создание массива: пустой и с заданной размерностью

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

МассивДокументов = Новый Массив;

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

МассивМесяцев = Новый Массив(12);

МассивМесяцев[0] = "Январь";

МассивМесяцев[11] = "Декабрь";

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

Добавление элементов: Добавить, Вставить и Установить

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

МассивКонтрагентов = Новый Массив;

МассивКонтрагентов.Добавить(СсылкаНаКонтрагента);

МассивКонтрагентов.Добавить("Просто строка"); // типы можно смешивать

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

Массив.Вставить(0, "Первый элемент"); // в начало

Массив[1] = НовоеЗначение; // замена по индексу

Массив.Установить(2, ДругоеЗначение); // то же самое методом

Важно помнить границу: присваивание по индексу работает только для уже существующих позиций. Попытка записать Массив[5] в массиве из трёх элементов вызовет ошибку «Индекс находится за границами массива». Если размер заранее неизвестен, безопаснее всегда использовать Добавить().

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

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

Для обхода массива есть два равноправных способа. Цикл Для Каждого читается проще и подходит для большинства задач:

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

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

КонецЦикла;

Классический цикл со счётчиком нужен, когда внутри требуется индекс элемента — например, для записи в другую структуру по позиции или для модификации самого массива:

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

Массив[Индекс] = СокрЛП(Массив[Индекс]);

КонецЦикла;

Здесь есть важный нюанс: верхняя граница цикла — Количество() - 1, потому что индексация начинается с нуля. Обращение к Массив[Массив.Количество()] — одна из самых частых ошибок начинающих разработчиков.

Поиск, проверка и удаление элементов

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

Индекс = Массив.Найти(ИскомаяСсылка);

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

Массив.Добавить(ИскомаяСсылка); // добавляем только уникальные

КонецЕсли;

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

Для Индекс = 0 По Массив.ВГраница() Цикл

ОбратныйИндекс = Массив.ВГраница() - Индекс;

Если УсловиеУдаления(Массив[ОбратныйИндекс]) Тогда

Массив.Удалить(ОбратныйИндекс);

КонецЕсли;

КонецЦикла;

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

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

Массив в запросах, параметрах и на форме

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

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

Запрос.Текст = "ВЫБРАТЬ Ссылка ИЗ Документ.Реализация

|ГДЕ Контрагент В (&СписокКонтрагентов)";

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

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

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

Когда массив, а когда другая коллекция

Массив

Простой упорядоченный список, перебор по индексу, передача в запрос. Неудобен для частого поиска

СписокЗначений

Нужны представления элементов, пометки или отображение на форме и в отборах

Соответствие

Частый поиск по ключу — работает заметно быстрее метода Найти на больших объёмах

ТаблицаЗначений

Данные с несколькими полями-атрибутами, сортировка, итоги, вывод пользователю

Ограничения и безопасные приёмы

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

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

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

Проверка результата

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

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

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

КонецЦикла;

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

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

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

Количество элементов
Норма

Совпадает с числом добавленных значений

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

Меньше ожидаемого — часть веток кода не выполнилась

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

Все значения нужного типа

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

Встречается Неопределено из-за незаполненной переменной

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

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

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

Ошибка «Индекс за границами массива»

Итог

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

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

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

Как добавить несколько элементов в массив одним действием?

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

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

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

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

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

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

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

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

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

Почему изменения массива внутри процедуры видны снаружи?

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