Изменить уникальный идентификатор у элемента справочника

1. n_spb 17.05.19 12:25 Сейчас в теме
1С 8.3. Возможно ли программно изменить у существующего элемента справочника уникальный идентификатор на нужный?
user1389814; +1 Ответить
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
21. Xershi 1490 17.05.19 20:13 Сейчас в теме
(1) изменить нельзя, а вот создать новый с нужным можно. Пример вам уже скинули.
dj_voodoo; +1 Ответить
2. Kovekh 17.05.19 12:50 Сейчас в теме
В смысле на нужный? Чем Вам может не угодить назначенный?)
Изменить вряд ли получится даже программно
3. user-z99999 67 17.05.19 12:58 Сейчас в теме
(2)
Изменить вряд ли получится даже программно

можно

ГУИДВидНоменклатуры = Новый УникальныйИдентификатор();
ВидНоменклатурыСсылка = Справочники.ВидыНоменклатуры.ПолучитьСсылку(ГУИДВидНоменклатуры);
ВидНоменклатурыОбъект = Справочники.ВидыНоменклатуры.СоздатьЭлемент();
ВидНоменклатурыОбъект.УстановитьСсылкуНового(ВидНоменклатурыСсылка);
ВидНоменклатурыОбъект.Наименование = "тест";
ВидНоменклатурыОбъект.Записать();

В смысле на нужный? Чем Вам может не угодить назначенный?)

возможно настроена синхронизация между базами
kaaasteeen; acuta; charmillion; m_o; shoy; eLeMeNtaLe; Slypower; +7 Ответить
5. tusv 211 17.05.19 13:15 Сейчас в теме
(3)Это для нового УстановитьСсылкуНового работает. Неправ?
(1) Приблизительно вот такой процедуркой если Это БСП
&НаСервереБезКонтекста
Процедура ЗаменитьСсылкуНаСервере(Ссылка,УИД)
	Об = Ссылка.ПолучитьОбъект();
	НовОб = Об.Скопировать();
	НовОб.УстановитьСсылкуНового(УИД);
	НовОб.ОбменДанными.Загрузка = Истина;
	НовОб.Записать();
	ПарыЗамен = Новый Соответствие;
	ПарыЗамен.Вставить(Ссылка,НовОб.Ссылка);
	
	ОбщегоНазначения.ЗаменитьСсылки(ПарыЗамен, Новый Структура("СпособУдаления,ЗаменаПарыВТранзакции","Непосредственно",Истина));
	
КонецПроцедуры
Показать
lika_master; anderson; Elmax; user2008717; BarsukM; kaaasteeen; mcd2003; aupovy; user1879442; victorree; akmich; wing; Kovekh; Bolnov; kawaietz; VitalyKepov; leks88; Leoon; +18 Ответить
6. user-z99999 67 17.05.19 13:18 Сейчас в теме
(5)
Лучше создать новый элемент с нужным ГУИДом и везде в программе 1с поменять ссылки на него,
а потом старый элемент удалить.
user1675272; +1 Ответить
7. tusv 211 17.05.19 13:23 Сейчас в теме
(6)А моя процедура, что делает?
Риник; +1 Ответить
22. Leoon 3 18.05.19 20:19 Сейчас в теме
(5) Прикольная фигня, по случаю опробую. Спасибо!
23. tusv 211 18.05.19 20:24 Сейчас в теме
(22)Не, Ну. Одинэсина думает о Нас. Подводных камней не обнаружил. Пользовался многократно в условиях, когда филиалов просто выше крыши. Правда я на всякий случай а Параметрах указывал "ПометкаУдаления"
И дале если НайтиПСссылкам пусто, то удалял. Непосредственное удаление побоялся использовать
8. n_spb 17.05.19 13:40 Сейчас в теме
(2) Настроен обмен между двумя базами. Нужно чтобы уникальные идентификаторы элементов справочника в базе приемнике были, как в базе источнике. На данный момент уникальные идентификаторы частично не совпадают.
9. tusv 211 17.05.19 13:47 Сейчас в теме
(8)Если обмен настроен, то Регистр сведений СоответствияОбъектовИнформационныхБаз должен заполнятся, Если это конечно не РИБ.
Не проще ли заполнить это соответсвие?
11. n_spb 17.05.19 13:51 Сейчас в теме
(9) К сожалению, это не типовой обмен. Подключаюсь по com.
14. tusv 211 17.05.19 14:03 Сейчас в теме
(11)То есть не через Планы обмена?
16. n_spb 17.05.19 15:21 Сейчас в теме
(14) Подключаюсь по com и программно создаю нужные документы, заполняя из значениями из справочников найденных по уникальным идентификаторам.
12. tusv 211 17.05.19 13:52 Сейчас в теме
(11)Обмен по правилам обмена?
15. n_spb 17.05.19 15:17 Сейчас в теме
(12) Без правил, программно создаю нужные документы.
В справочнике приемнике ищу так:
BasePriemnik.Справочники.НужныйСправочник.ПолучитьСсылку(GUIDSprIstochnika)
17. tusv 211 17.05.19 15:32 Сейчас в теме
(15)Жеж можно дополнить
Ссылка = BasePriemnik.Справочники.НужныйСправочник.ПолучитьСсылку(GUIDSprIstochnika);
Если Ссылка.Пустая() Или Ссылка.ПолучитьОбъект() = Неопределено Тогда
	//Ищем в регистре СоответствияОбъектовИнформационныхБаз
	//Если Не нашли, то ищем по полям поиска запросом, ну там код, наименование
	//Нашли пишем в регистр Не нашли создаем, Результат поиска и создание записываем в регистр соответствия
КонецЕсли;

Но. Узел обмета должен быть не пустым
19. n_spb 17.05.19 19:37 Сейчас в теме
(17) Подскажите, зачем два условия?
Ссылка.Пустая() Или Ссылка.ПолучитьОбъект()
20. tusv 211 17.05.19 19:44 Сейчас в теме
(19)Проверка на пустую ссылку и на битую.. Перестраховка в общем Насколька я помню, что метод ПолучтьСсылку возвращает битую, если не найдена, но могу ошибаться, потому двойное условие прописал
25. hakerxp 3017 13.06.23 14:47 Сейчас в теме
(19), по рукам нужно бить за такую проверку через ПолучитьОбъект(). Затраты по времени будут огромные. Самый быстрый и проверенный способ проверки на битую ссылку - это СтрНайти(Ссылка, "<Объект не найден>") > 0
26. dandykry 10 14.06.23 08:00 Сейчас в теме
(25) Изменят язык платформы на любой другой и фиг оно сработает.

Правильнее прочитать код или номер из ссылки и сравнить с Null. Даже Для формирования строкового представления объекта иногда больше данных запрашивается
27. hakerxp 3017 14.06.23 09:21 Сейчас в теме
(26), для данного случая нужно всегда проверять наличие кода или номера. Тем более у некоторых видов объектов может быть отключен код в конфигурации и будет ошибка при его получении. Так же, нужно учитывать, что процент битых ссылок может быть минимален, а проверка будет выполняться все время. А ссылка всегда есть, это раз, и представление ссылки получает система быстро всегда. Проверено на на многих типовых конфигурациях. Я знаю о чем говорю так как в моих коммерческих продуктах я всегда замеряю производительность и данный код всегда оптимален по скорости.
28. dandykry 10 14.06.23 15:56 Сейчас в теме
(27) Мы говорим о надежности, а не быстродействии. Оно может с космической скорость проверять неправильно, или медленно, но верно.

Для формирования представления платформа делает запрос к объекту по тем полям, которые указаны в модуле менеджера в событии ОбработкаПолученияПолейПредставления, т.е. в теории может быть запрос больше, чем из 1 поля. Представление кэшируется, но не думаю, что в этом случае этот кэш как-то полезен.

Не нравится код, в запросе доступно все то же поле Представление, которое при битой ссылке будет равно NULL, которое легко сравнить в любых языках.
Прикрепленные файлы:
user1951539; Ditron; +2 Ответить
18. tusv 211 17.05.19 15:37 Сейчас в теме
(15)в дополнение к (17)
А там потихонечку, регламентом, по ночам, проходиться по Регистру и заменять ссылочки процедуркой в (5)
4. palsergeich 17.05.19 13:10 Сейчас в теме
Изментить нельзя.

Создать новый элемент с правильным ГУУИД, потом через обработку замены значений - заменить неправильный на правильный.
Неправильный гуид после этого пометить на удаление и удалить с контролем ссылочной
10. n_spb 17.05.19 13:49 Сейчас в теме
(5)
ОбщегоНазначения.ЗаменитьСсылки
Интересная функция, не пользовался ей.
13. tusv 211 17.05.19 13:59 Сейчас в теме
(10)Если использовал Обработку ПоискИЗаменаЗначений, значит пользовался:)
24. strelvan 74 11.04.22 15:32 Сейчас в теме
Ещё один способ: На мой взгляд самый удобный и без подводных камней. Без навыков программирования 1С.
1. В любом случае замена на прямую УИДа нет.
2. Выгружаем необходимый нам объект путем выгрузки/загрузки данных xml или json, при помощи всем известных обработок.
3. Далее открываем выгруженный файл. Находим в нем строку с УИД по типу ( "UID":"b2a59ee6-fefc-11ea-b679-3c970e327c26" ). И меняем в нем строку УИД на наш необходимый УИД. "b2a59ee6-fefc-11ea-b679-3c970e327c26". И сохраняем файл.

4. Загружаем наш измененный файл в нашу БД.

5. Старый объект метим на удаление и удаляем его с помощью замены ссылок на новый созданный нами объект, используя штатную обработку удаления объектов из базы.
user2008717; janit; user1126480; SpaceCowboy; +4 Ответить
29. hakerxp 3017 14.06.23 18:34 Сейчас в теме
(28) , запрос к полю Представление и то что выполняет 1С за кадром в случае с ссылкой одно и тоже. В запросе это виртуальное поле, его платформа генерирует само. В плане представления - битая ссылка всегда будет <Объект не найден>, чтоб не было прописано в полях представления или в обработчиках его формирования. А скорость как раз всегда важна.
30. dandykry 10 15.06.23 08:13 Сейчас в теме
(29) Посмотри в 28 скрин. Специально платформу с en запустил и показал, что <Объект не найден> не всегда в представлении при битой ссылке, могут быть вариации, которые вам все сломают. Я предложил решение, которое работает в 100% с тем же самым представлением, которое предлагали использовать, которое "одно и то же" в объектной модели и в запросе.
31. hakerxp 3017 15.06.23 08:46 Сейчас в теме
(30) , если вы насчет того, что <Объект не найден> отображается на буржуйском, то это мелочи т.к. 99% пользователей 1С всегда используют русский.
32. dandykry 10 15.06.23 09:44 Сейчас в теме
(31) Полагаю вы выбираете из "Надежно" и "Быстро написать код" второе.

Если лень писать, используйте БСП, ОбщегоНазначения.СсылкаСуществует()
33. hakerxp 3017 15.06.23 09:50 Сейчас в теме
(32) , не всегда код БСП работает быстро, даже не так - часто он работает не быстро. А так же ему свойственно меняться, что приводит к переработке всего, что использовало данный код. Поэтому предпочитаю все делать свое - всегда есть уверенность, что будет работать, даже если конфа не на БСП)
34. dandykry 10 15.06.23 11:10 Сейчас в теме
(33) Программный интерфейс (область в модуле) не должен меняться, либо очень очень редко с сохранением обратной совместимости некоторое время. Все же ваше мнение я уважаю)
35. hakerxp 3017 15.06.23 13:00 Сейчас в теме
(34) , я тоже так думал, но практика показывает, что меняются и названия и расположение. Да и вам спасибо за еще один вариант проверки, приму к сведению.
dandykry; +1 Ответить
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот