Имя: Пароль:
1C
1С v8
Конвертация: подмена уникального идентификатора
0 Pro_1c_podcast
 
22.10.13
13:13
Друзья, всем привет. Если я не нашел уже существующую ветку по данному вопросу, прошу прощения и заранее благодарен за ссылку.

Ситуация следующая: в конвертации данных при загрузке при поиске объекта  по УИДу нужно подменить УИД идентификатора. Кто-то сталкивался с таким? Как решали?
1 Pro_1c_podcast
 
22.10.13
13:15
*не идентификатора, а источника.
2 kosts
 
22.10.13
13:15
(0) А новый идентификатор в какой базе становиться известен в источнике или в приемнике?
3 Pro_1c_podcast
 
22.10.13
13:16
(2) в источнике уже все информация есть.
4 NcSteel
 
22.10.13
13:19
5 Aleksey
 
22.10.13
13:20
Бред какой то, что значит менять УИД?

Т.е. был уид  22345200-abe8-4f60-90c8-0d43c5f6c0f6, по какому правилу он должен поменяться?
6 Pro_1c_podcast
 
22.10.13
13:23
(5) Нет, в источнике УИД менять не нужно. Но нужно в приемник передать другой УИД,  отличный от источника.

(4) Спасибо. Судя по той ветке, простого решения нет.
7 echo77
 
22.10.13
13:35
Другой - это какой другой? У вас в источнике есть другой?
Обмен V8 => V8 ?
8 Aleksey
 
22.10.13
13:39
(6) да пофиг, откуда "другой" возъмётся?

А по сабжу, юзай поля поиска, в  них сила
9 Pro_1c_podcast
 
22.10.13
13:41
(7), (8) В источнике есть поле УИДПриемника. Там содержится УИД, который должен передаваться в приемник и устанавливаться в качестве уникального идентификатора для создаваемого объекта.
Не очень понимаю, как поля поиска помогут мне создать новый объект по этой ссылке, а при повторной выгрузке найти объект.
10 Aleksey
 
22.10.13
13:50
(9) легко и непренуждено
1. передавай значение в качестве параметра или в качестве поля комментарий
2. В полях поисках вручную ищи свой объект, и если не нашел сам создавай нужный с нужным УИД
3. ...
4. Profit!!!
11 Pro_1c_podcast
 
22.10.13
13:56
(10) Должно прокатить. По результатам отпишусь.
12 Pro_1c_podcast
 
22.10.13
17:23
Кажется, получилось.

Логика такая:
1. В параметр передаем УИД. Ставим ему флаг Поиск. Больше поиска нигде не стоит - по логике моей задачи синхрониззация только по УИД
2. При поиске

СтрокаУИД = ПараметрыОбъекта["УИДПриемника"];

УИД = Новый УникальныйИдентификатор(СтрокаУИД);

ТекСсылка = Справочники.КонтДоговораСтрахования.ПолучитьСсылку(УИД);

Запрос = Новый Запрос("ВЫБРАТЬ
|    Справочник.Ссылка
|ИЗ
|    Справочник.Справочник КАК Справочник
|ГДЕ
|    Справочник.Ссылка = &Ссылка");
Запрос.УстановитьПараметр("Ссылка",ТекСсылка);                      
РезультатЗапроса = Запрос.Выполнить();
Если Не РезультатЗапроса.Пустой() Тогда
    
    СсылкаНаОбъект = ТекСсылка;
КонецЕсли;

3. При загрузке

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

    НОбъект = Справочники.Справочник.СоздатьЭлемент();
    НОбъект.УстановитьСсылкуНового(ТекСсылка);

    Объект = нОбъект;
КонецЕсли;
13 Aleksey
 
22.10.13
17:50
Нет не так
14 Pro_1c_podcast
 
22.10.13
17:51
(13) Ваше сообщение не полностью дошло. =) только "Нет не так".
15 Aleksey
 
22.10.13
17:53
(14) Да сначало подумал что можно проще, а потом вспомнил, что не получится

А по факту запрос лишний

СсылкаНаОбъект = Справочники.КонтДоговораСтрахования.ПолучитьСсылку(УИД);
16 Pro_1c_podcast
 
22.10.13
17:55
А как проверить что по ссылке я получил именно Элемент, а не новую ссылку?
17 Aleksey
 
22.10.13
17:55
Либо как вариант
СсылкаНаОбъект = Справочники.КонтДоговораСтрахования.ПолучитьСсылку(УИД);
СамОбъект = СсылкаНаОбъект.ПолучитьОбъект();
СамОбъект.ОбменДанными.Загрузка =Истина;
СамОбъект.Записать();

И тогда не надо при загрузки ичего искать
18 Aleksey
 
22.10.13
17:57
(16) а тебе не пофиг?

СсылкаНаОбъект - ссылка на результирующий объект. Если в обработчике установить данную ссылку (не пустую) то программа ее запомнит и поиск на этом будет считать успешно завершенным

Получается что он будет считать что объект не найден, если он ничего не нашел. Ну а далее твой код
Если Не ОбъектНайден Тогда
19 Pro_1c_podcast
 
22.10.13
18:01
(18) Ну с одной стороны согласен. Но все же мне больше нравится проверку делать и ПриЗагрузке создавать. Не люблю записывать документ а) пустой б) два раза
Сам запрос кстати из обработки обмена и выдрал.
20 Aleksey
 
22.10.13
18:30
(16)
СправочникСсылка.<Имя справочника> (CatalogRef.<Имя справочника>)
Пустая (IsEmpty)
Синтаксис:

Пустая()
Возвращаемое значение:

Тип: Булево.
Истина - ссылка не указывает ни на какой объект (пустая ссылка); Ложь - в противном случае.
Описание:

Определяет, является ли ссылка пустой или нет.

Доступность:

Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение(сервер).

СтрокаУИД = ПараметрыОбъекта["УИДПриемника"];

УИД = Новый УникальныйИдентификатор(СтрокаУИД);

ТекСсылка = Справочники.КонтДоговораСтрахования.ПолучитьСсылку(УИД);
Если не ТекСсылка.Пустая() тогда
СсылкаНаОбъект = ТекСсылка;
КонецЕсли;
21 Pro_1c_podcast
 
23.10.13
14:25
(20) Хороший вариант. Только он не работает. Если создавать объект с помощью УИД:

УИД = Новый УникальныйИдентификатор(СтрокаУИД);
    
ТекСсылка = Документы.КонтСтраховойПолис.ПолучитьСсылку(УИД);

То метод Пустая() возвращает ЛОЖЬ