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

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

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

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

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

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

Создание массива конструктором Новый Массив

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

Товары = Новый Массив;

Товары.Добавить("Номенклатура 1");

Товары.Добавить("Номенклатура 2");

Товары.Добавить(150); // типы можно смешивать

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

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

Добавление, вставка и удаление элементов

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

Для удаления применяются два метода: Удалить(Индекс) убирает элемент по позиции, а Очистить() полностью опустошает массив. Метода «удалить по значению» нет — сначала нужно найти индекс через Найти(Значение), а затем удалить:

Индекс = Товары.Найти("Номенклатура 2");

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

Товары.Удалить(Индекс);

КонецЕсли;

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

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

Самый читаемый способ обхода — цикл Для Каждого. Он подходит, когда индекс элемента не нужен:

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

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

КонецЦикла;

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

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

Товары[Инд] = СокрЛП(Товары[Инд]);

КонецЦикла;

Полезные методы при обходе: Количество() возвращает число элементов, ВГраница() — индекс последнего элемента (то же самое, что Количество() - 1), Найти() — позицию первого вхождения значения. Для проверки пустоты массива сравнивайте Количество() = 0.

Типовой порядок работы с массивом
  1. 1
    Создайте массив: Данные = Новый Массив;
  2. 2
    Наполните его методом Добавить() или присвойте значения по индексам
  3. 3
    Проверьте наполнение: Данные.Количество() должно быть больше нуля
  4. 4
    Переберите элементы циклом Для Каждого или по индексу от 0 до ВГраница()
  5. 5
    При необходимости очистите массив методом Очистить() перед повторным использованием

Массив и фиксированный массив: в чём разница

Фиксированный массив (ФиксированныйМассив) — это неизменяемая версия обычного массива. После создания в него нельзя добавить, удалить или заменить элементы. Создаётся он на основе существующего массива: ФиксМассив = Новый ФиксированныйМассив(ОбычныйМассив).

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

Сравнение коллекций в 1С

Массив

Изменяемая коллекция с доступом по индексу. Подходит для передачи списков значений между процедурами и накопления результатов

ФиксированныйМассив

Неизменяемая версия массива. Используется платформой для защиты данных от случайной модификации

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

Позволяет хранить представление и пометку для каждого элемента. Удобен для интерактивного выбора пользователем

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

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

Типовые сценарии использования

Передача списка ссылок в запрос

Частая задача — отобрать данные по списку документов или номенклатуры. Массив передаётся в запрос как параметр и используется в условии В (&Список):

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

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

|ГДЕ Ссылка В (&СписокДокументов)";

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

Накопление результатов обработки

Массив удобен как «накопитель» внутри цикла обхода выборки или справочника. После цикла результат передаётся дальше — в отчёт, в процедуру печати или на клиент для отображения. Это безопаснее, чем многократное обращение к базе данных в цикле.

Обмен данными между клиентом и сервером

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

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

Типичные ошибки и как их избежать

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

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

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

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

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

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

При передаче массива в запрос проверяйте, что он не пуст: условие В (&Параметр) с пустым массивом не вернёт ни одной строки, и это часто выглядит как «запрос не работает», хотя ошибка в данных. Добавьте перед выполнением запроса ветку с обработкой пустого массива.

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

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

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

Количество() соответствует ожидаемому числу элементов

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

Количество() = 0 — данные не добавлены, проверьте условия в цикле наполнения

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

Индекс от 0 до ВГраница(), значение читается без ошибок

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

Исключение «Индекс находится за границами массива»

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

Запрос возвращает строки по условию В (&Параметр)

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

Пустой результат — массив пуст или содержит значения другого типа

Часто задаваемые вопросы

Как создать массив с заданными значениями в одну строку?

Встроенного литерала массива в языке 1С нет. Компактный приём — разбить строку: Массив = СтрРазделить("красный,зелёный,синий", ",") вернёт массив из трёх строк. Для значений других типов используйте последовательные вызовы Добавить() или цикл.

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

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

Как узнать, содержит ли массив нужное значение?

Вызовите Массив.Найти(Значение): если результат не равен Неопределено, элемент присутствует. Учтите, что сравнение идёт по значению с учётом типа — строка "5" и число 5 считаются разными элементами.

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

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

Как скопировать массив, чтобы копия была независимой?

Создайте новый массив и перенесите элементы: Копия = Новый Массив; Для Каждого Эл Из Исходный Цикл Копия.Добавить(Эл); КонецЦикла;. Простое присваивание копирует только ссылку на тот же объект, поэтому изменения будут видны в обеих переменных.

Что делать, если метод Добавить() недоступен у массива?

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

Итог

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

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