Перейти к содержимому

Как поменять guid в 1с

  • автор:

1С. Тематические записки. им xzorkiix

Вводная: в типовых правилах перехода есть правило конвертации объекта (ПКО) ПервичныйДокументИзСтруктуры. Для типового правила не предусмотрен поиск по GUID и следовательно его установка.

По одному из правил переноса остатков требовалось формировать Первичные документы с GUID исходных документов для возможности использования в будущей интеграции с другими системами.

1. Добавить свойство ПКО с признаком «выгружать в параметр» и «использовать при поиске» — допустим имя УникальныйИдентификатор.

2. В обработчике свойства Перед выгрузкой пишем.

3. Так в некоторых правилах обмена GUID может не требоваться, или в будущем будет принято решение отказаться от реализации. То флаг «Поиск по идентификатору» в свойствах ПКО не включаем (напомню источник у нас структура). И установим следующее правило поиска.

В будущем когда нужно будет отменить выгрузку ГУИД нужно будет передавать пустое значение.

Можно ли поменять УИД существующего справочника?

// .
// хард кодинг, в будующем нужно будет исправить
//
мСоответствияОбъектов.Вставить("УзелИнформационнойБазы", ПланыОбмена.ОбменУПР_БухгалтерияПредприятия3.НайтиПоКоду("Р")); // .
//.

мСоответствияОбъектов.Вставить("УникальныйИдентификаторПриемника", СтрЗаменить(Строка(ТекущееЗначение.УникальныйИдентификатор()), "-", "_"));
мСоответствияОбъектов.Вставить("УникальныйИдентификаторИсточника", НовоеЗначение);
мСоответствияОбъектов.Вставить("ТипПриемника", "");
мСоответствияОбъектов.Вставить("ТипИсточника", "");

мСоответствияОбъектов.Вставить("ТипПриемника", ОбщегоНазначения.СтроковоеПредставлениеТипа(ТипЗнч(ТекущееЗначение)));
мСоответствияОбъектов.Вставить("ТипИсточника", ОбщегоНазначения.СтроковоеПредставлениеТипа(ТипЗнч(НовоеЗначение)));

// ———————————————
// заменяем все ссылки
мСписок = Новый Массив;
мСписок.Добавить(ТекущееЗначение);
ТаблицаСсылок = НайтиПоСсылкам(мСписок);

Для Каждого СтрокаТаблицы Из ТаблицаСсылок Цикл
Если Метаданные.Справочники.Содержит(СтрокаТаблицы.Метаданные)
ИЛИ Метаданные.Документы.Содержит(СтрокаТаблицы.Метаданные) Тогда

Для Каждого Реквизит Из СтрокаТаблицы.Метаданные.СтандартныеРеквизиты Цикл
Если Реквизит.Имя = "Ссылка" Тогда
Продолжить;
КонецЕсли;

Если мОбъект[Реквизит.Имя] = ТекущееЗначение Тогда
мОбъект[Реквизит.Имя] = НовоеЗначение;
КонецЕсли;
КонецЦикла;

Для Каждого Реквизит Из СтрокаТаблицы.Метаданные.Реквизиты Цикл
Если мОбъект[Реквизит.Имя] = ТекущееЗначение Тогда
мОбъект[Реквизит.Имя] = НовоеЗначение;
КонецЕсли;
КонецЦикла;

Для Каждого ТабличнаяЧасть Из СтрокаТаблицы.Метаданные.ТабличныеЧасти Цикл
Для Каждого СтрокаТабличнойЧасти Из мОбъект[ТабличнаяЧасть.Имя] Цикл
Для Каждого Реквизит Из ТабличнаяЧасть.Реквизиты Цикл
Если СтрокаТабличнойЧасти[Реквизит.Имя] = ТекущееЗначение Тогда
СтрокаТабличнойЧасти[Реквизит.Имя] = НовоеЗначение;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЦикла;

Если Метаданные.Документы.Содержит(СтрокаТаблицы.Метаданные) Тогда
Если СокрЛП(СтрокаТаблицы.Метаданные.Проведение) = "Разрешить"
И ПерепроводитьДокументы
И мОбъект.Проведен Тогда

мОбъект.Записать(РежимЗаписиДокумента.Проведение, РежимПроведенияДокумента.Неоперативный);
КонецЕсли;
КонецЕсли;

мОбъект.ОбменДанными.Загрузка = Истина;
мОбъект.Записать();

ИначеЕсли Метаданные.РегистрыСведений.Содержит(СтрокаТаблицы.Метаданные) Тогда
Поля = Новый Массив;

Для Каждого Измерение Из СтрокаТаблицы.Метаданные.Измерения Цикл
Поля.Добавить(Измерение.Имя);
КонецЦикла;

Для Каждого Ресурс Из СтрокаТаблицы.Метаданные.Ресурсы Цикл
Поля.Добавить(Ресурс.Имя);
КонецЦикла;

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

ТаблицаСсылок = НайтиПоСсылкам(мСписок);
Для Каждого СтрокаТаблицы Из ТаблицаСсылок Цикл
Если Метаданные.Документы.Содержит(СтрокаТаблицы.Метаданные) Тогда
Если СписокРезультата.НайтиПоЗначению(мОбъект.Ссылка) = Неопределено Тогда
СписокРезультата.Добавить(мОбъект.Ссылка);
КонецЕсли;
КонецЕсли;
КонецЦикла;

Если Тестирование Тогда
ОтменитьТранзакцию();
Иначе
ЗафиксироватьТранзакцию();
КонецЕсли;
Исключение
Сообщить(ОписаниеОшибки());
ОтменитьТранзакцию();
СписокРезультата.Очистить();
Результат = Ложь;
КонецПопытки;
УстановитьПривилегированныйРежим(Ложь);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

5) Для современных релизов платформы у пользователя, под которым осуществляется запуск обработки, необходимо в конфигураторе снять галочку "Защита от опасных действий" в противном случае 1с отказывается полноценно работать с COM-объектами.

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

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

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

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

Как поменять guid в 1с?

Здравствуйте! Подскажите пожалуйста, могу ли я как-нибудь через обработку поменять GUID элемента? В Реквизитах я не нашел такого , смог только командой УникальныйИдентификатор() вытянуть.
5bf3e03a2607c656449399.png

  • Вопрос задан более трёх лет назад
  • 7180 просмотров

Простой 7 комментариев

  • Facebook
  • Вконтакте
  • Twitter

nki

nki

nki

nki

Причина: Что такое ссылка справочника? Это тип справочника и этот самый GUID. Другой GUID — это другая ссылка. Если в базе есть справочники, документы или другие сущности, которые ссылаются на ваш элемент справочника, то даже после физического удаления из базы, когда все эти ссылки станут «битыми», из каждой из них можно узнать изначальный GUID.

Выход: А если очень нужно? Если нужно, то можно. Вам нужно с помощью функции НайтиПоСсылкам() или собственного кода найти все ссылки на ваш элемент. Далее создать в базе новый элемент с данными оригинального элемента, которому с помощью УстановитьСсылкуНового() установить ссылку сформированную с помощью ПолучитьСсылку() на базе вашего GUID, а потом записать. И наконец, сделать замену во всей базе по ранее полученному списку старой ссылки на новую, после чего старый элемент можно полностью удалить из базы.

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

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