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