Как обманчив код других программистов
Делал замену дублей, в итоге замена произошла неправильно, хорошо, пользователи обнаружили при начале работы, поэтому просто восстановил базу из архива.
Начал разбираться в причинах. И обнаружил страшное.
Я использовал обработку «ПоискИЗаменаДублирующихсяЭлементов_8.3 УФ от Тесла.epf«, скачанную когда-то с Инфостарта. Это доработанная типовая обработка замены дублей.
Раньше всегда пользовался ею без проблема.
Но в этот раз мне не хотелось добавлять в отбор условие по исключению пустых строк:
Поэтому я поправил обработку, добавил возможность изменения порядка и состава строк и просто удалил первую пустую строку.
Но оказалось, что коду совершенно безразлично, что я там удалил в таблице ТаблицаГрупп.
Потому что код замены по всем группам работает по другой таблице ПравильныеСтроки:
Т.е. не перебираются все группы, а перебираются найденные правильные элементы и там дальше идет поиск по номеру группы.
В общем, при нажатии «Замена во всех группах», она заменяет во всех группах, даже удаленных из списка. Это очень неочевидно и криво. Видимо, поэтому сделали запрет на редактирование списка групп.
Придется переписать этот код, чтобы отбирал по группам. Переписал так:
&НаСервере Процедура АвтозаменаЭлементов(ПомечатьОбъектыНаУдаление) Если РезультатыПоиска.Количество() = 0 Тогда Возврат; КонецЕсли; //Здесь замена во всх группах Для Каждого СтрокаГруппы ИЗ ТаблицаГрупп Цикл //СтруктураПоискаПравильных = Новый Структура("Правильный",Истина); НомерГруппы = СтрокаГруппы.НомерГруппы; СтруктураПоискаПравильных = Новый Структура("Правильный, НомерГруппы",Истина, НомерГруппы); ПравильныеСтроки = РезультатыПоиска.НайтиСтроки(СтруктураПоискаПравильных); Если ПравильныеСтроки.Количество() = 0 Тогда Сообщить("Не найден правильный элемент для группы №: " + НомерГруппы + " (" + СтрокаГруппы.Группа + ")"); Продолжить; КонецЕсли; СтрокаПравильного = ПравильныеСтроки[0]; //правильная строка СтруктураПоиска = Новый Структура("НомерГруппы, Правильный",СтрокаПравильного.НомерГруппы, Ложь); МассивСсылок = Новый Массив; МассивНеправильныхСтрок = РезультатыПоиска.НайтиСтроки(СтруктураПоиска); Для каждого СтрокаНеправильного Из МассивНеправильныхСтрок Цикл МассивСсылок.Добавить(СтрокаНеправильного.Ссылка); КонецЦикла; ЗаменаВыполнена = ВыполнитьЗаменуЭлементовНаСервере(СтрокаПравильного.Ссылка, МассивСсылок); Если ПомечатьОбъектыНаУдаление И (ЗаменаВыполнена Или Не ВыполнятьВТранзакции) Тогда ТаблицаОставшихсяСсылок = НайтиПоСсылкам(МассивСсылок); ТаблицаОставшихсяСсылок.Свернуть("Ссылка"); Для каждого СтрокаНеправильного Из МассивНеправильныхСтрок Цикл Если ТаблицаОставшихсяСсылок.Найти(СтрокаНеправильного.Ссылка, "Ссылка") = Неопределено Тогда ОбъектСсылки = СтрокаНеправильного.Ссылка.ПолучитьОбъект(); Если ОбъектСсылки <> Неопределено Тогда Попытка //ОбъектСсылки.УстановитьПометкуУдаления(Истина); УстановитьПометкуУдаленияНаСервере(ОбъектСсылки, истина); РезультатыПоиска.Удалить(СтрокаНеправильного); Исключение Сообщить(ОписаниеОшибки()); КонецПопытки; КонецЕсли; КонецЕсли; КонецЦикла; КонецЕсли; КонецЦикла //По группам КонецПроцедуры
Но вообще-то буду посматривать на код замены групп из UI_Tools. Они взяли его от TormozIT, наверное, там работает качественно. Возможно, даже изменили интерфейс обработки замены дублей, в котором может разобраться только инопланетянин.
Свежие комментарии