+5
1С 8.3 : Как получить уникальный идентификатор объекта, GUID?
GUID (Globally Unique Identifier) — статистически уникальный 128-битный идентификатор. Его главная особенность — уникальность, которая позволяет создавать расширяемые сервисы и приложения без опасения конфликтов, вызванных совпадением идентификаторов. Хотя уникальность каждого отдельного GUID не гарантируется, общее количество уникальных ключей настолько велико (2128 или 3,402 * 10в38), что вероятность того, что в мире будут независимо сгенерированы два совпадающих ключа, крайне мала.
Для получения уникального идентификатора объекта, используйте код вида:
Код 1C v 8.х
ГУИДССЫЛКИ = СсылкаНаОбъект.УникальныйИдентификатор();
// или
НоменклатураСсылка = Справочники.Номенклатура.НайтиПоКоду("00013");
Если НЕ НоменклатураСсылка.Пустая() Тогда
Сообщить("GUID = " + НоменклатураСсылка.УникальныйИдентификатор());
КонецЕсли;
Как с помощью запроса получить уникальный идентификатор:
Код 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 Цикл
Объект = БазаОле.ЗначениеВстрокуВнутр(Док_Источник.ТекущийДокумент());
ИдентификаторДокумента = СокрЛП(ПолучитьИД(Объект));
// Для примера Объект возвращает {"O","0","0","3114","0","0"," 258156CB "},
// а ПолучитьИД(объект) = 258156CB
КонецЦикла;
Еще посмотрите метод:
ЗначениеВСтрокуВнутр(<?>);
Синтаксис:
ЗначениеВСтрокуВнутр(<Объект>)
Назначение:
Преобразование значения объекта агрегатного типа в строковое системное представление.
Возвращает: представление значения объекта в строковом системном виде.
Параметры:
<Объект> – значение объекта агрегатного типа данных которое нужно преобразовать.
18.11.2021
Получение уникального идентификатора объекта из ссылки в запросе
Данная статья является анонсом новой функциональности.
Не рекомендуется использовать содержание данной статьи для освоения новой функциональности.
Полное описание новой функциональности будет приведено в документации к соответствующей версии.
Полный список изменений в новой версии приводится в файле v8Update.htm.
Планируется в версии 8.3.22
По многочисленным просьбам в версии 8.3.22 в язык запросов и в язык выражений СКД добавится функция УникальныйИдентификатор(Ссылка). Параметр Ссылка – выражение, результатом которого является ссылка (кроме ссылок на таблицы внешних источников данных). Функция возвращает уникальный идентификатор переданной ссылки или NULL, если передано значение NULL.
Это нововведение, в частности, упростит задачи интеграции систем на платформе 1С:Предприятие с внешними системами.
Рассмотрим пример. У нас есть интеграция с внешней системой на уровне данных – таблица внешней системы ссылается на справочник Товары в нашей инфобазе.
Структура таблицы внешней системы:
Идентификатор | Ключ (число) |
Наименование | Название товара на английском языке (строка) |
УникальныйИдентификатор | Ссылка на элемент справочника Товары (уникальный идентификатор) |
Нам нужно на стороне 1С вывести содержимое справочника Товары и для каждого товара показать его название на английском языке.
Предположим, мы получили содержимое внешней таблицы в виде таблицы значений (через веб-сервис или внешний источник данных или ещё каким-то образом).
Сейчас связать записи внешней таблицы (лежащие в таблице значений) с элементами справочника Товары можно так:
- Добавить в таблицу значений колонку, которую надо заполнить ссылкой на элементы справочника Товары, обойдя все записи таблицы значений в цикле.
- Полученную таблицу значений с помощью запроса объединить со справочником Товары.
В версии 8.3.22 это можно будет сделать гораздо проще.
Проиллюстрируем это кодом. Содержимое внешней таблицы помещено в таблицу значений ТЗ_ТоварыВнешняя.
“ВЫБРАТЬ
| ТЗ_ТоварыВнешняя.Наименование КАК НаименованиеEn,
| ТЗ_ТоварыВнешняя.УникальныйИдентификатор КАК УникальныйИдентификатор
|ПОМЕСТИТЬ ВТ_ТоварыВнешняя
|ИЗ
| &ТЗ_ТоварыВнешняя КАК ТЗ_ТоварыВнешняя
|;
|
|ВЫБРАТЬ
| Товары.Код КАК Код,
| Товары.Наименование КАК Наименование,
| ВТ_ТоварыВнешняя.НаименованиеEn КАК НаименованиеEn
|ИЗ
| Справочник.Товары КАК Товары
| ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ТоварыВнешняя КАК ВТ_ТоварыВнешняя
| ПО УникальныйИдентификатор(Товары.Ссылка) = ВТ_ТоварыВнешняя.УникальныйИдентификатор
|”;
Запрос.УстановитьПараметр(“ТЗ_ТоварыВнешняя “, ТЗ_ТоварыВнешняя);
Данные = Запрос.Выполнить().Выбрать();
Теги:
8.3.22
запросы
Содержание:
1. Что такое GUID в 1С?
2. Чем отличается GUID от UUID?
3. Как получить уникальный идентификатор зная UUID в 1С
1. Что такое GUID в 1С?
GUID – это объект матричной таблицы в системе базы данных из шестнадцатеричных символов, заключенных в круглые скобки и прописанных через дефис. Он формируется с учетом времени и места, указывающего на расположение этого объекта (справочника, документа). Первая половина этого кода является расчетом времени, вторая – местом, где хранится объект. GUID в 1С создается в момент создания объекта. Подобно массивам объект хранится в определенной таблице, на определенном столбце с определенной строкой. При определенном попадании в эти 100 наносекунд могут формироваться абсолютно идентичные объекты. Это настолько мало вероятно, как проверить на уникальность все значения за 10 млрд лет.
В Базе данных для каждого объекта предназначен свой глобальный уникальный идентификатор – GUID (Globally Unique Identifier). Он представляет из себя ссылку из 32 символов, разделенных дефисами, которая состоит из 16 октетов. В первой части содержится время генерации уникального идентификатора, во второй – счетчик и MAC-адрес. Отсчет времени для генерации кода Guid идет с 15 октября 1582 года с интервалом на 100 наносекунд.
Вот так выглядит GUID БД 1С: 3de72ee8-f8b2-11e4-92f1-0050568b35ac
Его UUID можно получить по ссылке.
e1cib/data/Документ.ПриходныйОрдерНаТовары?ref=92f10050568b35ac11e4f8b23de72ee8
Это зеркальное отражение уникального идентификатора в 1С 8.3.
Совпадений разных объектов одной базы крайне малы, т.к. общее количество сгенерированных ключей составляет (2128 или 3,402 * 10в38).
Этот 128-битный код информации определяется ссылкой на тип метаданных, содержащий информацию об объекте. Генерация Guid происходит не только в пространстве, но и во времени псевдослучайным набором чисел. Непрерывно сформированные GUIDы используются в качестве первичных ключей в базе данных.
2. Чем отличается GUID от UUID?
UUID – универсально-уникальный идентификатор по данным всемирной организации стандартизации версии RFC4122. Этот термин используется в спецификациях протокола Windows как синоним GUID в 1С. Он должен быть полностью технически совместим с RFC4122. Из рекомендаций Международного стандарта “Все стандарты UUID, соответствующие этой Рекомендации, должны иметь биты варианта с битом 7 октета 7, установленным в 1 и бит 6 октета 7, установленным в 0”.
3. Как получить уникальный идентификатор зная UUID в 1С
Итак, как же получить GUID зная UUID в 1С?
В конструкторе запроса необходимо создать запрос:
СправочникСсылка=Справочники.ИмяСправочника.НайтиПоНаименованию(«Наименование»);
GUID=СправочникСсылка.УникальныйИдентификатор()
Для установления соответствия объектов разных БД используется GUID.
Необходимо указать узел обмена и тип объекта (склад, договор, контрагент и т.д.). В «источнике» базы данных нужно указать объект, с которым будет устанавливаться соответствие с объектом из «приемника» БД.
Специалист компании ООО «Кодерлайн»
Ирина Оргина.
В любой конфигурации 1С 8 у каждого объекта(документа, элемента справочника, элемента плана видов характеристик и т.п.) есть уникальный идентификатор(УИН). При помощи него можно переносить объекты между базами РИБ не боясь задвоения данных, быстро находить элемент справочника или документ и т.п.
Как получить уникальный идентификатор из ссылки? При помощи свойства ссылки УникальныйИдентификатор(). Пример 1:
Реализация = Документы.РеализацияТоваровУслуг.НайтиПоНомеру("00000000001");
УИН = Реализация.УникальныйИдентификатор();
Пример 2:
Результат = Запрос.Выполнить().Выгрузить();
Для Каждого Стр из Результат Цикл
УИН = Стр.Ссылка.УникальныйИдентификатор();
//Далее ваш код по обработке уникального идентификатора
КонецЦикла;
Уникальный идентификатор в 1С 8 имеет тип УникальныйИдентификатор, но его можно преобразовать и в строковое значение(получится строка вот такого вида: 9712e912-d0b9-11e1-b37b-0050568458ce).
Пример 3:
Поступление = Документы.ПоступлениеТоваровУслуг.НайтиПоНомеру("00000000002");
УИН = Строка(Поступление.УникальныйИдентификатор());
Как получить ссылку имея уникальный идентификатор? При помощи метода ПолучитьСсылку(<УникальныйИдентификатор>) менеджера справочника, документа и т.п.
Наша команда предоставляет услуги по консультированию, настройке и внедрению 1С.
Связаться с нами можно по телефону +7 499 350 29 00.
Услуги и цены можно увидеть по ссылке.
Будем рады помочь Вам!
Пример 4 (Здесь УИН — значение типа УникальныйИдентификатор):
Номенклатура = Справочники.Номенклатура.ПолучитьСсылку(УИН);
Пример 5(Здесь СтрокаУИН — переменная со строковым значением уникального идентификатора):
Номенклатура = Справочники.Номенклатура.ПолучитьСсылку(Новый УникальныйИдентификатор(СтрокаУИН));
В примере 5 уникальный идентификатор получается из строкового значения при помощи конструктора Новый УникальныйИдентификатор(<Строка>)
Уникальный идентификатор
Содержание[Убрать]
-
- Если Вам встречались в базе записи “<Объект не найден>”, то значит настала пора познакомитсья с Уникальным идентификатором.
Уникальный идентификатор (GUID)
Если Вам встречались в базе записи “<Объект не найден>”, то значит настала пора познакомитсья с Уникальным идентификатором.
Уникальный идентификатор – это уникальный набор символов который характерезует экземпляр метаданных объектного типа в 1С(Напрмимер, элемент справочника или документ). По сути ссылка и является уникальным идентификатором, причем даже у разных видов объектов он не может быть похож. Выглядит он примерно так:
de80b7c8-aa22-11dc-a0f4-0011d85708ff
Т.е. это набор из 32 шестнадцатеричных цифр разделенных дефисами.
Надпись <Объект не найден> появляется в базе когда есть ссылка(уникальный идентификатор) на объект, а объекта в базе нет. Такое может возникнуть или при удалении объектов без проврки ссылочной целостности или при обмене между базами.
Разберем для примера надпись: <Объект не найден> (36:9c4e0022642fda9811e10393c0d776fd)
Для начала узнаем какой тип объекта был удален, для этого используем метод ПолучитьСтруктуруХраненияБазыДанных(), он возвращает таблицу значений(по умолчанию в формате SDBL) где указано соответсвие внутренних идентификаторов и объектов метаданных.
Например можно написать такой код:
ТЗ = ПолучитьСтруктуруХраненияБазыДанных();
ТЗ.ВыбратьСтроку();
В ней мы находим идентификатор который в конце содержит 36 (цифры до двоеточия), но только не в составе числа(Document2836), а точное соответсвие. В нашем случае это следующая строка:
Reference36 | Справочник.Номенклатура |
Значит удаленный элемент был элементом справочника “Номенклатура”.
Как Вы заметили внутри скобок находится тип объекта и уникальный идентификатор строкой.
Теперь мы можем на одной из архивных копий найти удаленный элемент, добавив дефисы в имеющуюся у нас строку идентификтора:
ГУИД = Новый УникальныйИдентификатор("9c4e0022-642f-da98-11e1-0393c0d776fd");
СсылкаНаУдаленныйЭлемент = Справочники.Номенклатура.ПолучитьСсылку(ГУИД);
Зная все значения полей мы можем вручную или с помощью обработок воссоздать удаленный элемент, но у них будет одно главное отличие – разные Уникальные идентификаторы. А если мы хотим восстановить элемент, то и идентификатор нужно восстановить тот же. Для этого нужно использовать метод “УстановитьСсылкуНового“, например так:
ВосстанавливаемыйЭлемент = Справочники.Номенклатура.СоздатьЭлемент();
ГУИД = Новый УникальныйИдентификатор("9c4e0022-642f-da98-11e1-0393c0d776fd");
СсылкаНаУдаленныйЭлемент = Справочники.Номенклатура.ПолучитьСсылку(ГУИД);
ВосстанавливаемыйЭлемент.УстановитьСсылкуНового(СсылкаНаУдаленныйЭлемент);
Теперь можно заполнить остальные поля.
Недостаточно прав для комментирования