Найти в Дзене

Как удалить в массиве повторяющиеся элементы 1с

В "1С:Предприятие" существует несколько способов удаления повторяющихся элементов из массива. Выбор конкретного метода зависит от размера массива, типа элементов и требований к производительности.

1. Использование объекта "Соответствие"

Этот способ эффективен для массивов с элементами произвольных типов.

1C

Функция УдалитьПовторяющиесяЭлементы(Массив)

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

Для Каждого Элемент Из Массив Цикл Если Соответствие.Получить(Элемент) = Неопределено Тогда Соответствие.Вставить(Элемент, Истина);
Результат.Добавить(Элемент);
КонецЕсли;
КонецЦикла;

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

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

2. Сортировка и удаление соседних дубликатов

Этот способ подходит для массивов, элементы которых можно сравнивать (например, числа, строки, даты).

1C

Функция УдалитьПовторяющиесяЭлементы(Массив)

Массив.Сортировать();
Результат = Новый Массив;

Если Массив.Количество() > 0 Тогда Результат.Добавить(Массив[0]);
Для Индекс = 1 По Массив.Количество() - 1 Цикл Если Массив[Индекс] <> Массив[Индекс - 1] Тогда Результат.Добавить(Массив[Индекс]);
КонецЕсли;
КонецЦикла;
КонецЕсли;

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

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

3. Использование объекта "НаборДляСравнения" (для сложных объектов)

Этот способ подходит для массивов, содержащих сложные объекты, которые нужно сравнивать по определенным критериям.

1C

Функция УдалитьПовторяющиесяЭлементы(Массив, КлючСравнения)

НаборДляСравнения = Новый НаборДляСравнения;
Результат = Новый Массив;

Для Каждого Элемент Из Массив Цикл Если НаборДляСравнения.Найти(Элемент[КлючСравнения]) = Неопределено Тогда НаборДляСравнения.Добавить(Элемент[КлючСравнения]);
Результат.Добавить(Элемент);
КонецЕсли;
КонецЦикла;

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

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

4. Использование объекта "ТаблицаЗначений"

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

1C

Функция УдалитьПовторяющиесяЭлементы(Массив)

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

Для Каждого Элемент Из Массив Цикл НоваяСтрока = Таблица.Добавить();
НоваяСтрока.Значение = Элемент;
КонецЦикла;

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

Результат = Новый Массив;
Для Каждой СтрокаТаблицы Из Таблица Цикл Результат.Добавить(СтрокаТаблицы.Значение);
КонецЦикла;

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

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

Какой способ выбрать?

  • Для небольших массивов: любой из способов подойдет.
  • Для больших массивов с элементами простых типов: сортировка и удаление дубликатов будет самым быстрым способом.
  • Для массивов со сложными объектами: использование "НаборДляСравнения" или "ТаблицаЗначений" будет более подходящим.
  • Для массивов с элементами произвольных типов: использование объекта "Соответствие" будет самым универсальным.

Пример использования:

1C

Массив = Новый Массив;
Массив.Добавить(1);
Массив.Добавить(2);
Массив.Добавить(1);
Массив.Добавить(3);
Массив.Добавить(2);

Результат = УдалитьПовторяющиесяЭлементы(Массив);

Сообщить(Результат); // [1, 2, 3]

Дополнительные рекомендации:

  • При выборе способа учитывайте особенности вашей задачи и требования к производительности.