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

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

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

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

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

Массив в 1С — это упорядоченная коллекция с индексацией от нуля. Элементы могут быть любого типа и даже разного типа в одном массиве: числа, строки, ссылки, структуры. Размер массива не фиксируется при создании — он растёт по мере добавления элементов, поэтому отдельной операции «расширения» не требуется.

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

Создание массива и метод Добавить()

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

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

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

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

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

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

Вставка значения в заданную позицию

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

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

МассивСтрок.Добавить("Строка А");

МассивСтрок.Добавить("Строка В");

МассивСтрок.Вставить(1, "Строка Б"); // теперь порядок: А, Б, В

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

Заполнение массива в цикле

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

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

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

Если СтрокаТЧ.Количество > 0 Тогда

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

КонецЕсли;

КонецЦикла;

Такой массив затем передаётся в запрос как параметр для условия В (&МассивСсылок), в функции обмена, обработчики проведения и т.д. Это стандартный приём, когда нужно собрать уникальные или отфильтрованные значения из строк документа.

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

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

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

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

Если МассивСсылок.Найти(НоваяСсылка) = Неопределено Тогда

МассивСсылок.Добавить(НоваяСсылка);

КонецЕсли;

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

Способы обеспечить уникальность

Проверка через Найти() перед Добавить()

Просто и читаемо, подходит для массивов до нескольких тысяч элементов. На больших объёмах линейный поиск тормозит наполнение.

Соответствие как индекс + массив

Ключ соответствия — значение, значение — Истина. Проверка уникальности почти мгновенная на любом объёме, но кода больше.

Свернуть таблицу значений и выгрузить колонку

Удобно, когда данные уже в таблице значений: Свернуть() убирает дубли, ВыгрузитьКолонку() возвращает готовый массив.

Добавление элементов из другой коллекции

Часто массив нужно наполнить из уже существующей структуры данных. Универсального метода «добавить всё» у массива нет, поэтому используются типовые приёмы в зависимости от источника.

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

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

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

Проверка результата и типичные ошибки

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

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

Типичные ошибки
01
Обращение к элементу до проверки Количество() — на пустом массиве код падает с ошибкой выхода за границы
02
Добавление без проверки дублей — повторные ссылки приводят к двойной обработке или раздутому условию запроса
03
Изменение массива внутри цикла его обхода — элементы пропускаются из-за смещения индексов
04
Смешение типов элементов — последующее сравнение или передача в запрос дают неожиданный результат
05
Использование Найти() для контроля уникальности на массиве в сотни тысяч элементов — наполнение занимает неоправданно много времени
Контрольные точки

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

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

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

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

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

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

Индекс в диапазоне от 0 до Количество()-1, элемент возвращается без ошибки

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

Ошибка «Индекс находится за границами массива»

Типы элементов
Норма

Все элементы одного ожидаемого типа (ТипЗнч даёт одинаковый результат)

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

Смешанные типы — сравнение и передача в запрос могут работать неверно

FAQ

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

Проверьте переменную перед добавлением: если ТипЗнч(Переменная) <> Тип("Массив"), присвойте Переменная = Новый Массив;. Более надёжная практика — инициализировать массив сразу при объявлении, тогда проверка не понадобится.

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

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

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

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

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

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

Почему запрос с параметром-массивом возвращает пустой результат?

Чаще всего массив оказался пустым на момент выполнения запроса или содержит значения другого типа, чем поле в условии В(). Проверьте Массив.Количество() перед выполнением и убедитесь, что типы элементов совпадают с типом сравниваемого поля.

Есть ли ограничение на размер массива в 1С?

Жёсткого прикладного лимита нет — массив ограничен доступной памятью. На практике массивы из сотен тысяч элементов работают, но операции линейного поиска (Найти, проверка дублей) на таких объёмах становятся узким местом, и стоит переходить на соответствие или таблицу значений.

Итог

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

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