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

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

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

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

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

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

Базовый способ: цикл с методом Добавить()

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

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

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

Массив1.Добавить("Б");

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

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

Массив2.Добавить("Г");

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

Массив1.Добавить(Элемент);

КонецЦикла;

// Массив1 теперь содержит: А, Б, В, Г

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

Результат = Новый Массив;

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

Результат.Добавить(Элемент);

КонецЦикла;

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

Результат.Добавить(Элемент);

КонецЦикла;

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

Объединение через индексы и ВГраница()

Иногда удобнее идти по индексам, а не через «Для Каждого». Метод ВГраница() возвращает индекс последнего элемента (на единицу меньше количества), что позволяет организовать классический цикл со счётчиком.

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

Массив1.Добавить(Массив2[Индекс]);

КонецЦикла;

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

Как объединить массивы без дублей

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

Функция ОбъединитьБезДублей(Массив1, Массив2)

Уникальные = Новый Соответствие;

Результат = Новый Массив;

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

Если Уникальные[Элемент] = Неопределено Тогда

Уникальные.Вставить(Элемент, Истина);

Результат.Добавить(Элемент);

КонецЕсли;

КонецЦикла;

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

Если Уникальные[Элемент] = Неопределено Тогда

Уникальные.Вставить(Элемент, Истина);

Результат.Добавить(Элемент);

КонецЕсли;

КонецЦикла;

Возврат Результат;

КонецФункции

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

Объединение массивов структур и объектов

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

Функция КлючСтроки(СтрокаДанных)

Возврат Строка(СтрокаДанных.Номенклатура) + "|" + Строка(СтрокаДанных.Склад);

КонецФункции

Уникальные = Новый Соответствие;

Результат = Новый Массив;

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

Ключ = КлючСтроки(Элемент);

Если Уникальные[Ключ] = Неопределено Тогда

Уникальные.Вставить(Ключ, Истина);

Результат.Добавить(Элемент);

КонецЕсли;

КонецЦикла;

// аналогично для Массив2

Учтите, что структура в 1С передаётся по значению при присваивании, но в массиве хранится ссылка на объект структуры. Если вы добавите одну и ту же структуру в оба массива, а потом измените её поле, изменение будет видно через оба массива. При необходимости независимых копий создавайте новую структуру и копируйте поля явно.

Альтернатива: таблица значений вместо двух массивов

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

Таблица = Новый ТаблицаЗначений;

Таблица.Колонки.Добавить("Значение");

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

Таблица.Добавить().Значение = Элемент;

КонецЦикла;

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

Таблица.Добавить().Значение = Элемент;

КонецЦикла;

Таблица.Свернуть("Значение");

Результат = Таблица.ВыгрузитьКолонку("Значение");

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

Сравнение вариантов

Цикл с Добавить()

Подходит всегда, сохраняет порядок и дубли. Ограничение — дедупликацию придётся делать отдельно.

Соответствие как фильтр

Лучший вариант для слияния без дублей на больших объёмах. Ограничение — не работает со сравнением структур по значению.

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

Удобна, когда после слияния нужны свёртка, сортировка или передача в запрос. Ограничение — избыточна для простого склеивания двух списков.

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

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

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

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

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

Равно сумме длин исходных массивов (или меньше при удалении дублей)

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

Меньше ожидаемого без дедупликации — часть элементов потеряна в логике цикла

Порядок элементов
Норма

Сначала элементы первого массива, затем второго

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

Порядок нарушен — возможно, использовалась сортировка или свёртка, меняющая последовательность

Типы значений
Норма

Все элементы ожидаемых типов

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

В массив попали Неопределено или значения другого типа — проверьте источники данных

Типичные ошибки
01
Использование Вставить() вместо Добавить() без необходимости: элементы второго массива оказываются в середине первого, и порядок становится непредсказуемым.
02
Дедупликация через Найти() во вложенном цикле: на больших массивах обработка резко замедляется.
03
Изменение исходного массива, переданного как параметр, когда вызывающий код рассчитывает на неизменность данных.
04
Попытка объединить массив со значением другого типа (строкой или результатом запроса без Выгрузить()) — ошибка возникает уже в цикле перебора.

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

Итог

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

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

Частые вопросы

Есть ли в 1С готовая функция для объединения массивов?

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

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

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

Сохраняется ли порядок элементов при объединении?

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

Как удалить дубли уже в готовом объединённом массиве?

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

Можно ли объединить массивы на клиенте в управляемой форме?

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

Что быстрее: массив или таблица значений для слияния?

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