gifts2017

Замена ГУИД

Опубликовал Glory S (slava_1c) в раздел Обработки - Универсальные обработки

Замена ГУИД в произвольном объекте конфигурации. Может склеивать задвоенные объекты.

Всем доброго дня!

Предлагаю Вашему вниманию маленькую, но крайне полезную обработку.

С помощью ее можно:

1. Найти объект по ГУИД (глобальный уникальный идентификатор, пример "3bd3fe02-f885-11de-8c0b-002215cbe1ec")

2. Заменить "битые" ссылки, которые появились в результате случайного непосредственного удаления элемента справочника/документа.

3. Склеить два элемента справочника в один, путем замены одного ГУИД на другой.

4. Обработка работает быстрее стандартной обработки "Поиск и замена дублирующихся элементов справочников" из-за иного алгоритма поиска и замены ссылок, и в отличие от нее позволяет заменять документы.

5."Подсунуть" новый или уже имеющийся объект под "битую" ссылку.

6. Заменить ГУИД у справочника с целью его дальнейшей синхронизации в тех случаях, когда синхронизация идет по внутреннему идентификатору, например в случае обмена данными распределенных баз.

Работает в управляемом и неуправляемом режиме.

Код полностью открытый!

Изменения 15.07.2016: В версии 1.005 добавлено восстановление всех последовательностей с множественными измерениями, как следствие, исключена распространенная ошибка "Ошибка при вызове метода контекста (УстановитьГраницу) по причине: Недопустимое значение параметра (параметр номер '2') "

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
Замена ГУИД
.epf 13,97Kb
09.07.16
41
.epf 1.005 13,97Kb 41 Скачать

См. также

PowerTools от 1 000
Подписаться Добавить вознаграждение

Комментарии

1. Stas Fomichev (fomstas) 13.07.16 10:35
Спасибо иногда полезна.
2. Дмитрий Жиляков (Zhilyakovdr) 13.07.16 14:29
Каким образом подменяется? Обычной подменой на новый элемент в местах использования?
3. Glory S (slava_1c) 13.07.16 19:34
(2) Zhilyakovdr, По сути да, только не элемент заменяется, а его ГУИД. Алгоритм такой: набираем все ссылки на старый объект, все задействованные регистры и сам старый объект, далее сериализуем объекты - получается один xml. В полученном xml одним движением подменяем старый ГУИД на новый и запихиваем обратно. Старый объект удаляем.
Фокус в том, что если, допустим, было две валюты "руб" с разными ГУИД, и мы хотим их объединить, то найдя все ссылки на объект с одной валютой и подменив их на другую, мы получаем в итоге один элемент справочника с правильными ссылками во всех справочниках, документах и регистрах.
4. Николай Зайков (Mortiferus) 14.07.16 07:54
5. Дмитрий Жиляков (Zhilyakovdr) 14.07.16 09:25
(3) slava_1c, А как насчет последовательностей? Это актуально например для БП.
С подменой в xml действительно хитро придумано.
6. Glory S (slava_1c) 14.07.16 20:57
Да спасибо, справедливое замечание.

Я думаю можно сделать так:
Перед началом выполнения замены скопируем актуальные границы всех последовательностей в массив
	ЗначенияПоследовательности = Новый Массив;
	Для каждого ТекущаяПоследовательность из Последовательности Цикл
		Если Метаданные.Последовательности[СтрЗаменить(ТекущаяПоследовательность,"ПоследовательностьМенеджер.","")].Измерения.Количество()>0 тогда
			Разрез = "";
			Для каждого стр из Метаданные.Последовательности[СтрЗаменить(ТекущаяПоследовательность,"ПоследовательностьМенеджер.","")].Измерения Цикл
				Разрез = ?(Разрез = "","",Разрез+",")+СокрлП(стр.Имя);
			КонецЦикла;	
	        ТабГраниц = ТекущаяПоследовательность.ПолучитьГраницы(Разрез);
			ЗначенияПоследовательности.Добавить(ТабГраниц);
		Иначе
	        ЗначенияПоследовательности.Добавить(ТекущаяПоследовательность.ПолучитьГраницу());
		КонецЕсли;	
	КонецЦикла;
...Показать Скрыть



а в конце восстановим их
ы = 0;
	Для каждого ТекущаяПоследовательность из Последовательности Цикл
		Если ТипЗнч(ЗначенияПоследовательности[ы]) = Тип("ТаблицаЗначений") тогда
			Для каждого стр из ЗначенияПоследовательности[ы] Цикл
				Попытка
					ТекущийОтбор = Новый Структура();
					Для ТекКолонка = 0 по ЗначенияПоследовательности[ы].Колонки.Количество()-1 Цикл
						Если СокрлП(ЗначенияПоследовательности[ы].Колонки[ТекКолонка].Имя)  = "Граница" тогда
						Иначе	
							ТекущийОтбор.Вставить(ЗначенияПоследовательности[ы].Колонки[ТекКолонка].Имя,стр[ТекКолонка]);
						КонецЕсли;
					КонецЦИкла;
		        	ТекущаяПоследовательность.УстановитьГраницу(стр.Граница,ТекущийОтбор);
				Исключение
					Сообщить("При установке "+СокрлП(ТекущаяПоследовательность)+" произошла ошибка: "+СокрлП(ОписаниеОшибки()));	
				Конецпопытки;
			КонецЦикла;	
		Иначе
			Попытка
	        	ТекущаяПоследовательность.УстановитьГраницу(ЗначенияПоследовательности[ы]);
			Исключение
				Сообщить("При установке "+СокрлП(ТекущаяПоследовательность)+" произошла ошибка: "+СокрлП(ОписаниеОшибки()));	
			Конецпопытки;
		КонецЕсли;	
        ы = ы+1;
    КонецЦикла;
...Показать Скрыть
7. Сергей Старых (tormozit) 16.07.16 00:34
(4) Да и уже не новая. В ИР такое уже давно есть в редакторе объекта БД и в подборе и обработке объектов БД.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа