GUID в 1С. Устройство, использование, некоторые нюансы
GUID расшифровывается как Globally Unique Identifier, и представляет собой статистически уникальный 128-битный идентификатор. Вероятность того, что где-нибудь в мире будут независимо сгенерированы два идентичных ключа, исчезающе мала, так как общее количество возможных ключей составляет 2 в 128 степени. В 1С GUID используется в ссылочных типах данных, а также уникальный идентификатор присваивается каждому вновь образуемому типу данных при добавлении метаданных конфигурации. На примере метаданных обработки: GUID есть у самого объекта метаданных, у объекта данных, и у менеджера этой обработки. Эти идентификаторы используются в механизмах сериализации, а также в механизмах сравнения-объединения конфигураций.
Получить идентификатор у ссылочного объекта можно, а вот программного доступа к GUID метаданных нет – но можно посмотреть идентификаторы образованных типов, выгрузив конфигурацию в файлы, либо получив сериализованное представление нужного объекта.
Устройство GUID в 1С на примерах
Строковое представление GUID – это строка из 32 шестнадцатеричных цифр, состоящая из четырех частей, разделенных дефисами. Уникальные идентификаторы делятся на пять версий. В зависимости от версии GUID, его четыре части формируются по-разному, и содержат разную информацию. Подробное строение GUID описано в спецификации UUID – универсального уникального идентификатора, реализацией которого является GUID.
- time-based version. Данная версия содержит информацию о времени генерации GUID и MAC-адресе узла (устройства), на котором идентификатор был сгенерирован
- DCE Security version (POSIX UIDs) – также содержит MAC-адрес, но из-за особенностей генерации не подходит в случаях, когда GUID необходимо генерировать чаще чем раз в 7 минут
- name-based version (MD5 hashing) – GUID генерируется путем хэширования идентификатора пространства имен и имени. Хэширование производится по алгоритму MD5
- randomly generated version – случайно генерируемый GUID
- name-based version (SHA-1 hashing) – то же что и версия 3, только в качестве алгоритма хэширования используется SHA-1
GUID для объектов ссылочных типов, которые генерируются в момент записи объекта, относятся к time-based версии, а идентификаторы объектов метаданных, типов значений, предопределенных элементов, созданных в конфигураторе, и полученные методом Новый УникальныйИдентификатор() относятся к версии 4 – случайно генерируемые.
Вооружившись этими знаниями, займемся исследованием GUID-ов, которые мы можем получить в 1С. В качестве объектов для опытов создадим обработку РаботаСГУИД и справочник ТестовыйСправочник. В обработке добавим команду, а в серверном обработчике этой команды пропишем следующий код:
Метод ЗначениеВСтрокуВнутр сериализует объекты языка в строку. В рассматриваемом примере в окно сообщений будут выведены следующие данные:
Если выгрузить конфигурацию в файлы и открыть файл с обработкой РаботаСГУИД, можно увидеть, что идентификаторы экземпляра обработки и менеджера обработки действительно соответствуют тому, что мы получили в результате сериализации:

Разберем структуру GUID на примере идентификатора, созданного в момент записи элемента справочника:
8e1f9db8-4be2-11ed-a101-2c4d5450919d
GUID записывается по группами шестнадцатеричных чисел по схеме 8-4-4-4-12. В случае, когда используется версия 1 (основанная на времени), значение групп будет следующим:
8e1f9db8-4be2 – отметка времени Timestamp
11ed – первые бита – это версия GUID, в нашем случае 1. Остальные – формируют оставшуюся часть отметки времени
a101 – вариант GUID И Clock Sequence
2c4d5450919d – MAC-адрес узла (Node)
Так все-таки, можно ли упорядочивать по GUID?
При записи объектов в 1С версия 1 используется не просто так. Случайные GUID очень плохо кластеризуются, дерево поиска получается максимально широкое, и для того, чтобы оптимизировать операции поиска / вставки, используется комбинированный вариант генерации GUID. Использование отметки времени позволяет сделать ключи более сгруппированными и уменьшить ширину B-дерева. При этом последовательное их возрастание в общем случае не гарантируется. В рамках одного сеанса генерируемые GUID формируются порциями по 32 штуки, и в рамках этой порции они действительно могут быть последовательными. Если объекты одновременно записываются в нескольких параллельных сеансах, их GUID могут быть упорядочены в рамах одного сеанса, одного типа данных, и одного пула из 32 идентификаторов.
Сами уникальные идентификаторы в СУБД хранятся в виде двоичных данных Binary (16), и сортируются побитово как бинарные данные. Попытки использовать GUID для упорядочивания по отметке времени – от лукавого. Во-первых, на оси времени в пределах одной секунды документы разных типов в любом случае не будут располагаться хронологически. Во-вторых, документы одного типа также не будут в общем случае, если они заводятся в рамках разных параллельных сеансов.
Вывод, подкрепленный цитатой Бориса Нуралиева: использовать GUID для хронологического упорядочивания объектов на оси времени в общем случае нельзя!
“Механизм генерации ссылок обеспечивает только их уникальность. Возрастающая последовательность при их генерации не обеспечивается.” (c)
Программирование 1С 8.х для начинающих
- Вы здесь:




- Уникальный идентификатор
Общие вопросы
Уникальный идентификатор
- Печать
Уникальный идентификатор (GUID)
Если Вам встречались в базе записи «<Объект не найден>», то значит настала пора познакомитсья с Уникальным идентификатором .
Уникальный идентификатор — это уникальный набор символов который характерезует экземпляр метаданных объектного типа в 1С(Напрмимер, элемент справочника или документ). По сути ссылка и является уникальным идентификатором, причем даже у разных видов объектов он не может быть похож. Выглядит он примерно так:
de80b7c8-aa22-11dc-a0f4-0011d85708ff
Т.е. это набор из 32 шестнадцатеричных цифр разделенных дефисами.
Надпись <Объект не найден> появляется в базе когда есть ссылка(уникальный идентификатор) на объект, а объекта в базе нет. Такое может возникнуть или при удалении объектов без проврки ссылочной целостности или при обмене между базами.
Разберем для примера надпись: <Объект не найден> (36:9c4e0022642fda9811e10393c0d776fd)
Для начала узнаем какой тип объекта был удален, для этого используем метод ПолучитьСтруктуруХраненияБазыДанных(), он возвращает таблицу значений(по умолчанию в формате SDBL) где указано соответсвие внутренних идентификаторов и объектов метаданных.
Например можно написать такой код:
В ней мы находим идентификатор который в конце содержит 36 (цифры до двоеточия), но только не в составе числа( Document2836 ), а точное соответсвие. В нашем случае это следующая строка:
| Reference36 | Справочник.Номенклатура |
Значит удаленный элемент был элементом справочника «Номенклатура».
Как Вы заметили внутри скобок находится тип объекта и уникальный идентификатор строкой.
Теперь мы можем на одной из архивных копий найти удаленный элемент, добавив дефисы в имеющуюся у нас строку идентификтора:
Зная все значения полей мы можем вручную или с помощью обработок воссоздать удаленный элемент, но у них будет одно главное отличие — разные Уникальные идентификаторы. А если мы хотим восстановить элемент, то и идентификатор нужно восстановить тот же. Для этого нужно использовать метод «УстановитьСсылкуНового«, например так:
1С 8.3 Получить УИД в запросе — Программист 1С Минск. Автоматизация бизнеса.

// Создание выборки
Запрос = Новый Запрос ( «ВЫБРАТЬ
| ТЗ_МатериалыНаСкладе.Наименование КАК НаименованиеEn,
| ТЗ_МатериалыНаСкладе.УникальныйИдентификатор КАК УникальныйИдентификатор
|ПОМЕСТИТЬ ВТ_МатериалыНаСкладе
|ИЗ
| &ТЗ_МатериалыНаСкладе КАК ТЗ_МатериалыНаСкладе
|;
|
|ВЫБРАТЬ
| Материалы.Код КАК Код,
| Материалы.Наименование КАК Наименование,
| ВТ_МатериалыНаСкладе.НаименованиеEn КАК НаименованиеEn
|ИЗ
| Справочник.Материалы КАК Материалы
| ЛЕВОЕ СОЕДИНЕНИЕ ВТ_МатериалыНаСкладе КАК ВТ_МатериалыНаСкладе
| ПО УникальныйИдентификатор(Материалы.Ссылка) = ВТ_МатериалыНаСкладе.УникальныйИдентификатор» );
Запрос . УстановитьПараметр ( «ТЗ_МатериалыНаСкладе » , ТЗ_МатериалыНаСкладе );
РезультатЗапроса = Запрос . Выполнить ();
Если Не РезультатЗапроса . Пустой () Тогда // Такая проверка рекомендуется фирмой 1С
Записи = РезультатЗапроса . Выбрать ();
Пока Записи . Следующий () Цикл
// Обход результата запроса по каждой записи в полученной выборке
КонецЦикла;
Иначе // Сообщить(«Данные отсутствуют!»);
КонецЕсли;
&НаСервереБезКонтекста
Функция ПолучитьГУИДБитойССылкиНаСервере ( СсылкаНаОбъект ) // Вариант 1
Возврат XMLСтрока ( СсылкаНаОбъект );
&НаСервереБезКонтекста
Функция ПолучитьГУИДБитойССылкиЗапросомНаСервере ( СсылкаНаОбъект ) // Вариант 2 (запросом)
Запрос = Новый Запрос ;
Запрос . Текст = «ВЫБРАТЬ
| УНИКАЛЬНЫЙИДЕНТИФИКАТОР(&СсылкаНаОбъект) КАК ГУИД» ;
Запрос . УстановитьПараметр ( «СсылкаНаОбъект» , СсылкаНаОбъект );
РезультатЗапроса = Запрос . Выполнить ();
Записи = РезультатЗапроса . Выбрать ();
Если Записи . Следующий () Тогда
УИ = Записи . ГУИД ;
Иначе
УИ = XMLСтрока ( Справочники . Материалы . ПустаяСсылка ());
КонецЕсли;
Возврат XMLСтрока ( СсылкаНаОбъект );
&НаСервереБезКонтекста
Функция ПолучитьГУИДБитойССылки ( ГУИДОбъекта ) // Вариант 3 (самопис)
ГУИДСтр = СтрЗаменить ( ГУИДОбъекта , » (» , «» );
ГУИДСтр = СтрЗаменить ( ГУИДСтр , «)» , «» );
ГУИДСтр = СтрЗаменить ( ГУИДСтр , «0x» , «» );
ГУИДСтр = Сред ( ГУИДСтр , Найти ( ГУИДСтр , «:» )+ 1 , СтрДлина ( ГУИДСтр ));
// Преобразуем GUID
ГУИД = Сред ( ГУИДСтр , 25 , 8 )+ «-» + Сред ( ГУИДСтр , 21 , 4 )+ «-» + Сред ( ГУИДСтр , 17 , 4 )+ «-» + Сред ( ГУИДСтр , 1 , 4 )+ «-» + Сред ( ГУИДСтр , 5 , 12 );
Как получить уникальный идентификатор объекта, GUID?
GUID (Globally Unique Identifier) — статистически уникальный 128-битный идентификатор. Его главная особенность — уникальность, которая позволяет создавать расширяемые сервисы и приложения без опасения конфликтов, вызванных совпадением идентификаторов. Хотя уникальность каждого отдельного GUID не гарантируется, общее количество уникальных ключей настолько велико (2128 или 3,402 * 10в38), что вероятность того, что в мире будут независимо сгенерированы два совпадающих ключа, крайне мала.
Для получения уникального идентификатора объекта, используйте код вида:
Код 1C v 8.х
В 1С 7.7 можно получить так
Через v7plus.dll
Код 1C v 7.x

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