Имя: Пароль:
1C
1С v8
УникальныйИдентификатор
0 Alien74
 
21.03.14
12:08
Здравствуйте! Пишу свой обмен между Бухгалтерией 3.0 и самописной конфигой. Через выгрузку\загрузку XML документа. При загрузке данных из xml создаю новый элемент справочника контрагентов

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

При установке ссылки нового не присваивается нужная ссылка. При записи контрагента берётся какая то левая ссылка и присваевается ему. Каждый раз разная. Моя не присваивается.
Причины этого не могу понять. Делал однотипный обмен между другими конфигами - примерно тот же код работает как нужно - присваивается именно та ссылка, которую создали на основании УИ. Помогите...
1 Alien74
 
21.03.14
12:10
Платформа 8.3
2 Godofsin
 
21.03.14
12:12
КД2 не предлагать?
3 kiruha
 
21.03.14
12:14
СсылкаНаОбъект =Новый (Тип("СправочникСсылка.Контрагенты"))(УИ )
4 Alien74
 
21.03.14
12:18
КД2 отличная штука, но нет... Хочется написать свою выгрузку, а не корячится с изменением правил обмена с КД
5 dj_serega
 
21.03.14
12:21
(4) Давно такого не читал.
Чего тогда не через ole?
6 Alien74
 
21.03.14
12:25
(5) Ну это делается в том числе ради обучения, и полного понимания работы выгрузки\загрузки данных вручную. Не нападайте уж так :)
7 Alien74
 
21.03.14
12:30
(3) По вашему коду создаётся новый справочник. Но мне необходимо ещё и установить этому справочнику ссылку по УИ.
Или я не так понял код... что значит в конце строки "(УИ)" ?
8 kiruha
 
21.03.14
12:31
УИ = Новый УникальныйИдентификатор(Чтение.Значение);
9 kiruha
 
21.03.14
12:47
Пардон, скобки не правильно поствил

Еще  можно сразу объект на основании УИ создавать :
СсылкаНаОбъект =Новый (Тип("СправочникОбъект.Контрагенты"),УИ );
10 mrDSide
 
21.03.14
13:25
(4) как ты собираешься "корячится" с правилами обмена из типовой конфигурации в самописную (здесь предполагается, что работает в относительно небольшом локальном регионе: организация, холдинг), если их по определению не может существовать?
Только конвертация данных, бери и пиши свои правила.
(5)+=)
11 Alien74
 
21.03.14
13:30
(10) Я написал уже обмен, который бы взлетел, если бы не Сабж. Если ничего не удастся сделать, то буду пробовать КД.
12 Alien74
 
21.03.14
13:56
(9)Дело в том, что не всегда нужно создавать новый элемент справочника. Если такой уже есть, то необходимо изменить реквизиты в нём. Именно поэтому ищется ссылка по переданному УИ, там дальше по коду проверяется существует ли такой или нет (этот код я не вставил сюда), и далее уже смотрим. Но тем не менее и ваша строка не работает, почему то ссылка остаётся пустой и создаётся новый элемент справочника, после записи которого, естесственно задаётся новая ссылка с другим рандомным УИ.
Есть подозрение что
Контрагент.УстановитьСсылкуНового(СсылкаНаОбъект);
не работает как нужно. Мб косяк платформы. Сейчас посмотрю в других модулях правильно ли работает эта функция.
13 kiruha
 
21.03.14
13:57
(12)
У меня тоже не заработало.
Где то подвох
14 Alien74
 
21.03.14
14:07
Разберу пример, который я уже делал в с другими конфигурациями. Загрузка из УПП в самописную конфигурацию мобильного приложения.
Читается из XML и создаётся элемент справочника СпецификацииНоменклатуры:
-----------
Чтение.Прочитать();
УИ = Новый УникальныйИдентификатор(Чтение.Значение);
СсылкаНаОбъект = Справочники[ИмяСправочника].ПолучитьСсылку(УИ);
Справочник = Справочники[ИмяСправочника].СоздатьЭлемент();
Справочник.УстановитьСсылкуНового(СсылкаНаОбъект);
Справочник.Записать();
-----------

Далее в коде читается XML и создаётся Документ.Предъвка в котором есть реквизит СправочникСсылка.СпецификацииНоменклатуры:

-----------
ИначеЕсли Чтение.Имя = "Спецификация" И Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента  Тогда
ИмяРеквизита = Чтение.Имя;
Чтение.Прочитать();
УИ = Новый УникальныйИдентификатор(Чтение.Значение);
Док[ИмяРеквизита] = Справочники.СпецификацииНоменклатуры.ПолучитьСсылку(УИ).Ссылка;
------------

Чудо, но в созданном документе вставляется в реквизит Спецификация ссылка на Справочник.СпецификацияНоменклатуры правильно. Тоесть ссылка по УИ генерируется верно и не рандомно.
15 Alien74
 
21.03.14
14:10
Имею ввиду, что примерно такой же код абсолютно верно работает в другой конфиге...
16 Alien74
 
21.03.14
14:13
Если далее написать Справочник.Ссылка.УникальныйИдентификатор(), то результатом будет именно тот УИ, который передавался XMLькой. Чего не происходит в Бухгалтерии 3.0
17 Alien74
 
21.03.14
14:21
(13)kiruha, вам отдельное спасибо за уделённое внимание теме :)
18 Alien74
 
24.03.14
07:50
Вообщем не нашёл я откуда ноги растут... Сделал всё по привязке к кодам справочников. Не дай им Боже изменить их...
19 Aleksey
 
24.03.14
07:56
(12) Это не косяк платформы, а косяк  головах разработчиков типовых

(18) не торопись
Косяк в том что при записи программе плевать на твой гуид, она для новых элементов принудительно вставляет свой. Для чего так 1С сделала во всех типовых я не знаю, но по факту все на эти грабли наступают :)


Для обхода это безобразия нужно вставить строку

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

И тогда программа оставить гуид который ты присвоил, будет считать что контрагент пришел с обменом из другой базы
20 Alien74
 
24.03.14
09:36
(19)Aleksey, спасибо! Уже правда переделал всё по коду... Всё работает. Но в следующий раз сделаю как вы написали. Или если пойдут косяки в этой конфиге.
21 13_Mult
 
24.03.14
10:20
(19)+1 ещё ГУИД мона поменять после записи нового.
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс