Имя: Пароль:
1C
1С v8
Уникальный идентификатор
0 KonstantinK90
 
16.11.16
16:32
Всем привет! Помогите разобраться как сделать
создаю номенклатуру заполняю нужные реквизиты далее записываю! но вопрос как сделать что бы этой созданной номенклатуре присвоить свой идентификатор! Дело в том что я загружаю XML файлик с номенклатурой к себе в базу и моей созданной номенклатуре нужно присваивать идентификатор из XML.Подскажите как присвоить идентификатор!
1 KonstantinK90
 
16.11.16
16:33
идентификатор из xml имеет тип строка
2 d546
 
16.11.16
16:35
УникальныйИдентификатор.Из строки (UUID.From line)
УникальныйИдентификатор (UUID)
Из строки
Синтаксис:

Новый УникальныйИдентификатор(<Строка>)
Параметры:

<Строка> (обязательный)

Тип: Строка.
Строка GUID. Строка задается в виде "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX", где Х - символы обозначающие шестнадцатеричное число.
Описание:

Создает уникальный идентификатор из указанной строки GUID. Уникальность полученного таким образом идентификатора определяется уникальностью строки и поэтому не гарантирована.
Пример:

СтрокаGUID = "a763cfbb-f94f-4c67-8e13-0e96a3a7f353";
НовыйGUID = Новый УникальныйИдентификатор(СтрокаGUID);
3 timurhv
 
16.11.16
16:35
4 polosov
 
16.11.16
16:35
(0) Доп. реквизит? Отдельный реквизит?
5 DTX 4th
 
16.11.16
16:35
+
Прикладные объекты/Справочники/СправочникОбъект.<Имя справочника>/Методы/УстановитьСсылкуНового
6 NafBF
 
16.11.16
16:36
СправочникМенеджер.<Имя справочника>.ПолучитьСсылку (CatalogManager.<Имя справочника>.GetRef)
СправочникМенеджер.<Имя справочника> (CatalogManager.<Имя справочника>)
ПолучитьСсылку (GetRef)
Синтаксис:

ПолучитьСсылку(<УникальныйИдентификатор>)
Параметры:

<УникальныйИдентификатор> (необязательный)

Тип: УникальныйИдентификатор.
Уникальный идентификатор, из которого будет формироваться ссылка.
Возвращаемое значение:

Тип: СправочникСсылка.<Имя справочника>.

Описание:

Формирует ссылку из значения типа УникальныйИдентификатор.
Данный уникальный идентификатор может быть в дальнейшем получен из ссылки методом УникальныйИдентификатор.

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

Сервер, толстый клиент, внешнее соединение, мобильное приложение(сервер).
Примечание:

Если параметр не указан, то будет сформирована новая уникальная ссылка.
См. также:

СправочникСсылка.<Имя справочника>, метод УникальныйИдентификатор

--------------------------------------------------------------------------------

     Методическая информация
7 KonstantinK90
 
16.11.16
16:42
интересно у меня в xml файле идентификатор к примеру такого вида "a763cfbbf94f4c678e130e96a3a7f353" без дефиса! Получается дефис обязан присутствовать в идентификаторе!???
8 polosov
 
16.11.16
16:46
(7) Зачем тебе корежить внутренний УИД? Сделай отдельный реквизит и грузи туда свои УИДы.
9 Skylark
 
16.11.16
17:09
(7) ""a763cfbbf94f4c678e130e96a3a7f353" без дефиса" это не УИД а идентификатор. Добавляй реквизит "Идентификатор" и синхронизируй по нему.
10 KonstantinK90
 
16.11.16
17:12
"a763cfbbf94f4c678e130e96a3a7f353" без дефиса" это не УИД а идентификатор------- а УИД чем отличается от идентификатора????
11 Skylark
 
16.11.16
17:16
(10) Идентификатор это любое поле принимаемое в качестве ключа. А УИД это тип.
12 Skylark
 
16.11.16
17:17
И получить переменную с типом УИД можно конструктором на основании строки. Но для этого строка должна иметь определенный вид, т.е. "с дефисами".
13 Skylark
 
16.11.16
17:19
УИД = Новый УникальныйИдентификатор("a763cfbb-f94f-4c67-8e13-0e96a3a7f353");
Ссылка = Справочники.Номенклатура.ПолучитьСсылку(УИД);
14 KonstantinK90
 
16.11.16
17:21
блин чет я тогда запутался а как тогда мне моей новой номенклатуре( которую я создаю присвоить свой идентификатор без пробела полученный из xml a763cfbbf94f4c678e130e96a3a7f353)
15 1c_July
 
16.11.16
17:22
Я так примерно делала:

УнИд = новый УникальныйИдентификатор(ГуидИзXML);

ссылкапоИд=Справочники.МестаХранения.ПолучитьСсылку(УнИд);
                    Если ссылкапоИд.ПолучитьОбъект() = неопределено Тогда
                        //объекта с таким ид-ром нет, надо создать
новЭл = Справочники.МестаХранения.СоздатьЭлемент();
                    новЭл.УстановитьСсылкуНового(ссылкапоИд);
//тут установка реквизитов по значениям из файла xml
//...
                    попытка
                        новЭл.Записать();
                    Исключение
                        сообщить("Не удалось создать элемент по ссылке:"+символы.ПС+Описаниеошибки());
                    КонецПопытки;
                    сообщить("Записан новый элемент, код "+новЭл.код);

                        
                    Иначе
            //создавать не надо, такой уже есть            СуществующийОбъектСсылка = XMLЗначение(Тип("СправочникСсылка.МестаХранения"),ГуидИзXML);
                    КонецЕсли;
16 1c_July
 
16.11.16
17:26
+15, извините за некрасивый код, давно не писала сюда, забыла как красиво оформить
и могут быть ошибки, т.к. надергала немного из разных мест, чтобы идею показать

Делала так, чтобы перенести из одной базы в другую созданные новые объекты, базы почти идентичные, но пару полей добавлено, из-за чего универсальной выгрузкой-загрузкой не перенести. И при этом нужно именно ссылки чтобы точно были перенесены - для возможности некоторых сверок со второй базой.
17 KonstantinK90
 
16.11.16
17:26
о спасибо за помощь завтра по пробую! если что отпишусь!
18 Skylark
 
16.11.16
17:28
(17) УнИд = новый УникальныйИдентификатор(ГуидИзXML);
Вот здесь у тебя сразу же будет ошибка, если параметр как у тебя без дефисов.
19 KonstantinK90
 
16.11.16
17:29
вот вот я как раз хотел написать про это
20 KonstantinK90
 
16.11.16
17:29
xnj vyt ltkfnm&
21 youalex
 
16.11.16
17:29
(14) представление типа a763cfbbf94f4c678e130e96a3a7f353
соотносится с представлением типа
a763cfbb-f94f-4c67-8e13-0e96a3a7f353

т.е. блоки a763cfbb, f94f и т.д. - находятся на определенных позициях в представлении без дефисов

можно визуально эти позиции найти, взяв любую ссылку, и получить ее уид (Строка(Ссылка.УникальныйИдентификатор()) и внутр. представление : ЗначениеВСтрокуВнутр(Ссылка)
22 KonstantinK90
 
16.11.16
17:30
ой вот вот я как раз хотел на писать про этот момент
23 1c_July
 
16.11.16
17:30
Может быть убого получилось, но ничего лучше не придумала, когда обнаружила, что при подключении через COM ко второй базе никак не могу в результате запроса ссылку получить, чтобы сопоставлять сразу с объектами первой базы. Сравнение по кодам, наименованиям и проч. - не подходило, т.к. наплодили дубликатов в справочнике, бардачок-с.

И, кстати, хотела спросить уже в новой ветке, но может быть тут кто-то увидит и ответит - и правда никак нельзя выбирая запросом ссылки во второй базе получить их как при обмене через xml (то, что получается  через чтение-запись XMLЗначение)?
24 youalex
 
16.11.16
17:30
(21) + по сути это всё -  представления типа binary (как оно в базе лежит)
25 KonstantinK90
 
16.11.16
17:32
вот про этот момент можно по подробнее?
26 KonstantinK90
 
16.11.16
17:33
как мне вот эту строку a763cfbbf94f4c678e130e96a3a7f353 (из xml) перевести вот в такой формат a763cfbb-f94f-4c67-8e13-0e96a3a7f353
27 1c_July
 
16.11.16
17:34
(18) в моем примере ГуидИзXML - это то, что было записано в файл как:
Файл.ЗаписатьАтрибут("ЯчейкаСсылка",XMLСтрока(стр.ЯчейкаСсылка));
и потом прочитано через  ЧтениеXML.ПрочитатьАтрибут() ...  ЧтениеXML.Значение

Т.е. то, что при использовании XMLЗначение(Тип("СправочникСсылка.МестаХранения"),ГуидИзXML)  
дает сразу ссылку на объект в 1с, если он есть, или же пишет "Объект не найден"

Извините, пишу в спешке
28 Skylark
 
16.11.16
17:34
(23) Через СОМ когда обращаешься:

СтрУИД = XMLСтрока(СОМ.Ссылка.УникальныйИдентификатор());

получишь строку вида a763cfbb-f94f-4c67-8e13-0e96a3a7f353

и по ней уже в базе-приемнике можешь создать УИД и по нему искать ссылки

УИД = Новый УникальныйИдентификатор(СтрУИД );
Ссылка = Справочники.Номенклатура.ПолучитьСсылку(УИД);
29 Mauser
 
16.11.16
17:35
Интересно, а вот название секции "Убийцы 1С" - оно к программам относится, или к программистам?
30 youalex
 
16.11.16
17:36
(26) ну смотри внимательно:
у тебя здесь похоже, просто дефисы убраны накой-то.
Добавь дефисы по формату гуида
31 Skylark
 
16.11.16
17:37
(29) Я в шоке, как люди с таким стажем в таких вещах не рубят от слова вообще.
32 Skylark
 
16.11.16
17:38
(26) Ты про функции работы со строками знаешь? ЛЕВ, ПРАВ, СРЕД - вот это вот всё...
33 KonstantinK90
 
16.11.16
17:39
да знаю
34 KonstantinK90
 
16.11.16
17:40
ну ладно спасибо завтра по пробую если что отпишусь
35 trdm
 
16.11.16
17:46
А секция "Убийцы 1С" поставлена с целью намека на то, что кривые руки сами подорвут престиж 1С-а? :)
36 1c_July
 
17.11.16
14:12
(28) Посмотрела еще раз под отладкой обработку запроса.
Смотрите, подключение ко второй базе, в нем выполняется запрос, одно из полей - ссылка по справочнику номенклатуры.
При обходе результата запроса отладка показывает, что текстр.СсылкаНоменклатура - это COMОбъект, текстр.СсылкаНоменклатура.УникальныйИденификатор() - тоже COMОбъект, и, соответственно XMLСтрока от всего этого дает ошибку. Ни одно из свойств COMОбъекта не похоже на возможность связи с ун.ид-ром.
(Т.е. используется Запрос = Соединение.NewObject("Запрос");)

Единственное, может нужно было полностью процедуру во второй базе сделать, возвращающую нужные данные с уже преобразованными в строки ссылками и при подключении ее вызывать, а не создавать запрос. Вы это имели в виду?
37 Garykom
 
гуру
17.11.16
14:14
будет особенно интересно когда полученные из XML "уникальные идентификаторы" - уникальны только в пределах файла/выгрузки ))
38 1c_July
 
17.11.16
14:31
(37) в моем случае - (выгруженные как XMLСтрока ссылки и загруженные через XMLЗначение) - точно такого не было.
Специально проверяла на тот случай, если из-за сбоя не все с первого раза загрузится, чтобы при повторной попытке не дублировалось. Ну и в противном случае не вышло бы сопоставление с уже существующими записями в справочнике. Т.е. по одному и тому же гуиду всегда четко получается один и тот же идентификатор и соответственно по нему - ссылка. Но это при заранее известном типе объекта, по которому получаем идентификатор. Ну и оговорюсь опять же, а то сбивчиво как-то вчера писала - вторая база у меня копия первой + несколько новых записей, которые требовалось перетащить (соответственно я полагаюсь на то, что ссылки старых записей одинаковые), может у автора совсем другая цель этих преобразований.
39 1c_July
 
17.11.16
14:53
(38) Но это при заранее известном типе объекта, по которому получаем идентификатор.

Тут, конечно, имеется в виду при известном типе объекта, ссылку на который "вычисляем" по идентификатору
40 1c_July
 
17.11.16
15:01
(26) а насчет дефисов (только вот нашлось время вникнуть в написанное об этом в ветке) что хотела спросить - а откуда Вы эту строку без дефисов взяли? Не из представления ли битой ссылки, наподобие такого:
<Объект не найден> (114:80f40cc47a4f042511e69b40d4d7ea66)
?

Если да, то правильно тут писали - это совсем не тоже что гуид, по которому можно получить идентификатор и насильно присвоить новому создаваемому объекту через метод УстановитьСсылкуНового.
Т.е. наверное по этой строке ид-р сгенерить-то можно, но в итоге точно такой же ссылки у нового объекта не получится.

Я тоже сначала, увидев такие битые ссылки при подтягивании информации из второй базы, подумала, что нужно как-то по вот по этому коду, который после двоеточия, создавать объекты. Но затем увидела, что сохраненный в файле гуид (там он как раз с дефисами), который при загрузке преобразуется в такую битую ссылку из-за отсутствия объекта - отличается не только дефисами, там вообще цифры другие. Т.е. один из другого подстановкой/убиранием дефисов не получить.
А как по вот именно этим цифрам из визуального представления битой ссылки получить уд.идентификатор как объект, чтобы подставить в создаваемый элемент справочника, чтобы получилась такая же ссылка - вот это не знаю..
Если это в принципе возможно, тоже с интересом почитаю.

(фух, что не пишу, все время "дом, который построил Джек" выходит :) )
41 1c_July
 
17.11.16
15:12
(40)+ ну если это не так, стоит задуматься над самыми первыми ответами в теме - действительно ли это то, из чего надо получить именно ун.идентификтор как специальный объект 1с и привязывать к нему создаваемую запись. Или все же это некий доп. идентификатор (для обмена или еще чего), который надо именно отдельным полем держать (как есть в виде этой строки из файла).
42 1c_July
 
17.11.16
15:30
(21)  youalex, наверное глупый вопрос, но может поясните - если у автора не то, что я нафантазировала в (40), а действительно как-то сохранены гуиды без дефисов, то, если сделать, как Вы написали:
"можно визуально эти позиции найти, взяв любую ссылку, и получить ее уид (Строка(Ссылка.УникальныйИдентификатор()) и внутр. представление : ЗначениеВСтрокуВнутр(Ссылка)"

позиции дефисов гарантировано будут одинаковые? по любой ссылке любого объекта, или только в пределах определенного типа объектов (справочника номенклатуры в данном случае)?

это имеет объяснение или какую-то мат.часть нужно почитать?
43 1c_July
 
17.11.16
15:50
(42) блин, и правда глупый вопрос :) Как-то не приходилось задумываться, что разделение дефисами всегда одинаковое, если есть
44 Garykom
 
гуру
17.11.16
15:54
45 EvgeniuXP
 
17.11.16
16:04
(32) для новичков самое то - заодно в конфигураторе посидят чуть подольше
46 Skylark
 
17.11.16
16:04
(36) XMLСтрока 100% работает - позволяет получить УИД в виде строки через СОМ.

Если так ошибка

СтрУИД = XMLСтрока(СОМ.Ссылка.УникальныйИдентификатор());

то попробуй

СтрУИД = СОМ.XMLСтрока(Ссылка.УникальныйИдентификатор());
47 1c_July
 
17.11.16
16:04
(44) спасибо. мда, читалось когда-то, но вылетело совсем из головы, уникальный да и ладно :)
48 Skylark
 
17.11.16
16:05
СтрУИД = Соедиение.XMLСтрока(Соединение.Ссылка.УникальныйИдентификатор());
49 Skylark
 
17.11.16
16:05
ну в общем XMLСтрока применить "там" а не "здесь"
50 1c_July
 
17.11.16
16:42
(49) йоу, получилось :)
и так:
соединение.XMLСтрока(соединение.справочники.склады.найтипокоду("О00000024"))
и так:
соединение.XMLСтрока(текстр.ссылкаНоменклатура)
(здесь текстр из таблички-результата запроса)

В обоих случаях то, что в аргументе - COMОбъект, а вызванная XMLСтрока через соединение нормально его "глотает" и возвращает строку-гуид.
Для себя усвоила, что если надо что-то получить от COMОбъекта, полученного из соединения, надо и методы соответствующие вызывать "у соединения".
Только все же, поскольку мы не имеем ссылки как таковой (она имеет смысл только в контексте текущей базы), функцию УникальныйИдентификатор() использовать не получится, его можно потом уже в текущей базе по гуид создать, и по нему уже искать в ней ссылку.

Спасибо!
51 Вафель
 
17.11.16
16:47
Можно и
соединение.String()
52 1c_July
 
17.11.16
16:53
(51) вот видела это в справке (единственное что там есть, кроме NewObject), но как-то без примера не дошло сразу как использовать.
Где-то читала бегло, что даже кусок кода можно написать и его в соединении выполнить (в смысле не каждый оператор через соединение), но вникать времени не было.
53 Skylark
 
17.11.16
17:06
(50)
>
Только все же, поскольку мы не имеем ссылки как таковой (она имеет смысл только в контексте текущей базы), функцию УникальныйИдентификатор() использовать не получится, его можно потом уже в текущей базе по гуид создать, и по нему уже искать в ней ссылку.

Этот вот пассаж я не понял.
Когда мы в базе-приемнике получили СтрУИД из базы источника в виде строки мы можем:

УИД = Новый УникальныйИдентификатор(СтрУИД);
Ссылка = Справочники.Номенклатура.ПолучитьСсылку(УИД);
Если ОбщегоНазначения.СсылкаСущестует(Ссылка) Тогда
  НоменклатураОбъект = Ссылка.ПолучитьОбъект();
Иначе
  НоменклатураОбъект = Справочники.Номенклатура.СоздатьЭлемент();
  НоменклатураОбъект.УстановитьСсылкуНового(Ссылка);
КонецЕсли;
54 Skylark
 
17.11.16
17:09
И обратно как-то вроде этого:

СомСсылка = Соединение.Справочники.Номенклатура.ПолучитьСсылку(NewObject("УникальныйИдентификатор", СтрУИД));
55 1c_July
 
17.11.16
17:32
(53) да, все так, а пассаж вкратце о том, что функцией УникальныйИдентификатор() как в (48) (просто через точку от ссылки) не воспользоваться, а надо делать именно как Вы написали в (53)
AdBlock убивает бесплатный контент. 1Сергей