Получение уникального идентификатора объекта из ссылки в запросе
Данная статья является анонсом новой функциональности.
Не рекомендуется использовать содержание данной статьи для освоения новой функциональности.
Полное описание новой функциональности будет приведено в документации к соответствующей версии.
Полный список изменений в новой версии приводится в файле v8Update.htm.
Планируется в версии 8.3.22
По многочисленным просьбам в версии 8.3.22 в язык запросов и в язык выражений СКД добавится функция УникальныйИдентификатор(Ссылка). Параметр Ссылка — выражение, результатом которого является ссылка (кроме ссылок на таблицы внешних источников данных). Функция возвращает уникальный идентификатор переданной ссылки или NULL, если передано значение NULL.
Это нововведение, в частности, упростит задачи интеграции систем на платформе 1С:Предприятие с внешними системами.
Рассмотрим пример. У нас есть интеграция с внешней системой на уровне данных – таблица внешней системы ссылается на справочник Товары в нашей инфобазе.
Структура таблицы внешней системы:
| Идентификатор | Ключ (число) |
| Наименование | Название товара на английском языке (строка) |
| УникальныйИдентификатор | Ссылка на элемент справочника Товары (уникальный идентификатор) |
Нам нужно на стороне 1С вывести содержимое справочника Товары и для каждого товара показать его название на английском языке.
Предположим, мы получили содержимое внешней таблицы в виде таблицы значений (через веб-сервис или внешний источник данных или ещё каким-то образом).
Сейчас связать записи внешней таблицы (лежащие в таблице значений) с элементами справочника Товары можно так:
- Добавить в таблицу значений колонку, которую надо заполнить ссылкой на элементы справочника Товары, обойдя все записи таблицы значений в цикле.
- Полученную таблицу значений с помощью запроса объединить со справочником Товары.
В версии 8.3.22 это можно будет сделать гораздо проще.
Проиллюстрируем это кодом. Содержимое внешней таблицы помещено в таблицу значений ТЗ_ТоварыВнешняя.
Как получить UUID, ГУИД, GUID объекта в 1С?
Для программного получения уникального идентификатора объекта, нужна всего лишь ссылка на объект.
GUID = СсылкаНаОбъект.УникальныйИдентификатор();
Справочники.ПодразделенияОрганизаций.НайтиПоКоду("123").УникальныйИдентификатор();
Система вернет 36 символьный строковый код идентификатора.
Найти по GUID
В данном примере получаем ссылку на объект по строковому значению GUID.
СсылкаНаОбъект = Справочники.ПодразделенияОрганизаций.ПолучитьСсылку(Новый УникальныйИдентификатор(GUID));
Задать свой GUID для объекта
Бывают случаи когда например перепутаны элементы справочниках в разных базах, которые необходимо синхронизировать, в данном случае одним из решений является получить нужный идентификаторы объект в базе источнике и присвоить его соответствующему элементу в базе приемнике.
СсылкаНовыйGUID = Справочники.ПодразделенияОрганизаций.ПолучитьСсылку(Новый УникальныйИдентификатор(НовыйGUID)); ОбъектДляИзменения.УстановитьСсылкуНового(СсылкаНовыйGUID);
В данном примере получаем ссылку по уникальному идентификатору и присваиваем ее нужному объекту.
Как заменить уникальный идентификатор для подразделения
В моем случае была необходимость для созданного подразделения в 1С Бухгалтерии установить уникальный идентификатор в соответствии с идентификатором подразделения в 1С ЗУП.
Пример обработки использования можно скачать.
В обработке можно получить GUID по ссылке, найти подразделение по GUID и заменить GUID для объекта.
Как получить уникальный идентификатор объекта, 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 КонецЦикла;
Еще посмотрите метод:
ЗначениеВСтрокуВнутр();
Синтаксис:
ЗначениеВСтрокуВнутр()
Назначение:
Преобразование значения объекта агрегатного типа в строковое системное представление.
Возвращает: представление значения объекта в строковом системном виде.
Параметры:
- значение объекта агрегатного типа данных которое нужно преобразовать.
Guid что это такое в 1с
Надо создать уникальный идентификатор для записи данных в внешнюю базу данных. Функции случайного числа я так понимаю нет. Милисикунд тоже нет. Может кто решал эту задачу ?
А чем Новый УникальныйИдентификатор() не нравится?
А где ТелепатБот дрыхнет?
Ну GUID - он длинный, а потом какая гарантия что он стопудово будет уникальным ?
(4) почитай описание.
(4) Бугага! Создай 2 GUID и слепи в одну строку.
(6)+ Или воспользуйся текущей датой в числовом представлении.
А можно получить уникальный идентификатор разреза регистра сведений ?
(8) "уникальный идентификатор разреза" - это что-то новое в отечественной автоматизации?
(9) Есть регистр сведений, у него допустим три измерения и один реквизит.
(8) идентификатор разреза регистра сведений - это видимо список значений измерений
Ну и вот реквизит или ссылка на него лежит же в какой-то одной SQL табличке, и foregin key ями связан с тремя таблицами измерений. Если узнать ID этой строки, то это будет уникальный идентификатор разреза.
А вот что про UUID написано:
УникальныйИдентификатор (UUID) Из строки
Синтаксис: Новый УникальныйИдентификатор()
Параметры: (обязательный)
Тип: Строка. Строка GUID. Строка задается в виде "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX", где Х - символы обозначающие шестнадцатеричное число.
Описание:
Создает уникальный идентификатор из указанной строки GUID. Уникальность полученного таким образом идентификатора определяется уникальностью строки и поэтому не гарантирована.
Пример:
СтрокаGUID = "a763cfbb-f94f-4c67-8e13-0e96a3a7f353";
НовыйGUID = Новый УникальныйИдентификатор(СтрокаGUID);
Получается что никаких гарантий то нет.
Гарантии даст только господь бог.
Ты бы задачку, что-ли, обрисовал поподробнее. А то абсолютно неясно, что тебе надо.
(13)
УникальныйИдентификатор (UUID)
По умолчанию
Синтаксис:
Новый УникальныйИдентификатор
Описание:
Создает новый гарантированно уникальный идентификатор.
Пример:
Отчет = Отчеты[ИмяОтчета].Создать();
Форма = Отчет.ПолучитьФорму(,,Новый УникальныйИдентификатор);
Форма.ПоказыватьЗаголовок = ПоказыватьЗаголовок;
Форма.ОбновитьОтчет();
Форма.Открыть();
(14) Надо сформировать стопудово уникальный код для каждой записи в регистре сведений.
(16) а в (15) фраза "новый гарантированно уникальный идентификатор" Вас ни на какие мысли не наводит?
GUID можно сказать что стопудово уникальный, т.к. генерируется на основании 6-байтового номера сетевой карты и текущего времени. И содержит достаточно бит, чтобы вероятность "не стопудовости" стремилась к 0.
Отсюда следует, что надо иметь на каждом компе сетевую карту (пусть даже встроенную в материнку) и генерировать GUID-ы по возможности не сплошным потоком (т.е. чтобы время различалось).
(18) Но всё-таки для подстраховочки генерируй два идентификатора и создавай свой уникальный из последовательности нечётных символов первого и чётных второго :)))