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