Имя: Пароль:
1C
 
Обмен данными через OLE по средствам GIUD
0 bazifal
 
06.11.08
16:14
Приветсвую, Вас, коллеги!

Такой вопрос:
Я хочу настроить обмен между 2 торговлями на 8.1. Причем перегрузка ведется в одностороннем порядке. При создании

новых элементов справочников в базе приемнике я беру уникальные идентификаторы ссылок в базе источнике и присваиваю

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

guid'ы.


код примерно такой:

//v8 - соеденение с базой источником

стрУИ = V8.String(V8.Справочники.Номенклатура.Ссылка.УникальныйИдентификатор());

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

НовЭлемент.УстановитьСсылкуНового(НоваяСсылка);



Проблема в следующем:

   Например стрУИ = "aed6dbea-5fb2-11dc-a529-aadb14561398"
   
   тогда Справочники.Номенклатура.ПолучитьСсылку(Новый УникальныйИдентификатор(стрУИ))
   возращает следующее: a529aadb-1456-1398-11dc-5fb2aed6dbea, то есть абсолютно другой идентификатор!!!!
   В чем причина, и как можно решить эту проблему???
1 ТелепатБот
 
гуру
06.11.08
16:14
2 vde69
 
06.11.08
16:15
не советую!

или пользуйся планом обмена (там по гуидам) или отделные поля юзай
3 skunk
 
06.11.08
16:15
Значение не может равняться ссылке какого-либо из имеющихся в базе данных объекта данного типа
4 bazifal
 
06.11.08
16:16
vde69:
 да дело в том, что нужен фильтрованный обмен :))
5 bazifal
 
06.11.08
16:17
нет, я зашружаю в абсолютно чистую базу, и приполученни ссылки по заданному идентификатору результат необъясним... :)
6 vde69
 
06.11.08
16:18
(4) а кто мешает фильровать при обмене по плану?

там делов 10 строк в общем и по 1 строке в каждом обьекте
7 bazifal
 
06.11.08
16:19
vde69: а где можно мануалы почитать по плану обмена??
8 vde69
 
06.11.08
16:23
9 bazifal
 
06.11.08
16:29
vde69:
     Спасибо! Но, к сожалению это не подойдет. Базы никак не должны соотноситься... :))
10 bazifal
 
06.11.08
16:34
А возможен такой вариант, что если такая операция производилась уже (а она производилась в действительности, и все работало нормально, но абсолютно в другой базе - в бухгалтерии, а не в текущей базе), то информация переброске гуида где то еще сохраняется??? где можно вообще посмотреть это?
11 vde69
 
06.11.08
16:35
(9) все пойдет, просто в примере самый простейший случай...
12 skunk
 
06.11.08
16:35
Процедура КнопкаВыполнитьНажатие(Кнопка)
   стрУИН = "a529aadb-1456-1398-11dc-5fb2aed6dbea";
   НоваяСсылка = Справочники.Номенклатура.ПолучитьСсылку(Новый УникальныйИдентификатор(стрУИН));
   НовЭлемент = Справочники.Номенклатура.СоздатьЭлемент();
   НовЭлемент.УстановитьСсылкуНового(НоваяСсылка);
   НовЭлемент.Записать();
   сообщить(НовЭлемент.Ссылка.УникальныйИдентификатор());
КонецПроцедуры


>>> a529aadb-1456-1398-11dc-5fb2aed6dbea
13 Rebelx
 
06.11.08
16:41
(0) на самом деле, это один идентификатор, только представление разное - цифры местами поменяны.
скорее всего собака порылась в V8.String
получай ссылки по другому, например XMLСтрока / XMLЗначение
14 bazifal
 
06.11.08
16:53
skunk:
    нет, с V8.String нет проблем - он выдает все верно. Проблема в том, что я в параметр ПолучитьСсылку() задаю КОНКРЕТНЫЙ giud, а вот дает данная функцию абсолютно другой guid. причем база чистая!!!!
15 bazifal
 
06.11.08
16:54
Rebelx - ну понятно, что блоки его одинаковы, но идентификатор на то и индентификатор :))
16 Rebelx
 
06.11.08
16:56
что выдает
Справочники.Номенклатура.ПолучитьСсылку(Новый УникальныйИдентификатор(стрУИ)).УникальныйИдентификатор()
?
17 bazifal
 
06.11.08
16:58
я просто прихожу к выводу, что это глюк самой 1С. объяснение этому я не могу дать... а под данную технологию уже написана солидная обработка... как то не хочется искать элементы по их кодам и наименованиям :)))
18 Rebelx
 
06.11.08
16:59
это глюк в ДНК. все должно работать
19 bazifal
 
06.11.08
17:00
Rebelx:
   я в отладчике смотрю... это сути не меняет :))

например:

Справочники.Номенклатура.ПолучитьСсылку("aed6dbea-5fb2-11dc-a529-aadb14561398")

возвращает
      <Объект не найден> (46:a529aadb1456139811dc5fb2aed6dbea)
20 Rebelx
 
06.11.08
17:02
(19)меняет и очень сильно
21 Rebelx
 
06.11.08
17:03
представление идентификатора не совпадает с представлением ссылки
22 Rebelx
 
06.11.08
17:03
это нормально
23 bazifal
 
06.11.08
17:09
ааааа!!! да, действительно,
Справочники.Номенклатура.ПолучитьСсылку(Новый УникальныйИдентификатор(стрУИ)).УникальныйИдентификатор() возвращает то что нужно! а в чем загвоздка то??? просто в итоге все равно присваивается не тот идентификатор...
24 skunk
 
06.11.08
17:10
(23)как не тот ... попробуй код из (12)выполнить два раза...
25 bazifal
 
06.11.08
17:15
получается, что идентификатор тот, а ссылка на справочник номенклатуры не та... бред!!!
26 skunk
 
06.11.08
17:17
наверное я уже чего-то не понимаю
27 Immortal
 
06.11.08
17:32
ошибка здесь :
   НоваяСсылка = Справочники.Номенклатура.ПолучитьСсылку(Новый УникальныйИдентификатор(стрУИН));

нужно использовать метод ПолучитьСсылкуНового()
28 Rebelx
 
06.11.08
17:34
(27) глючишь
29 Immortal
 
06.11.08
17:34
не, чо то я прогнал, щас найду где это у меня
30 skunk
 
06.11.08
17:35
(27)хоть бы в СП глянул

Позволяет для нового (созданного и еще не записанного) объекта получить ранее установленное методом УстановитьСсылкуНового значение ссылки.
31 Immortal
 
06.11.08
17:39
(30) (29):D
32 KalachevDV
 
06.11.08
17:39
Попробуй вот так... У меня работает
UUID = COMОбъект.NewObject("УникальныйИдентификатор",Строка(Ссылка.УникальныйИдентификатор()));
НоваяСсылка = COMОбъект.Справочники[ИмяОбъекта].GetRef(UUID);
Объект = НоваяСсылка.ПолучитьОбъект();
Если Объект = Неопределено Тогда
Если Источник.ЭтоГруппа Тогда
   НовыйОбъект = COMОбъект.Справочники[ИмяОбъекта].СоздатьГруппу();
   Иначе
       НовыйОбъект = COMОбъект.Справочники[ИмяОбъекта].СоздатьЭлемент();
   КонецЕсли;
НовыйОбъект.УстановитьСсылкуНового(Ссылка);
КонецЕсли;
33 KalachevDV
 
06.11.08
17:40
(32) Сорри, выдрал из разных процедур... Так будет вернее :)
UUID = COMОбъект.NewObject("УникальныйИдентификатор",Строка(Ссылка.УникальныйИдентификатор()));
НоваяСсылка = COMОбъект.Справочники[ИмяОбъекта].GetRef(UUID);
Объект = НоваяСсылка.ПолучитьОбъект();
Если Объект = Неопределено Тогда
Если Ссылка.ЭтоГруппа Тогда
   НовыйОбъект = COMОбъект.Справочники[ИмяОбъекта].СоздатьГруппу();
   Иначе
       НовыйОбъект = COMОбъект.Справочники[ИмяОбъекта].СоздатьЭлемент();
   КонецЕсли;
НовыйОбъект.УстановитьСсылкуНового(Ссылка);
КонецЕсли;
34 KalachevDV
 
06.11.08
17:42
(33) млин... извините... тоже есть ошибки... но суть понятна :)
35 wPa
 
06.11.08
17:44
Все пройдет. Просто ты уже создал объект с таким ГУИД-ом - поэтому сгенерился новый. Это самый удобный вариант.
36 Immortal
 
06.11.08
18:00
(35) там контроль ?
37 Immortal
 
06.11.08
18:01
вообще я автору не рекомендовал бы это делать..
потому что можно наступить на грабли, связанные с обычным назначением ссылок.
38 wPa
 
06.11.08
18:05
(36) Конечно. ГУИД 1С - это ключевое поле в сиквеле (переставленны немного местами позиции).  Двух одинаковых не моэет быть - проверка на уровне платформы.
39 wPa
 
06.11.08
18:06
(37) Граблей не может быть, если выгружать в одном направлении.
40 Immortal
 
06.11.08
19:38
(38) ку! Перечитал (0), что то невнимателен я сегодня:(
41 Pashkaa
 
06.11.08
22:23
Помоему ты перемудрил, у меня 100% работает так

стрУИ = Строка(V8.String(V8.Справочники.Номенклатура.Ссылка);

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

//Попробуем получить объект, возможно случайно он уже создан в базе
нОбъект = НоваяСсылка.ПолучитьОбъект();

Если нОбъект = Неопределено Тогда
// Объекта в базе нет и необходимо установить ссылку на новый объект
   Объект.УстановитьСсылкуНового(НоваяСсылка);
иначе
// Объект в базе уже есть
   Объект = нОбъект;
КонецЕсли;


Обрати внимание на стрУИ = Строка(V8.String(V8.Справочники.Номенклатура.Ссылка);
Во-превых нет необходимости использовать функцию УникальныйИдентивикатор(), а во-вторых преобразуйка полученное значение в Строка(....)
42 bazifal
 
07.11.08
11:14
Да на то он и GUID :)) Компания Микрософт вроде гарантировала, что гуиды уникальны в масштабах вселенной :))
43 skunk
 
07.11.08
11:16
(42)первый раз от вас такое слышу?
44 bazifal
 
07.11.08
12:47
skunk - я просто уверен, что 1Ска использует стандартную виндовскую функцию
генерации гуидов :)
45 Immortal
 
07.11.08
12:48
(44) не всегда
46 bazifal
 
07.11.08
13:00
Immortal: Почему??
47 bazifal
 
07.11.08
13:32
(41) - проблема в том, что база абсолютно ЧИСТАЯ!!! в ней нет ни единого объекта! и в данном случае функция ПолучитьСсылку() работает не так, как хотелось бы... :)
48 Immortal
 
07.11.08
14:39
(46) вопрос к разработчикам..
но в ряде случаев 1с банально увеличивает гуид на 1.
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.