gifts2017

Замена GUID для объектов

Опубликовал Петр Дорохов (PiterPrg) в раздел Администрирование - Сервисные утилиты

Обработка позволяет при использовании MSSQL в качестве СУБД поменять GUID объекта.
Внимание!!!
Данная обработка обращается к СУБД «напрямую», используйте ее на свой страх и риск.
Используйте обработку только в случае, если вы четко понимаете, что и для чего вы делаете.

Я всех предупредил.

При использовании распределенных БД часто возникает проблема «Задвоения» элементов или наоборот, «Объект не найден».

Данная обработка позволит вам установить произвольный GUID для существующих объектов.

При замене GUID объекта обработка изменяет GUID по ссылкам во всех связанных объектах.

 

Принцип работы с обработкой:

1) В поле «Элемент» указываем объект базы, у которого мы хотим поменять GUID.

Поле «Тек ГУИД» заполняется GUID-ом выбранного элемента.

2) В поле «Нов ГУИД» вводим GUID который мы хотим задать для этого элемента.

3) Указываем строку подключения для базы данных.

Важно!!! Поскольку обработка происходит на сервере, то строки подключения различаются для х64 и х32 сервера приложений.

Для х64

Provider=SQLOLEDB.1;Server=[Сервер];UID=[Пользователь];pwd=[Пароль];Database=[БазаДанных];

Для х32

Driver={SQL Server};Server=[Сервер];UID=[Пользователь];pwd=[Пароль];Database=[БазаДанных];

4) Тип алгоритма:

 

"Медленная" замена, с отображением таблиц – При поиске на каждый подходящий реквизит выполняется 3 запроса к MS SQL серверу, при этом выводится информация о таблицах и количествах замены.

 

Быстрая замена – замена всех значений происходит хранимой процедурой, за одно обращение к MS SQL серверу, однако таблицы для замены определяются при помощи «НайтиПоСсылкам». (Быстрее первого способа, но минимум информации)

 

Быстрая замена, везде, включая движения документа– замена всех значений происходит хранимой процедурой, за одно обращение к MS SQL серверу. В процессе замены мы пытаемся заменить ссылку в любом подходящем по типу поле в БД. Таким образом, ссылки будут замещаться и в движениях документов и в итогах.

Самый опасный способ! Но мы ведь смелые, без бэкапов ощущения не те (сарказм).

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

 

Возможен режим «Слияния» объектов.

Предположим, у нас есть 2 элемента справочника с одинаковыми наименованиями и мы хотим, что бы это стал 1 элемент. Можно запустить обработку с поиском и заменой значений, а можно запустить мою обработку.

Выбираем 1 из элементов, «Нов GUID» делаем равным GUID-у второго элемента, отмечаем галочку «Не менять ссылку».

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

 

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

Наименование Файл Версия Размер Кол. Скачив.
Обработка "Замена GUID"
.epf 14,29Kb
30.07.15
86
.epf 14,29Kb 86 Скачать

См. также

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

Комментарии

1. Max Sit (xamass) 10.12.14 08:50
По поиску и замене есть загвоздка, когда УИД меняется в документе, надо бы делать замену и в Движениях, которые сделал этот документ, и еще при этом подсчитать текущие итоги.
2. Петр Дорохов (PiterPrg) 10.12.14 09:57
Да, на документах я как-то не тестировал. Надо посмотреть. Действительно. НайтиПоСсылкам не ищет среди Регистров...
3. Max Sit (xamass) 10.12.14 10:13
Транзакции в SQL не отрабатывают, ошибка следующая
Ошибка выполнения запроса:{ВнешняяОбработка.ЗаменаГУИД.МодульОбъекта(98)}: Ошибка при вызове метода контекста (Execute): Произошла исключительная ситуация (Microsoft OLE DB Provider for ODBC Drivers): Транзакция не может иметь несколько наборов записей с данным типом курсора. Измените тип курсора, завершите транзакцию или закройте один из наборов записей.

Комментировал строки относящиеся к транзакциям, проходит без ошибки
4. Петр Дорохов (PiterPrg) 10.12.14 11:00
Комментировать транзакции - это не дело :-)

Странно, что у меня все работает.
Сделал закрытие рекордсета перед открытием нового.

Проверь плиз, (поскольку у меня и так и так работает)
Скачай обработку после модерации
или добавь
Чтение.Close();


после

  Возврат 0;
КонецЕсли;


в строках 80 и 110 модуля обработки

т.е. должно стать:

		Возврат 0;
	КонецЕсли;
	Чтение.Close();
	



Если не поможет, придется явно описывать тип курсора.
5. Петр Дорохов (PiterPrg) 10.12.14 11:45
По - поводу первого замечания.
Действительно, в регистрах замены не происходит.
НайтиПоСсылкам не ищет по регистрам.

Буду разбираться. Пока необходимо перепроведение документов с измененными объектами
6. Max Sit (xamass) 10.12.14 11:53
По движениям у меня есть такой вариант, в процедуре ПолучитьТаблицы() добавить
Для Каждого Ссылка ИЗ Ссылки Цикл
		Для Каждого Дв ИЗ Ссылка.Метаданные.Движения Цикл
			Если Фильтр.Найти(Дв)<>Неопределено Тогда
				Продолжить;
			КонецЕсли;	
			Фильтр.Добавить(Дв);
		КонецЦикла;	
	КонецЦикла;
...Показать Скрыть


Но при этом он подхватывает и таблицы ИтогиПоСчетамСубконто, которые относятся к бух. регистрам, при замене в этой таблице скрипт падает с ошибкой:
Не удается вставить повторяющуюся строку ключа в объект "dbo._AccRgAT2615" с уникальным индексом "_AccRgA2615_ByPeriod_TRRRRRRN". Повторяющееся значение ключа: .....

Пока не могу найти информацию, когда и при каких обстоятельствах происходит запись в эти таблицы, и надо ли в нашем случае сразу менять там записи, или можно пропускать их.
7. Петр Дорохов (PiterPrg) 10.12.14 13:31
Спасибо, хорошая идея. надо подумать.

"_AccRgA2615_ByPeriod_TRRRRRRN"
Судя по названию - это может быть таблица с итогами, если это так -
запись происходит при пересчете итогов.

Нужно как-то исключить таблицы с итогами (по всем регистрам)
И после замены делать пересчет итогов в Тестировании/Исправлении

А с агрегатами - вообще не знаю как, надеюсь они тоже при пересчете обновятся

З.Ы. Закрытие рекордсета помогло?
8. Max Sit (xamass) 10.12.14 14:08
Да, закрытие рекордсета помогло.
Тестирование и исправление как то совсем не хочется делать, т.к. с таким вариантом получится вряд ли быстрее, чем при обычном поиске и замене.

Да, и мне кажется, что не только пересчет итогов влияет, ведь если просто проводить документ или даже записывать набор записей и после этого сразу обойти таб. итогов запросом, то данные будут обновленные.
9. Игорь Фелькер (Brawler) 12.12.14 09:14
Сыкотные пути какие-то.
Мне проще юзать обработки типа ПоискИЗаменаЗначений или для УФ SearchAndChange_AllModes_0_0_1_4.
Ежели известен ГУИД новый, то значит в базе можно создать объект с этим ГУИД, а потом сделать замену выше указанными обработками, не так быстро конечно, но не в обход механизмов платформы.
10. Петр Дорохов (PiterPrg) 21.07.15 14:20
В новой версии обработки добавлен 3-й алгоритм замены. Происходит попытка заменить ссылку вообще во всех полях базы данных (в движениях документа тоже). При этом ошибки, описанные в (6), игнорируются. Хорошая новость в том, что это обычно итоговые поля регистров и при пересчете итогов все станет хорошо. То что это ссыкотные пути (9) - кто-ж спорит-то, кончно ссыкотные.... А что делать если поиску и замене не хватает памяти? Или эта замена будет выполнятся 2 месяца?
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа