Разработка и Конфигурация · 9 мин
Как соединить два массива в 1С
Как соединить два массива в 1С: цикл с Добавить, удаление дублей, объединение через соответствие и таблицу значений. Примеры кода, ошибки и проверка результата.
Массив в 1С — это коллекция с индексированным доступом, у которой нет встроенного метода «Объединить» или «Скопировать из другого массива». Поэтому соединение двух массивов всегда сводится к переносу элементов из одного массива в другой — вручную через цикл или с помощью промежуточных коллекций, если нужно убрать дубли или отсортировать результат.
Выбор способа зависит от трёх условий: допустимы ли повторяющиеся элементы, важен ли порядок и какой размер у исходных данных. Для пары массивов по десять элементов подойдёт простой цикл, для больших объёмов с удалением дублей эффективнее работать через соответствие или таблицу значений.
Ниже разобраны рабочие приёмы с готовым кодом, типичные ошибки и способы проверить, что объединение прошло корректно.
Базовый способ: перенос элементов циклом
Самый прямой вариант — пройтись по второму массиву и добавить каждый элемент в первый. Метод Добавить() помещает элемент в конец массива, поэтому порядок сохраняется: сначала идут элементы первого массива, затем второго.
Массив1 = Новый Массив;
Массив1.Добавить("А");
Массив1.Добавить("Б");
Массив2 = Новый Массив;
Массив2.Добавить("В");
Массив2.Добавить("Г");
Для Каждого Элемент Из Массив2 Цикл
Массив1.Добавить(Элемент);
КонецЦикла;
// Массив1 теперь содержит: А, Б, В, Г
Этот приём работает с элементами любых типов: строками, числами, ссылками на объекты и даже другими массивами. Дубли при этом не отсекаются — если одно и то же значение есть в обоих массивах, в результате оно встретится дважды.
Если исходные массивы нужно оставить нетронутыми, сначала создайте третий массив и перенесите в него элементы обоих источников двумя последовательными циклами.
Объединение без дублей через соответствие
Когда важна уникальность значений, удобнее всего использовать соответствие как промежуточное хранилище: ключи в нём уникальны, поэтому повторы отсеиваются автоматически.
Уникальные = Новый Соответствие;
Для Каждого Элемент Из Массив1 Цикл
Уникальные.Вставить(Элемент, Истина);
КонецЦикла;
Для Каждого Элемент Из Массив2 Цикл
Уникальные.Вставить(Элемент, Истина);
КонецЦикла;
Результат = Новый Массив;
Для Каждого КлючЗначение Из Уникальные Цикл
Результат.Добавить(КлючЗначение.Ключ);
КонецЦикла;
Учтите ограничение: порядок элементов при обходе соответствия не гарантирован. Если порядок важен, проверяйте наличие элемента через Найти() перед добавлением — но помните, что поиск по массиву выполняется перебором, и на больших объёмах это заметно медленнее.
Для ссылочных значений (номенклатура, контрагенты) соответствие сравнивает ссылки корректно: две переменные, указывающие на один объект базы, будут признаны одинаковыми ключами.
// Объединение с сохранением порядка и без дублей
Результат = Новый Массив;
Для Каждого Элемент Из Массив1 Цикл
Если Результат.Найти(Элемент) = Неопределено Тогда
Результат.Добавить(Элемент);
КонецЕсли;
КонецЦикла;
Для Каждого Элемент Из Массив2 Цикл
Если Результат.Найти(Элемент) = Неопределено Тогда
Результат.Добавить(Элемент);
КонецЕсли;
КонецЦикла;Объединение через таблицу значений
Таблица значений подходит, когда после объединения нужна сортировка, свёртка или дополнительная обработка. Идея: выгрузить оба массива в одну колонку таблицы, затем свернуть её.
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Значение");
Для Каждого Элемент Из Массив1 Цикл
ТЗ.Добавить().Значение = Элемент;
КонецЦикла;
Для Каждого Элемент Из Массив2 Цикл
ТЗ.Добавить().Значение = Элемент;
КонецЦикла;
ТЗ.Свернуть("Значение");
Результат = ТЗ.ВыгрузитьКолонку("Значение");
Метод Свернуть() убирает дубли, а ВыгрузитьКолонку() возвращает готовый массив. При необходимости перед выгрузкой можно отсортировать таблицу методом Сортировать("Значение").
Этот способ тяжелее по ресурсам, чем простой цикл, поэтому для маленьких массивов без требований к уникальности он избыточен. Его сила — в комбинации объединения, дедупликации и сортировки в одной связке.
Сравнение вариантов
Самый быстрый и простой. Дубли сохраняются, порядок исходных массивов сохраняется.
Автоматически убирает дубли, быстро работает на больших объёмах, но порядок элементов не гарантирован.
Дубли убраны, порядок сохранён, но поиск перебором медленный на больших массивах.
Даёт свёртку и сортировку из коробки, но требует больше памяти и кода.
Как выбрать способ под свою задачу
Ориентируйтесь на три вопроса: нужны ли дубли, важен ли порядок, каков объём данных. Для отчёта, где повторы недопустимы и порядок не важен, берите соответствие. Для объединения списков строк с сохранением последовательности — цикл с проверкой через Найти().
Если массивы содержат тысячи элементов и дубли нужно убрать с сохранением порядка, комбинируйте подходы: соответствие используйте как быстрый индекс для проверки «уже добавлен», а итоговый массив заполняйте в правильном порядке.
Как выбрать действие
Типичные ошибки при объединении массивов
Чаще всего проблемы возникают не из-за самого объединения, а из-за неверных предположений о содержимом массивов. Ниже — то, что стоит проверить в первую очередь.
Отдельная ловушка — значение Неопределено в исходных массивах. Оно переносится как обычный элемент, и при последующей обработке может вызвать ошибки обращения к свойствам. Если такие значения возможны, отфильтруйте их в цикле.
Проверка результата объединения
После объединения убедитесь, что итоговый массив соответствует ожиданиям. Быстрый способ — вывести количество элементов и сравнить с расчётным: сумма длин исходных массивов (для варианта с дублями) или количество уникальных значений (для варианта без дублей).
Сообщить("Элементов в результате: " + Результат.Количество());
Для Каждого Элемент Из Результат Цикл
Сообщить(Элемент);
КонецЦикла;
Как проверить результат
Равно сумме длин исходных массивов (с дублями) или числу уникальных значений
Меньше ожидаемого — часть элементов потеряна; больше — массив объединён дважды
Сначала элементы первого массива, затем второго (для циклического способа)
Произвольный порядок там, где он должен сохраняться — вероятно, использовано соответствие
Повторов нет, если применялась дедупликация
Дубли есть, хотя должны были быть удалены — проверьте типы сравниваемых значений
В отладчике удобно поставить точку останова после объединения и посмотреть содержимое массива через табло — это быстрее, чем вывод в сообщения, при большом числе элементов.
Частые вопросы
Есть ли в 1С готовая функция объединения массивов?
Нет, во встроенном языке нет метода вида «Объединить» или «Склеить» для массивов. Стандартная практика — перенос элементов циклом с методом Добавить() либо использование промежуточных коллекций (соответствие, таблица значений) для дополнительной обработки.
Как объединить массивы и сразу отсортировать результат?
Выгрузите оба массива в таблицу значений, при необходимости сверните её для удаления дублей, затем вызовите Сортировать("ИмяКолонки") и получите массив методом ВыгрузитьКолонку(). Либо объедините циклом и отсортируйте вручную любым алгоритмом сортировки.
Почему после удаления дублей повторы всё равно остались?
Чаще всего причина в разных типах данных: строка «10» и число 10 — разные значения. Также проверьте лишние пробелы в строках и регистр символов, если сравнение должно быть без его учёта — стандартное сравнение регистрозависимо.
Можно ли объединить массивы разных типов элементов?
Да, массив в 1С не типизирован: в одном массиве могут храниться строки, числа, даты и ссылки одновременно. Ограничения появятся позже — при сортировке или свёртке таблицы значений с колонкой составного типа.
Что быстрее: соответствие или проверка через Найти()?
На больших объёмах соответствие заметно быстрее: вставка и поиск ключа работают почти мгновенно, тогда как Найти() каждый раз перебирает массив с начала. На массивах из десятков элементов разница неощутима, и проще использовать Найти().
Что важно запомнить
Объединение массивов в 1С делается циклом с Добавить(). Для удаления дублей используйте соответствие или свёртку таблицы значений, для сохранения порядка — проверку через Найти(). После объединения проверьте количество элементов и наличие повторов.