Разработка и Конфигурация · 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 Цикл
Таблица.Добавить().Значение = Элемент;
КонецЦикла;
Таблица.Свернуть("Значение");
Результат = Таблица.ВыгрузитьКолонку("Значение");
Метод ВыгрузитьКолонку() возвращает именно массив, поэтому на выходе вы получаете тот же тип данных, что и при ручном слиянии, но уже без дублей. Такой подход особенно удобен, когда дальше данные всё равно попадут в запрос или отчёт.
Сравнение вариантов
Подходит всегда, сохраняет порядок и дубли. Ограничение — дедупликацию придётся делать отдельно.
Лучший вариант для слияния без дублей на больших объёмах. Ограничение — не работает со сравнением структур по значению.
Удобна, когда после слияния нужны свёртка, сортировка или передача в запрос. Ограничение — избыточна для простого склеивания двух списков.
Проверка результата и типичные ошибки
После слияния полезно убедиться, что итоговый массив соответствует ожиданиям. Минимальная проверка — сравнить количество элементов: при слиянии без фильтрации оно должно равняться сумме длин исходных массивов, при дедупликации — быть не больше этой суммы.
Как проверить результат
Равно сумме длин исходных массивов (или меньше при удалении дублей)
Меньше ожидаемого без дедупликации — часть элементов потеряна в логике цикла
Сначала элементы первого массива, затем второго
Порядок нарушен — возможно, использовалась сортировка или свёртка, меняющая последовательность
Все элементы ожидаемых типов
В массив попали Неопределено или значения другого типа — проверьте источники данных
Отдельная ловушка — результат выполнения запроса. Метод Выполнить() возвращает результат запроса, а не массив. Чтобы получить массив, нужно вызвать Выгрузить() и затем ВыгрузитьКолонку(), либо обойти выборку и заполнить массив вручную. Попытка передать результат запроса в функцию слияния массивов приведёт к ошибке перебора.
Что важно запомнить
Массивы в 1С объединяются вручную: циклом по второму массиву с добавлением элементов в первый. Для слияния без дублей применяйте Соответствие как фильтр уникальности, а если после объединения нужны свёртка или сортировка — переходите к таблице значений. Всегда проверяйте итоговое количество элементов и не изменяйте исходные массивы, если они используются дальше.
Частые вопросы
Есть ли в 1С готовая функция для объединения массивов?
Нет, встроенной функции слияния массивов платформа не предоставляет. Стандартная практика — цикл с методом Добавить() или собственная универсальная функция в общем модуле, которую можно вызывать из любого места конфигурации.
Как объединить три и более массивов?
Оберните массивы в массив массивов и переберите их двумя вложенными циклами: внешний идёт по списку массивов, внутренний — по элементам каждого. Логика дедупликации через соответствие при этом не меняется.
Сохраняется ли порядок элементов при объединении?
Да, при добавлении через Добавить() порядок полностью сохраняется: сначала элементы первого массива, затем второго. Порядок может нарушиться только при последующей сортировке или свёртке через таблицу значений.
Как удалить дубли уже в готовом объединённом массиве?
Пройдите по массиву, регистрируя встреченные значения в соответствии, и сформируйте новый массив только из уникальных элементов. Удалять элементы из исходного массива внутри цикла перебора не стоит — это сдвигает индексы и приводит к пропуску значений.
Можно ли объединить массивы на клиенте в управляемой форме?
Да, тип Массив доступен и на тонком клиенте, все описанные приёмы работают без вызова сервера. Однако если массивы большие и данные для них берутся из базы, выгрузку и слияние лучше выполнять на сервере, чтобы не гонять лишние вызовы.
Что быстрее: массив или таблица значений для слияния?
Для простого склеивания быстрее и легче массив с циклом. Таблица значений оправдана, когда после объединения нужны свёртка, сортировка, поиск или передача данных в запрос — тогда её накладные расходы окупаются встроенными механизмами.