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

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

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

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

Массив в 1С — это коллекция с индексированным доступом, у которой нет встроенного метода «Объединить» или «Скопировать из другого массива». Поэтому соединение двух массивов всегда сводится к переносу элементов из одного массива в другой — вручную через цикл или с помощью промежуточных коллекций, если нужно убрать дубли или отсортировать результат.

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

Ниже разобраны рабочие приёмы с готовым кодом, типичные ошибки и способы проверить, что объединение прошло корректно.

Базовый способ: перенос элементов циклом

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

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

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

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

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

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

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

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

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

КонецЦикла;

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

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

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

Объединение без дублей через соответствие

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

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

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

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

КонецЦикла;

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

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

КонецЦикла;

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

Для Каждого КлючЗначение Из Уникальные Цикл

Результат.Добавить(КлючЗначение.Ключ);

КонецЦикла;

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

Для ссылочных значений (номенклатура, контрагенты) соответствие сравнивает ссылки корректно: две переменные, указывающие на один объект базы, будут признаны одинаковыми ключами.

bsl
// Объединение с сохранением порядка и без дублей
Результат = Новый Массив;
Для Каждого Элемент Из Массив1 Цикл
    Если Результат.Найти(Элемент) = Неопределено Тогда
        Результат.Добавить(Элемент);
    КонецЕсли;
КонецЦикла;
Для Каждого Элемент Из Массив2 Цикл
    Если Результат.Найти(Элемент) = Неопределено Тогда
        Результат.Добавить(Элемент);
    КонецЕсли;
КонецЦикла;

Объединение через таблицу значений

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

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

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

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

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

КонецЦикла;

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

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

КонецЦикла;

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

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

Метод Свернуть() убирает дубли, а ВыгрузитьКолонку() возвращает готовый массив. При необходимости перед выгрузкой можно отсортировать таблицу методом Сортировать("Значение").

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

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

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

Самый быстрый и простой. Дубли сохраняются, порядок исходных массивов сохраняется.

Соответствие

Автоматически убирает дубли, быстро работает на больших объёмах, но порядок элементов не гарантирован.

Найти() + Добавить()

Дубли убраны, порядок сохранён, но поиск перебором медленный на больших массивах.

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

Даёт свёртку и сортировку из коробки, но требует больше памяти и кода.

Как выбрать способ под свою задачу

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

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

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

Как выбрать действие

Дубли допустимы, нужен просто общий списокПеренесите элементы второго массива в первый циклом с Добавить()
Дубли недопустимы, порядок не важенИспользуйте соответствие как промежуточное хранилище
Дубли недопустимы и порядок критиченДобавляйте через проверку Найти() или пару «массив + соответствие»
После объединения нужна сортировка или группировкаВыгрузите оба массива в таблицу значений, сверните и отсортируйте

Типичные ошибки при объединении массивов

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

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

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

Проверка результата объединения

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

Сообщить("Элементов в результате: " + Результат.Количество());

Для Каждого Элемент Из Результат Цикл

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

КонецЦикла;

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

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

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

Равно сумме длин исходных массивов (с дублями) или числу уникальных значений

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

Меньше ожидаемого — часть элементов потеряна; больше — массив объединён дважды

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

Сначала элементы первого массива, затем второго (для циклического способа)

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

Произвольный порядок там, где он должен сохраняться — вероятно, использовано соответствие

Наличие дублей
Норма

Повторов нет, если применялась дедупликация

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

Дубли есть, хотя должны были быть удалены — проверьте типы сравниваемых значений

В отладчике удобно поставить точку останова после объединения и посмотреть содержимое массива через табло — это быстрее, чем вывод в сообщения, при большом числе элементов.

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

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

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

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

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

Почему после удаления дублей повторы всё равно остались?

Чаще всего причина в разных типах данных: строка «10» и число 10 — разные значения. Также проверьте лишние пробелы в строках и регистр символов, если сравнение должно быть без его учёта — стандартное сравнение регистрозависимо.

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

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

Что быстрее: соответствие или проверка через Найти()?

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

Итог

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

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