Уникальный идентификатор реквизита объекта 1с

18.11.2021

Получение уникального идентификатора объекта из ссылки в запросе

Данная статья является анонсом новой функциональности.

Не рекомендуется использовать содержание данной статьи для освоения новой функциональности.


Полное описание новой функциональности будет приведено в документации к соответствующей версии.


Полный список изменений в новой версии приводится в файле v8Update.htm.

Планируется в версии 8.3.22

По многочисленным просьбам в версии 8.3.22 в язык запросов и в язык выражений СКД добавится функция УникальныйИдентификатор(Ссылка). Параметр Ссылка —  выражение, результатом которого является ссылка (кроме ссылок на таблицы внешних источников данных). Функция возвращает уникальный идентификатор переданной ссылки или NULL, если передано значение NULL.

Это нововведение, в частности, упростит задачи интеграции систем на платформе 1С:Предприятие с внешними системами.

Рассмотрим пример. У нас есть интеграция с внешней системой на уровне данных – таблица внешней системы ссылается на справочник Товары в нашей инфобазе.

Структура таблицы внешней системы:

 Идентификатор  Ключ (число)
 Наименование  Название товара на английском языке (строка)
 УникальныйИдентификатор  Ссылка на элемент справочника Товары (уникальный идентификатор)

Нам нужно на стороне 1С вывести содержимое справочника Товары и для каждого товара показать его название на английском языке.

Предположим, мы получили содержимое внешней таблицы в виде таблицы значений (через веб-сервис или внешний источник данных или ещё каким-то образом).

Сейчас связать записи внешней таблицы (лежащие в таблице значений) с элементами справочника Товары можно так:

  1. Добавить в таблицу значений колонку, которую надо заполнить ссылкой на элементы справочника Товары, обойдя все записи таблицы значений в цикле.
  2. Полученную таблицу значений с помощью запроса объединить со справочником Товары.

В версии 8.3.22 это можно будет сделать гораздо проще.

Проиллюстрируем это кодом. Содержимое внешней таблицы помещено в таблицу значений ТЗ_ТоварыВнешняя.

Запрос.Текст =
«ВЫБРАТЬ
| ТЗ_ТоварыВнешняя.Наименование КАК НаименованиеEn,
| ТЗ_ТоварыВнешняя.УникальныйИдентификатор КАК УникальныйИдентификатор
|ПОМЕСТИТЬ ВТ_ТоварыВнешняя
|ИЗ
| &ТЗ_ТоварыВнешняя КАК ТЗ_ТоварыВнешняя
|;
|
|ВЫБРАТЬ
| Товары.Код КАК Код,
| Товары.Наименование КАК Наименование,
| ВТ_ТоварыВнешняя.НаименованиеEn КАК НаименованиеEn
|ИЗ
| Справочник.Товары КАК Товары
| ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ТоварыВнешняя КАК ВТ_ТоварыВнешняя
| ПО УникальныйИдентификатор(Товары.Ссылка) = ВТ_ТоварыВнешняя.УникальныйИдентификатор
|»;

Запрос.УстановитьПараметр(«ТЗ_ТоварыВнешняя «, ТЗ_ТоварыВнешняя);
Данные = Запрос.Выполнить().Выбрать();

Теги:
8.3.22 
запросы 

Содержание

УИД или уникальный идентификатор

Описание

УИД это определенное значение, однозначно идентифицирующее объект ссылочного типа данных, другими словами, это и есть ссылка уникальная в рамках одной конкретно взятой таблицы, например у справочника номенклатура. УИД есть у любого объекта имеющего ссылочный тип данных, из синтаксис помощника следует, что УИД имеет следующий вид: «XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX», где Х — символы обозначающие шестнадцатеричное число. Прочитать какой текущий уникальный идентификатор существует у ссылки можно с помощью метода УникальныйИдентификатор() например:

КонтрагентПетров = Справочники.Контрагенты.НайтиПоНаименованию(«Петров Иван Сергеевич»);
УИД = КонтрагентПетров. УникальныйИдентификатор();

Использование своего УИД при создании объекта

Изменить УИД у существующего объекта, штатными средствами встроенного языка нельзя. Зато можно при создании нового объекта указать свой УИД. Для этого нужно сделать несколько действий:

  1. Сгенерировать значение типа УИД, используя нужную нам строку(или не используя, как вам будет удобно)

    СтрокаGUID = "a763cfbb-f94f-4c67-8e13-0e96a3a7f353";
    НовыйGUID = Новый УникальныйИдентификатор(СтрокаGUID);
    //или просто
    НовыйGUID = Новый УникальныйИдентификатор;
  2. Получить ссылку из уже существующего УИД, нужного нам типа:

    СсылкаСНовымКлиентом = Справочники.Клиенты.ПолучитьСсылку(НовыйGUID);
  3. Установить эту ссылку новому объекту

    НовыйКлиент = Справочник.Клиенты.СоздатьЭлемент();
    НовыйКлиент.УстановитьСсылкуНововго(СсылкаСНовымКлиентом);

Подсказка. Если мы создаем УИД из конкретно взятой строки, то мы можем получить УИД существующего объекта и следовательно в шаге два получить не новую ссылку, а вполне себе существующую. В таком случае при записи объекта полученного в шаге три, система сообщит о том, что не может записать объект с неуникальной ссылкой. Зато получение ссылки по строковому идентификтору, очень удобно использовать при синхронизации между разнородными системами(не 1С) или между разными базами.


Ссылки

Только авторизованные участники могут оставлять комментарии.

Уникальный идентификатор

Содержание[Убрать]

    • Если Вам встречались в базе записи «<Объект не найден>», то значит настала пора познакомитсья с Уникальным идентификатором.

Уникальный идентификатор (GUID)

Если Вам встречались в базе записи «<Объект не найден>», то значит настала пора познакомитсья с Уникальным идентификатором.

Уникальный идентификатор — это уникальный набор символов который характерезует экземпляр метаданных объектного типа в 1С(Напрмимер, элемент справочника или документ). По сути ссылка и является уникальным идентификатором, причем даже у разных видов объектов он не может быть похож. Выглядит он примерно так:

de80b7c8-aa22-11dc-a0f4-0011d85708ff

Т.е. это набор из 32 шестнадцатеричных цифр разделенных дефисами.

Надпись <Объект не найден> появляется в базе когда есть ссылка(уникальный идентификатор) на объект, а объекта в базе нет. Такое может возникнуть или при удалении объектов без проврки ссылочной целостности или при обмене между базами.

Разберем для примера надпись: <Объект не найден> (36:9c4e0022642fda9811e10393c0d776fd)

Для начала узнаем какой тип объекта был удален, для этого используем метод ПолучитьСтруктуруХраненияБазыДанных(), он возвращает таблицу значений(по умолчанию в формате SDBL) где указано соответсвие внутренних идентификаторов и объектов метаданных.

Например можно написать такой код:

ТЗ = ПолучитьСтруктуруХраненияБазыДанных();
ТЗ.ВыбратьСтроку();

В ней мы находим идентификатор  который в конце содержит 36 (цифры до двоеточия), но только не в составе числа(Document2836), а точное соответсвие. В нашем случае это следующая строка:

Reference36 Справочник.Номенклатура

Значит удаленный элемент был элементом справочника «Номенклатура».

Как Вы заметили внутри скобок находится тип объекта и уникальный идентификатор строкой.

Теперь мы можем на одной из архивных копий найти удаленный элемент, добавив дефисы в имеющуюся у нас строку идентификтора:

ГУИД = Новый УникальныйИдентификатор("9c4e0022-642f-da98-11e1-0393c0d776fd");
СсылкаНаУдаленныйЭлемент = Справочники.Номенклатура.ПолучитьСсылку(ГУИД);

Зная все значения полей мы можем вручную или с помощью обработок воссоздать удаленный элемент,  но у них будет одно главное отличие — разные Уникальные идентификаторы. А если мы хотим восстановить элемент, то и идентификатор нужно восстановить тот же. Для этого нужно использовать метод «УстановитьСсылкуНового«, например так:

ВосстанавливаемыйЭлемент =  Справочники.Номенклатура.СоздатьЭлемент();
ГУИД = Новый УникальныйИдентификатор("9c4e0022-642f-da98-11e1-0393c0d776fd");
СсылкаНаУдаленныйЭлемент = Справочники.Номенклатура.ПолучитьСсылку(ГУИД);
ВосстанавливаемыйЭлемент.УстановитьСсылкуНового(СсылкаНаУдаленныйЭлемент);

Теперь можно заполнить остальные поля.

Недостаточно прав для комментирования

 +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
КонецЦикла;

Еще посмотрите метод:

ЗначениеВСтрокуВнутр(<?>);
Синтаксис:
ЗначениеВСтрокуВнутр(<Объект>)
Назначение:
Преобразование значения объекта агрегатного типа в строковое системное представление.
Возвращает: представление значения объекта в строковом системном виде.
Параметры:
<Объект> — значение объекта агрегатного типа данных которое нужно преобразовать.

Как получить уникальный идентификатор реквизита (метаданные)?

Я
   SeiOkami

22.02.16 — 17:29

Здравия всем!

У каждого объекта метаданных конфигурации есть свой идентификатор. У каждого реквизита так же есть свой идентификатор. Их можно увидеть, если распаковать конфигурацию в файлы.

Вопрос. Можно ли их получить программно без распаковки конфы? Пробовал ЗначениеВСтрокуВнутр, но это не работает. Есть другие способы?

  

Партнерская программа EFSOL Oblako

   SeiOkami

1 — 22.02.16 — 17:31

По-моему, я раньше встречал такое в сети, но сейчас найти ничего не смог.

   Nuobu

2 — 22.02.16 — 17:34

(0) У меня вот это сработало:

     ЗначениеВСтрокуВнутр(Новый(«СправочникСсылка.Номенклатура»)));

   SeiOkami

3 — 22.02.16 — 17:35

(2), это уникальный идентификатор справочника, а не его реквизита

   Записьдампа

4 — 22.02.16 — 17:45

ПолучитьСтруктуруХраненияБазыДанных

   SeiOkami

5 — 22.02.16 — 17:50

(4), а где там идентификаторы?

   Записьдампа

6 — 22.02.16 — 18:17

Имя хранения

   SeiOkami

7 — 22.02.16 — 18:20

(6), это не уникальный идентификатор реквизита. Это имя хранения в таблице

   Записьдампа

8 — 22.02.16 — 18:26

Хорошо

   SeiOkami

9 — 22.02.16 — 18:26

   aka MIK

10 — 22.02.16 — 18:29

Это ГУИД реквизита или элемента формы?

   aka MIK

11 — 22.02.16 — 18:29

Зачем кому-то может понадобиться ГУИД реквизиты формы?

   SeiOkami

12 — 22.02.16 — 18:58

(10), реквизита справочника

   RomanYS

13 — 22.02.16 — 19:04

(12) зачем?

Даже для одинаковых конфигураций ГУИДы могут отличаться. Как его можно использовать? Для проверки возможности загруки конфигурации? У меня других идей нет.

   SeiOkami

14 — 22.02.16 — 19:32

(13), вопрос ведь не в том, как использовать, а в том, как получить ;)

   Живой Ископаемый

15 — 22.02.16 — 19:40

Добавь таблицу Конфиг как внешний источник данных… наверное

   Лефмихалыч

16 — 22.02.16 — 20:33

(0) >Можно ли их получить программно без распаковки конфы

нет. Вообще. Совсем.

   Torquader

17 — 24.02.16 — 01:27

Можно программно распаковать конфу и получить то, что нужно.

Другого способа просто нет.

Идентификаторы используются при модификации конфигурации, а при работе — они просто не нужны.

  

Sammo

18 — 24.02.16 — 03:32

(14) Тогда ответ — данный функционал не предусмотрен. Следующий вопрос?

Поэтому и возникает вопрос Зачем, т.к. похоже, что в постановке что-то не то

высокое-качество

Пример уникального идентификатора: 4bf85396-cc7a-11ea-9ef0-c86000245adb

   //

   //Узнать уникальный идентификатор

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

   //Создаём уникальный идентификатор из строки

   СтрокаGUID = «4bf85396-cc7a-11ea-9ef0-c86000245adb»;

   НовыйGUID = Новый УникальныйИдентификатор(СтрокаGUID);

   //Можно не указывать СтрокаGUID. Программа сгенерирует сама

   НовыйGUID = Новый УникальныйИдентификатор();

   //

   //Получить ссылку на на объект, зная его GUID

   СсылкаПП = Документы.ПлатежноеПоручениеВходящее.ПолучитьСсылку(НовыйGUID);

   //Создать документ и присвоить ему ГУИД

   СтрокаGUID = «4bf85396-cc7a-11ea-9ef0-c86000245adb»;

   Док = Документы.ПлатежноеПоручениеВходящее.СоздатьДокумент();

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

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

   //

   //Получить ГУИД из COM-объекта

   V83COMConnector = Новый COMОбъект(«V83.COMConnector»);

   БД = V83COMConnector.Connect(ПараметрыПодключения);  

   СтрокаГУИД = БД.XMLСтрока(Док.Ссылка);

Вариант применения в заметке «Сделать из элемента справочника группу»

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


Виртуальный 1С помощник

 Инфо = СоздатьОбъект("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
 КонецЦикла; 

Еще посмотрите метод:

ЗначениеВСтрокуВнутр(<?>);
Синтаксис:
ЗначениеВСтрокуВнутр(<Объект>)
Назначение:
Преобразование значения объекта агрегатного типа в строковое системное представление.
Возвращает: представление значения объекта в строковом системном виде.
Параметры:
<Объект> — значение объекта агрегатного типа данных которое нужно преобразовать.

Понравилась статья? Поделить с друзьями:
  • Унистом стоматология в хабаровске часы работы
  • Уоррен баффет компания yorkshire hatter акции
  • Уплотнительное кольцо глушителя газель бизнес
  • Управление бизнесом в цифровой экономике 2021
  • Управление бизнесом второе высшее образование