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