08.01.22 Версия 1.1 Исправлена ошибка в определении правильных элементов - спасибо RomaM - на его базе тренировались и совещались.
09.01.22 Версия 1.3 Изменил поиск элементов для замены, проверяется предопределенность, если предопределённых в дубле больше одного - элемент будет отвязан. Спасибо нашедшему ошибку Fraktalov.
10.01.22 Версия 1.5 Ещё раз изменил определение "правильных" элементов, спасибо user932790 за базу для теста.
11.01.22 Версия 1.6 Ещё раз изменил определение "правильных" элементов...
Порядок использования по пунктам вывел в картинках.
Если всё проходит нормально - то увидим предупреждение "Обработка завершена...", жмём Закрыть и Перезапустить - должно обновиться...
В обработке использовал функцию замены ссылок из обработки "Поиск и замена дублирующихся элементов справочников" отсюда же, к сожалению не помню автора, и в обработке нет информации. Большое ему спасибо.
Важно - для теста использовал БП 3.0 ДЕМО, в которой принудительно создал дубли в справочнике (команда создания в этой же обработке есть, просто убрал видимость, если кому то интересно поиграться - можете включить в конфигураторе).
Если на боевых базах будут ошибки - пишите в комментариях, или в личку - могу подключиться и посмотреть, что происходит...
Тестировалось на платформе 8.3.20.1674, при обновлении БП 3.0 с 3.0.105.45 на 3.0.106.60.
Вариант процедуры подготовки замены для скачавших версии от 1.3 - замените на этот код:
&НаСервереБезКонтекста
Процедура ЗаменитьНаБольшие(СтрокиГруппы, ПустаяТаблица)
Оставить = ПустаяТаблица.Скопировать();
СтрокаОставить = Оставить.Добавить();
Заменить = ПустаяТаблица.Скопировать();
//Первый проход = проверяем, есть предопределнный элемент(ы)
ЕстьПредопределнный = Ложь;
Для Каждого стр Из СтрокиГруппы Цикл
Если стр.Ссылка.Предопределенный Тогда
ЕстьПредопределнный = Истина;
ЗаполнитьЗначенияСвойств(СтрокаОставить, стр);
КонецЕсли;
Если Не ЕстьПредопределнный Тогда
ОтвязатьПредопреденность(стр.Ссылка);
ДобавитьСтрокуВТаблицу(Заменить, стр);
КонецЕсли;
КонецЦикла;
//Создаем пустую таблицу, заполняем из массива дублей, сортируем по убыванию количества ссылок и заполняем что оставить, а что хаменить, блин
Если НЕ ЕстьПредопределнный Тогда
Оставить = ПустаяТаблица.Скопировать();
Заменить = ПустаяТаблица.Скопировать();
ИсхТаб = ПустаяТаблица.Скопировать();
Для Каждого стр Из СтрокиГруппы Цикл
НовСтр = ИсхТаб.Добавить();
ЗаполнитьЗначенияСвойств(НовСтр, стр);
КонецЦикла;
ИсхТаб.Сортировать("Количество Убыв");
Сч = 0;
Для Каждого стр Из ИсхТаб Цикл
Сч = Сч + 1;
Если Сч = 1 Тогда
НовСтр = Оставить.Добавить();
Иначе
НовСтр = Заменить.Добавить();//исправил, в выложенной ранее версии тут была ошибка
КонецЕсли;
ЗаполнитьЗначенияСвойств(НовСтр, стр);
КонецЦикла;
КонецЕсли;
Если Оставить.Количество() = 1 и Заменить.Количество() <> 0 Тогда
//Всё нормально
МассивКУдалению = Заменить.ВыгрузитьКолонку("Ссылка");
Получилось = ВыполнитьЗаменуЭлементовНаСервере(СтрокаОставить.Ссылка, МассивКУдалению);
Если Получилось Тогда
Для Каждого стр Из МассивКУдалению Цикл
СпрОбъект = стр.ПолучитьОбъект();
СпрОбъект.Удалить();
КонецЦикла;
КонецЕсли;
Иначе
Сообщить("Не удалось определить ""правильный"" элемент справочника! Исправление не прошло...");
КонецЕсли;
КонецПроцедуры