Как получить уникальный идентификатор элемента справочника 1с
8.1
Подключаюсь к другой базе и запросом получаю выборку справочника.
Пытаюсь получить значение уникального идентификатора, но Выборка.Ссылка.УникальныйИдентификатор() возвращает «COMОбъект».
Как можно получить гуид элемента через COM-соединение?
Экспортная функция в базе источнике, которая возвращает гуид
COMОбъект.String(Выборка.Ссылка.УникальныйИдентификатор())
УИ = Новый УникальныйИдентификатор(УдаленнаяБаза.String(Выборка.Ссылка.УникальныйИдентификатор()));
ЭлементЭтойБазы = Справочники.Контрагенты.ПолучитьСсылку(УИ);
(3)(4) Спасибо, работает!
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn
Как получить уникальный идентификатор элемента справочника 1с
Всем привет! Помогите разобраться как сделать
создаю номенклатуру заполняю нужные реквизиты далее записываю! но вопрос как сделать что бы этой созданной номенклатуре присвоить свой идентификатор! Дело в том что я загружаю XML файлик с номенклатурой к себе в базу и моей созданной номенклатуре нужно присваивать идентификатор из XML.Подскажите как присвоить идентификатор!
идентификатор из xml имеет тип строка
УникальныйИдентификатор.Из строки (UUID.From line)
УникальныйИдентификатор (UUID)
Из строки
Синтаксис:
Новый УникальныйИдентификатор()
Параметры:
Тип: Строка.
Строка GUID. Строка задается в виде «XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX», где Х — символы обозначающие шестнадцатеричное число.
Описание:
Создает уникальный идентификатор из указанной строки GUID. Уникальность полученного таким образом идентификатора определяется уникальностью строки и поэтому не гарантирована.
Пример:
СтрокаGUID = «a763cfbb-f94f-4c67-8e13-0e96a3a7f353»;
НовыйGUID = Новый УникальныйИдентификатор(СтрокаGUID);
(0) Доп. реквизит? Отдельный реквизит?
+
Прикладные объекты/Справочники/СправочникОбъект./Методы/УстановитьСсылкуНового
СправочникМенеджер.<Имя справочника>.ПолучитьСсылку (CatalogManager.<Имя справочника>.GetRef)
СправочникМенеджер. <Имя справочника>(CatalogManager.<Имя справочника>)
ПолучитьСсылку (GetRef)
Синтаксис:
Имя>
Тип: УникальныйИдентификатор.
Уникальный идентификатор, из которого будет формироваться ссылка.
Возвращаемое значение:
Формирует ссылку из значения типа УникальныйИдентификатор.
Данный уникальный идентификатор может быть в дальнейшем получен из ссылки методом УникальныйИдентификатор.
Сервер, толстый клиент, внешнее соединение, мобильное приложение(сервер).
Примечание:
Если параметр не указан, то будет сформирована новая уникальная ссылка.
См. также:
СправочникСсылка., метод УникальныйИдентификатор
интересно у меня в xml файле идентификатор к примеру такого вида «a763cfbbf94f4c678e130e96a3a7f353» без дефиса! Получается дефис обязан присутствовать в идентификаторе.
(7) Зачем тебе корежить внутренний УИД? Сделай отдельный реквизит и грузи туда свои УИДы.
(7) «»a763cfbbf94f4c678e130e96a3a7f353″ без дефиса» это не УИД а идентификатор. Добавляй реквизит «Идентификатор» и синхронизируй по нему.
«a763cfbbf94f4c678e130e96a3a7f353″ без дефиса» это не УИД а идентификатор——- а УИД чем отличается от идентификатора.
(10) Идентификатор это любое поле принимаемое в качестве ключа. А УИД это тип.
И получить переменную с типом УИД можно конструктором на основании строки. Но для этого строка должна иметь определенный вид, т.е. «с дефисами».
УИД = Новый УникальныйИдентификатор(«a763cfbb-f94f-4c67-8e13-0e96a3a7f353»);
Ссылка = Справочники.Номенклатура.ПолучитьСсылку(УИД);
блин чет я тогда запутался а как тогда мне моей новой номенклатуре( которую я создаю присвоить свой идентификатор без пробела полученный из xml a763cfbbf94f4c678e130e96a3a7f353)
Я так примерно делала:
УнИд = новый УникальныйИдентификатор(ГуидИзXML);
ссылкапоИд=Справочники.МестаХранения.ПолучитьСсылку(УнИд);
Если ссылкапоИд.ПолучитьОбъект() = неопределено Тогда
//объекта с таким ид-ром нет, надо создать
новЭл = Справочники.МестаХранения.СоздатьЭлемент();
новЭл.УстановитьСсылкуНового(ссылкапоИд);
//тут установка реквизитов по значениям из файла xml
//.
попытка
новЭл.Записать();
Исключение
сообщить(«Не удалось создать элемент по ссылке:»+символы.ПС+Описаниеошибки());
КонецПопытки;
сообщить(«Записан новый элемент, код «+новЭл.код);
Иначе
//создавать не надо, такой уже есть СуществующийОбъектСсылка = XMLЗначение(Тип(«СправочникСсылка.МестаХранения»),ГуидИзXML);
КонецЕсли;
+15, извините за некрасивый код, давно не писала сюда, забыла как красиво оформить
и могут быть ошибки, т.к. надергала немного из разных мест, чтобы идею показать
Делала так, чтобы перенести из одной базы в другую созданные новые объекты, базы почти идентичные, но пару полей добавлено, из-за чего универсальной выгрузкой-загрузкой не перенести. И при этом нужно именно ссылки чтобы точно были перенесены — для возможности некоторых сверок со второй базой.
о спасибо за помощь завтра по пробую! если что отпишусь!
(17) УнИд = новый УникальныйИдентификатор(ГуидИзXML);
Вот здесь у тебя сразу же будет ошибка, если параметр как у тебя без дефисов.
вот вот я как раз хотел написать про это
xnj vyt ltkfnm&
(14) представление типа a763cfbbf94f4c678e130e96a3a7f353
соотносится с представлением типа
a763cfbb-f94f-4c67-8e13-0e96a3a7f353
т.е. блоки a763cfbb, f94f и т.д. — находятся на определенных позициях в представлении без дефисов
можно визуально эти позиции найти, взяв любую ссылку, и получить ее уид (Строка(Ссылка.УникальныйИдентификатор()) и внутр. представление : ЗначениеВСтрокуВнутр(Ссылка)
ой вот вот я как раз хотел на писать про этот момент
Может быть убого получилось, но ничего лучше не придумала, когда обнаружила, что при подключении через COM ко второй базе никак не могу в результате запроса ссылку получить, чтобы сопоставлять сразу с объектами первой базы. Сравнение по кодам, наименованиям и проч. — не подходило, т.к. наплодили дубликатов в справочнике, бардачок-с.
И, кстати, хотела спросить уже в новой ветке, но может быть тут кто-то увидит и ответит — и правда никак нельзя выбирая запросом ссылки во второй базе получить их как при обмене через xml (то, что получается через чтение-запись XMLЗначение)?
(21) + по сути это всё — представления типа binary (как оно в базе лежит)
вот про этот момент можно по подробнее?
как мне вот эту строку a763cfbbf94f4c678e130e96a3a7f353 (из xml) перевести вот в такой формат a763cfbb-f94f-4c67-8e13-0e96a3a7f353
(18) в моем примере ГуидИзXML — это то, что было записано в файл как:
Файл.ЗаписатьАтрибут(«ЯчейкаСсылка»,XMLСтрока(стр.ЯчейкаСсылка));
и потом прочитано через ЧтениеXML.ПрочитатьАтрибут() . ЧтениеXML.Значение
Т.е. то, что при использовании XMLЗначение(Тип(«СправочникСсылка.МестаХранения»),ГуидИзXML)
дает сразу ссылку на объект в 1с, если он есть, или же пишет «Объект не найден»
Извините, пишу в спешке
(23) Через СОМ когда обращаешься:
получишь строку вида a763cfbb-f94f-4c67-8e13-0e96a3a7f353
и по ней уже в базе-приемнике можешь создать УИД и по нему искать ссылки
УИД = Новый УникальныйИдентификатор(СтрУИД );
Ссылка = Справочники.Номенклатура.ПолучитьСсылку(УИД);
Интересно, а вот название секции «Убийцы 1С» — оно к программам относится, или к программистам?
(26) ну смотри внимательно:
у тебя здесь похоже, просто дефисы убраны накой-то.
Добавь дефисы по формату гуида
(29) Я в шоке, как люди с таким стажем в таких вещах не рубят от слова вообще.
(26) Ты про функции работы со строками знаешь? ЛЕВ, ПРАВ, СРЕД — вот это вот всё.
ну ладно спасибо завтра по пробую если что отпишусь
А секция «Убийцы 1С» поставлена с целью намека на то, что кривые руки сами подорвут престиж 1С-а? 🙂
(28) Посмотрела еще раз под отладкой обработку запроса.
Смотрите, подключение ко второй базе, в нем выполняется запрос, одно из полей — ссылка по справочнику номенклатуры.
При обходе результата запроса отладка показывает, что текстр.СсылкаНоменклатура — это COMОбъект, текстр.СсылкаНоменклатура.УникальныйИденификатор() — тоже COMОбъект, и, соответственно XMLСтрока от всего этого дает ошибку. Ни одно из свойств COMОбъекта не похоже на возможность связи с ун.ид-ром.
(Т.е. используется Запрос = Соединение.NewObject(«Запрос»);)
Единственное, может нужно было полностью процедуру во второй базе сделать, возвращающую нужные данные с уже преобразованными в строки ссылками и при подключении ее вызывать, а не создавать запрос. Вы это имели в виду?
будет особенно интересно когда полученные из XML «уникальные идентификаторы» — уникальны только в пределах файла/выгрузки ))
(37) в моем случае — (выгруженные как XMLСтрока ссылки и загруженные через XMLЗначение) — точно такого не было.
Специально проверяла на тот случай, если из-за сбоя не все с первого раза загрузится, чтобы при повторной попытке не дублировалось. Ну и в противном случае не вышло бы сопоставление с уже существующими записями в справочнике. Т.е. по одному и тому же гуиду всегда четко получается один и тот же идентификатор и соответственно по нему — ссылка. Но это при заранее известном типе объекта, по которому получаем идентификатор. Ну и оговорюсь опять же, а то сбивчиво как-то вчера писала — вторая база у меня копия первой + несколько новых записей, которые требовалось перетащить (соответственно я полагаюсь на то, что ссылки старых записей одинаковые), может у автора совсем другая цель этих преобразований.
(38) Но это при заранее известном типе объекта, по которому получаем идентификатор.
Тут, конечно, имеется в виду при известном типе объекта, ссылку на который «вычисляем» по идентификатору
(26) а насчет дефисов (только вот нашлось время вникнуть в написанное об этом в ветке) что хотела спросить — а откуда Вы эту строку без дефисов взяли? Не из представления ли битой ссылки, наподобие такого:
(114:80f40cc47a4f042511e69b40d4d7ea66)
?
Если да, то правильно тут писали — это совсем не тоже что гуид, по которому можно получить идентификатор и насильно присвоить новому создаваемому объекту через метод УстановитьСсылкуНового.
Т.е. наверное по этой строке ид-р сгенерить-то можно, но в итоге точно такой же ссылки у нового объекта не получится.
Я тоже сначала, увидев такие битые ссылки при подтягивании информации из второй базы, подумала, что нужно как-то по вот по этому коду, который после двоеточия, создавать объекты. Но затем увидела, что сохраненный в файле гуид (там он как раз с дефисами), который при загрузке преобразуется в такую битую ссылку из-за отсутствия объекта — отличается не только дефисами, там вообще цифры другие. Т.е. один из другого подстановкой/убиранием дефисов не получить.
А как по вот именно этим цифрам из визуального представления битой ссылки получить уд.идентификатор как объект, чтобы подставить в создаваемый элемент справочника, чтобы получилась такая же ссылка — вот это не знаю..
Если это в принципе возможно, тоже с интересом почитаю.
(фух, что не пишу, все время «дом, который построил Джек» выходит 🙂 )
(40)+ ну если это не так, стоит задуматься над самыми первыми ответами в теме — действительно ли это то, из чего надо получить именно ун.идентификтор как специальный объект 1с и привязывать к нему создаваемую запись. Или все же это некий доп. идентификатор (для обмена или еще чего), который надо именно отдельным полем держать (как есть в виде этой строки из файла).
(21) youalex, наверное глупый вопрос, но может поясните — если у автора не то, что я нафантазировала в (40), а действительно как-то сохранены гуиды без дефисов, то, если сделать, как Вы написали:
«можно визуально эти позиции найти, взяв любую ссылку, и получить ее уид (Строка(Ссылка.УникальныйИдентификатор()) и внутр. представление : ЗначениеВСтрокуВнутр(Ссылка)»
позиции дефисов гарантировано будут одинаковые? по любой ссылке любого объекта, или только в пределах определенного типа объектов (справочника номенклатуры в данном случае)?
это имеет объяснение или какую-то мат.часть нужно почитать?
(42) блин, и правда глупый вопрос 🙂 Как-то не приходилось задумываться, что разделение дефисами всегда одинаковое, если есть
Как получить уникальный идентификатор объекта, GUID?
GUID (Globally Unique Identifier) — статистически уникальный 128-битный идентификатор. Его главная особенность — уникальность, которая позволяет создавать расширяемые сервисы и приложения без опасения конфликтов, вызванных совпадением идентификаторов. Хотя уникальность каждого отдельного GUID не гарантируется, общее количество уникальных ключей настолько велико (2128 или 3,402 * 10в38), что вероятность того, что в мире будут независимо сгенерированы два совпадающих ключа, крайне мала.
Для получения уникального идентификатора объекта, используйте код вида:
Код 1C v 8.х
ГУИДССЫЛКИ = СсылкаНаОбъект.УникальныйИдентификатор(); // или НоменклатураСсылка = Справочники.Номенклатура.НайтиПоКоду("00013"); Если НЕ НоменклатураСсылка.Пустая() Тогда Сообщить("GUID color: #001a34;">Код 1C v 8.х Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Номенклатура.НаименованиеПолное, | Номенклатура.ЕдиницаИзмерения, | Номенклатура.СтавкаНДС, | Номенклатура.НоменклатурнаяГруппа, | Номенклатура.СчетУчетаЗапасов, | Номенклатура.СчетУчетаЗатрат, | Номенклатура.Ссылка, | Номенклатура.ЭтоГруппа | ИЗ | Справочник.Номенклатура КАК Номенклатура"; РезультатЗапроса = Запрос.Выполнить(); СпрОбъект = РезультатЗапроса.Выбрать(); Пока СпрОбъект.Следующий() Цикл СтрокаУИ = Объект.XMLСтрока(СпрОбъект.Ссылка); GUID = Справочники.Номенклатура.ПолучитьСсылку(Новый УникальныйИдентификатор(СокрЛП(СтрокаУИ))); КонецЦикла;
В 1С 7.7 можно получить так
Через v7plus.dll
Код 1C v 7.x

Инфо = СоздатьОбъект("AddIn.V7SysInfo"); ГлобальноУникальныйИдентификатор = Инфо.СоздатьGUID();
Через WScript
Код 1C v 7.x
Функция СоздатьGUID() TypeLib = CreateObject("Scriptlet.TypeLib"); NewGUID = TypeLib.Guid(); TypeLib = ""; Возврат NewGUID; КонецФункции //******************************************* Процедура Сформировать() g=СоздатьGUID(); Сообщить("Создан GUID: "+g); КонецПроцедуры
при OLE доступе:
Код 1C v 7.x
Если Док_Источник.ВыбратьДокументы(ВыбНачПериода,ВыбКонПериода) = 1 Тогда Пока Док_Источник.ПолучитьДокумент() = 1 Цикл Объект = БазаОле.ЗначениеВстрокуВнутр(Док_Источник.ТекущийДокумент()); ИдентификаторДокумента = СокрЛП(ПолучитьИД(Объект)); // Для примера Объект возвращает , // а ПолучитьИД(объект) = 258156CB КонецЦикла;
Еще посмотрите метод:
ЗначениеВСтрокуВнутр();
Синтаксис:
ЗначениеВСтрокуВнутр()
Назначение:
Преобразование значения объекта агрегатного типа в строковое системное представление.
Возвращает: представление значения объекта в строковом системном виде.
Параметры:
- значение объекта агрегатного типа данных которое нужно преобразовать.
как получить Уникальный идентификатор в 1cv7
Столкнулся с проблемой.
Нужно перенести информацию из самописной 1cv7.
Как можна получить уникальный идентификатор справочника элемента?
По теме из базы знаний
- Rocket Launcher 7.7. Свертка базы 1С 7.7. Перенос справочников и документов 7.7
- Универсальный обмен данными UNIDATA 1с77
- Создание в 1С 7.7 XML в формате EnterpriseData (универсальный формат обмена), версия 1.5. Инструкции и примеры переноса данных из устаревшей конфигурации 1С 7.7 в любую современную 1С 8.3, поддерживающую EnterpriseData, через Конвертацию данных 3
- HTTP сервер 1С 7.7 + HTTP асинхронный клиент: внешние компоненты для 1С 7.7
- Монопольное открытие формы обработки 1с77
Найденные решения
2. chg 05.12.19 15:44 Сейчас в теме
Зачем, чем вас правила КД 2.1 не устраивают для переноса? Там ИДки сами определятся, вам только синхронизируй значение или у вас более хитрый и тернистый план?