Как обманчив код других программистов

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

Начал разбираться в причинах. И обнаружил страшное.

Я использовал обработку «ПоискИЗаменаДублирующихсяЭлементов_8.3 УФ от Тесла.epf«, скачанную когда-то с Инфостарта. Это доработанная типовая обработка замены дублей.

Раньше всегда пользовался ею без проблема.

Но в этот раз мне не хотелось добавлять в отбор условие по исключению пустых строк:

Поэтому я поправил обработку, добавил возможность изменения порядка и состава строк и просто удалил первую пустую строку.

Но оказалось, что коду совершенно безразлично, что я там удалил в таблице ТаблицаГрупп.

Потому что код замены по всем группам работает по другой таблице ПравильныеСтроки:

Т.е. не перебираются все группы, а перебираются найденные правильные элементы и там дальше идет поиск по номеру группы.

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

Придется переписать этот код, чтобы отбирал по группам. Переписал так:

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

Но вообще-то буду посматривать на код замены групп из UI_Tools. Они взяли его от TormozIT, наверное, там работает качественно. Возможно, даже изменили интерфейс обработки замены дублей, в котором может разобраться только инопланетянин.

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Читайте также:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *