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

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

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

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

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

Главная особенность массива в 1С: его размер не фиксируется при создании, а количество элементов можно изменять динамически. Для добавления значений предусмотрены два основных метода — Добавить() и Вставить(), а также приём с обращением по индексу через Установить(). У каждого способа есть свои сценарии применения и ограничения, которые важно понимать, чтобы не получить ошибку «Индекс находится за границами массива» в рабочей базе.

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

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

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

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

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

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

Метод Добавить() — основной способ

Метод Добавить() помещает новый элемент в конец массива. Это самый частый и безопасный способ наполнения массива, поскольку он не требует знания текущего размера и не может выйти за границы коллекции:

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

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

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

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

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

Типичный практический сценарий — наполнение массива в цикле при обходе выборки или табличной части:

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

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

СписокСсылок.Добавить(СтрокаТЧ.Номенклатура);

КонецЦикла;

После выполнения цикла количество элементов можно проверить методом Количество(). Если массив дальше передаётся в параметр запроса или в отбор, убедитесь, что он не пустой, — пустой массив в условии В(&Массив) вернёт пустой результат, что часто становится причиной «пропавших» данных в отчётах.

Метод Вставить() — добавление в нужную позицию

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

Очередь = Новый Массив;

Очередь.Добавить("Задача 1");

Очередь.Добавить("Задача 3");

Очередь.Вставить(1, "Задача 2"); // вставка между первым и вторым элементом

Индексация массивов в 1С начинается с нуля. Вызов Вставить(0, Значение) поместит элемент в самое начало массива — это стандартный приём для реализации приоритетной очереди или добавления значения «по умолчанию» первым в список выбора.

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

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

Изменение существующих элементов через Установить() и индекс

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

Массив = Новый Массив(3); // три элемента со значением Неопределено

Массив.Установить(0, "Первый");

Массив.Установить(2, "Третий");

Эквивалентный и более распространённый синтаксис — обращение по индексу в квадратных скобках: Массив[0] = "Первый";. Оба варианта делают одно и то же, выбор — вопрос стиля. Чтение значения выполняется аналогично: Значение = Массив[0]; или через метод Получить(0).

Ключевое отличие от Добавить(): если массив пустой или индекс выходит за его границы, присваивание по индексу вызовет ошибку «Индекс находится за границами массива». Поэтому прямое обращение по индексу безопасно только тогда, когда размер массива известен и гарантирован — например, при работе с массивом фиксированной длины, созданным через Новый Массив(N).

Сравнение способов добавления

Добавить(Значение)

Универсальный способ: добавляет в конец, не требует знания размера, безопасен. Подходит для 90% задач.

Вставить(Индекс, Значение)

Нужен, когда важна позиция элемента. Требует контроля допустимости индекса.

Установить / Массив[Индекс]

Только замена существующих элементов в массиве известного размера. Не увеличивает коллекцию.

Добавление элементов в многомерные массивы

Конструктор Новый Массив(3, 5) создаёт двумерный массив — по сути, массив массивов. Добавление элементов в такие структуры выполняется поэтапно: сначала создаётся вложенный массив, наполняется, а затем добавляется во внешний:

Таблица = Новый Массив;

Строка1 = Новый Массив;

Строка1.Добавить("Ячейка 1");

Строка1.Добавить("Ячейка 2");

Таблица.Добавить(Строка1);

Обращение к элементу вложенного массива выполняется двойной индексацией: Таблица[0][1]. Учтите, что вложенные массивы могут иметь разную длину — платформа не контролирует «прямоугольность» такой структуры, поэтому при обходе всегда опирайтесь на Количество() конкретного вложенного массива.

На практике для табличных данных вместо массива массивов чаще используют массив структур — он читаемее и удобнее в отладке: Строки.Добавить(Новый Структура("Номенклатура, Количество", Ссылка, 5));. А если данные нужно сортировать, фильтровать или сворачивать, правильнее сразу использовать таблицу значений.

Проверка результата и обход массива

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

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

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

КонецЦикла;

// или по индексам

Для Инд = 0 По Массив.ВГраница() Цикл

Сообщить(Массив[Инд]);

КонецЦикла;

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

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

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

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

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

Массив.Количество() соответствует числу добавленных значений

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

Количество больше ожидаемого — возможно, массив создан с параметром размера

Содержимое
Норма

Обход в цикле выводит все добавленные значения

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

Встречаются значения Неопределено — элементы не были заполнены

Отсутствие дублей
Норма

Найти() возвращает один индекс для каждого значения

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

Одинаковые значения добавлены несколько раз

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

Самая частая ошибка новичков — создание массива с размером и последующее использование Добавить() вместо присваивания по индексу. В результате первые элементы остаются со значением Неопределено, а реальные данные оказываются в «хвосте» массива. Запомните правило: Новый Массив(N) сочетается с Массив[i] = Значение, а Новый Массив без параметров — с Добавить().

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

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

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

Когда массив не подходит: альтернативные коллекции

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

Для передачи списка значений в элементы управления формы (списки выбора, пометки) существует специализированный тип «СписокЗначений» — он также имеет метод Добавить(), но дополнительно хранит представление и пометку каждого элемента. Выбор коллекции на этапе проектирования избавляет от переделок, когда требования к данным вырастут.

Маршрут решения

Как выбрать коллекцию

Нужен просто упорядоченный список значений с доступом по индексуИспользуйте массив и метод Добавить()
Требуется уникальность и быстрый поиск значенияИспользуйте соответствие, где значение является ключом
Данные табличные, нужны сортировка и свёрткаИспользуйте таблицу значений вместо массива
Список выводится в элемент формы с пометкамиИспользуйте список значений

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

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

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

С какого индекса начинается массив в 1С?

Индексация начинается с нуля. Первый элемент — Массив[0], последний — Массив[Массив.ВГраница()], что эквивалентно Количество() минус один.

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

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

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

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

Чем отличается Добавить() от Установить()?

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

Как добавить сразу несколько элементов из другого массива?

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

Итог

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

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