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

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

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

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

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

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

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

Создание массива перед добавлением элементов

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

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

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

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

Конструктор принимает необязательный параметр — количество элементов. Вызов Новый Массив(5) создаёт массив из пяти элементов, каждый из которых равен Неопределено. Это не «резервирование пустых мест»: такие элементы уже существуют, и метод Добавить() поместит новое значение после них, а не вместо них. Для заполнения такого массива используйте присваивание по индексу: МассивТоваров[0] = "Значение".

Если массив приходит извне — как параметр процедуры или результат функции — перед добавлением убедитесь, что переменная действительно содержит массив. Проверка выполняется через ТипЗнч(Переменная) = Тип("Массив"). Это защищает код от падения, когда вместо коллекции передали Неопределено или значение другого типа.

Метод Добавить(): добавление элемента в конец массива

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

СписокСсылок = Новый Массив;

Пока Выборка.Следующий() Цикл

СписокСсылок.Добавить(Выборка.Ссылка);

КонецЦикла;

Типичный сценарий — накопление ссылок из выборки запроса для последующей передачи в параметр другого запроса через конструкцию В (&СписокСсылок). Здесь важно добавлять именно ссылки, а не строковые представления, иначе сравнение в запросе будет работать некорректно из-за несовпадения типов.

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

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

Метод Вставить(): добавление элемента в произвольную позицию

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

МассивЭтапов = Новый Массив;

МассивЭтапов.Добавить("Согласование");

МассивЭтапов.Добавить("Отгрузка");

МассивЭтапов.Вставить(0, "Резервирование"); // вставка в начало

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

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

Добавление элементов других типов и вложенных коллекций

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

ДанныеСтроки = Новый Структура("Номенклатура, Количество");

ДанныеСтроки.Номенклатура = СтрокаТаблицы.Номенклатура;

ДанныеСтроки.Количество = СтрокаТаблицы.Количество;

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

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

Проверка результата и контроль содержимого массива

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

  • Массив.Количество() — возвращает число элементов; сравнение с ожидаемым значением показывает, все ли добавления отработали.
  • Массив.Найти(Значение) — возвращает индекс элемента или Неопределено; удобно для проверки наличия конкретного значения.
  • Массив[Индекс] — чтение конкретного элемента; помните, что максимальный допустимый индекс равен Количество() - 1.

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

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

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

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

Массив.Количество() выросло на число вызовов Добавить()

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

Количество не изменилось — проверьте, не создаётся ли массив заново внутри цикла

Значение по индексу
Норма

Массив[0] содержит первое добавленное значение нужного типа

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

Элемент равен Неопределено или имеет неожиданный тип

Поиск значения
Норма

Массив.Найти(Значение) возвращает индекс

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

Возвращается Неопределено — значение не добавлено или отличается по типу

Типичные ошибки при добавлении элементов

Большинство проблем при работе с массивами связано не с самим методом Добавить(), а с контекстом его вызова. Разберём ситуации, которые чаще всего приводят к ошибкам и потере данных.

Первая распространённая ошибка — создание массива внутри цикла вместо создания до него. Конструкция Массив = Новый Массив на каждой итерации обнуляет коллекцию, и в итоге в ней остаётся только последний элемент. Конструктор должен выполняться один раз — до входа в цикл.

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

Типичные ошибки
01
Создание Новый Массив внутри цикла — коллекция обнуляется на каждой итерации, данные теряются
02
Обращение Массив[Количество()] вместо Массив[Количество()-1] — исключение о выходе за границы массива
03
Повторное использование одной структуры в цикле — все элементы массива в итоге ссылаются на один объект с последними значениями
04
Добавление строк вместо ссылок — последующий запрос с условием В(&Массив) не находит совпадений
05
Попытка вызвать Добавить() у переменной со значением Неопределено — ошибка «Значение не является значением объектного типа»

Отдельный случай — директивы компиляции. Если массив создаётся на клиенте, а заполняется в серверной процедуре, передавайте его параметром и возвращайте результат явно, либо заполняйте коллекцию полностью на сервере. Смешение контекстов без явной передачи часто выглядит как «элементы пропадают», хотя на самом деле заполняется другая копия данных.

Альтернативы массиву: когда выбрать другую коллекцию

Метод Добавить() есть не только у массива. Если задача выходит за рамки простого упорядоченного списка, стоит рассмотреть другие коллекции встроенного языка, где добавление элементов решает дополнительные задачи.

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

Массив

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

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

Удобен, когда кроме значения нужно представление для показа пользователю и пометки. Метод Добавить() принимает значение, представление и флаг пометки.

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

Выбор, когда нужен быстрый поиск по произвольному ключу. Вместо Добавить() используется Вставить(Ключ, Значение), дубли ключей исключены.

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

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

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

Итог

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

Элемент добавляется в массив вызовом Массив.Добавить(Значение), в конкретную позицию — Массив.Вставить(Индекс, Значение). Массив создаётся один раз через Новый Массив до цикла, индексация идёт с нуля, а контроль результата выполняется через Количество() и Найти().

Частые вопросы о добавлении элементов в массив 1С

Как добавить элемент в массив, если он ещё не создан?

Никак — сначала нужно инициализировать переменную конструктором Новый Массив. Вызов Добавить() у переменной со значением Неопределено вызовет ошибку «Значение не является значением объектного типа». Если переменная приходит извне, проверьте тип через ТипЗнч() и при необходимости создайте новый массив.

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

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

Как избежать дублей при добавлении?

Перед вызовом Добавить() проверьте наличие значения: Если Массив.Найти(Значение) = Неопределено Тогда Массив.Добавить(Значение); КонецЕсли;. Если уникальность — основное требование, рассмотрите соответствие, где ключи уникальны по определению.

Можно ли добавить в массив другой массив целиком?

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

Почему после цикла в массиве только один элемент?

Почти всегда причина в том, что строка Массив = Новый Массив стоит внутри цикла и коллекция пересоздаётся на каждой итерации. Вынесите конструктор перед циклом. Реже причина в том, что массив заполняется в другой процедуре без возврата результата.

Как передать заполненный массив в запрос?

Передайте массив как параметр: Запрос.УстановитьПараметр("Список", Массив), а в тексте запроса используйте условие ГДЕ Ссылка В (&Список). Следите, чтобы типы элементов массива совпадали с типом сравниваемого поля — например, ссылки со ссылками.