Как формируется GUID?

Публикация № 635159 16.06.17

Приемы и методы разработки - Практика программирования

GUID rfc

"Коллеги, есть идеи, как получить последнюю созданную характеристику? Реквизиты полностью идентичны(код, наименование, и т.п.)."(c) "Насколько я знаю, ссылка не обеспечивает последовательность, а только уникальность."(c) "Я сделал по Максимум(Ссылка). Но, чета, мне кажется, это неправильно."(c) "Слышал что в ГУИд содержится как раз время создания и по всей логике вещей сортировка по ссылке должна сортировать по моменту создания объекта"(c) Сколько раз вы слышали такие фразы? На удивление я не обнаружил информации по этой теме, пришлось разбираться самому...

Начнем издалека../

Что такое GUID или уникальный идентификатор объекта?
GUID (Globally Unique Identifier) - статический уникальный 128-битный идентификатор. Его главная особенность - уникальность, которая позволяет создавать расширяемые сервисы и приложения без опасения конфликтов, вызванных совпадением идентификаторов. Хотя уникальность каждого отдельного GUID не гарантируется, общее количество уникальных ключей настолько велико (2^128 или 3,4028*10^38), что вероятность того, что в мире будут независимо сгенерированы два совпадающих ключа, крайне мала.
GUID состоит из четырех частей разделенных символом тире и содержащих в сумме 32 символа, которые являются шестнадцатеричным представлением 16 байт (128 бит). Т.е. два символа в GUID (октет) – это один байт в шестнадцатеричном виде. Пример GUID: b0d4ce5d-2757-4699-948c-cfa72ba94f86
[1]

Почему используется guid, а не простой auto-increment(indentity)?
Для использования гуидов есть 2 причины:
- хотим чтобы база данных или какой-нибудь другой сервер(кластер) не имел централизованного управления генерацией ключей
- нужно избавиться от проблемы создания одинакового идентификатора на разных рабочих серверах
Такие проблемы обычно возникают в распределенной среде исполнения, а кластер серверов позиционируется как распределенный и желательно полностью избежать единой точки выдачи уникальных ключей.
Если ваша система не имеет таких требований, вам не нужен UUID.
[1] [2]

В чем разница между uuid и guid?
UUID это термин из стандарта rfc4122, который опубликует всемирная организация стандартизации eitf.
Грубо говоря GUID это то что получилось на практике у Microsoft. Теория различается с практикой так же, как и XML с HTML.
[1] [2]

В бд гуиды имеют тип binary(16) и сравниваются (сортируются) побитово как бинарные данные: binary bit-for-bit comparison behavior 

upd: Как преобразовывать binary(16) в GUID1C и обратно?

 
 T-SQL
 
 1C

Из чего состоит guid?
Определяется типом:
- Random: Just use the system’s random-number generator to create a 128-bit number.
- Time-based: Create a GUID based on the current time.
- Hardware-based: Make a GUID with certain portions based on hardware features, such as the MAC address of a network card.
- Content-based (MD5 or SHA-1 hash of data): Create a GUID based on a hash of the file contents. Files with the same contents will get the same GUID.
[1]

Как определить версию GUID?
Версия гуида определяется в старшем байте 7 октета.
b0:d4:ce:5d-27:57-46:99-94:8c-cf:a7:2b:a9:4f:86 

4 - random, 1 - Time-based
[1]

Почему нельзя упорядочить по ссылке, если в ней содержится дата создания?
Как уже было описано, guid изначально был придуман для РАСПРЕДЕЛЕННЫХ систем, в которых ПРОБЛЕМА УНИКАЛЬНОСТИ идентификаторов решена полным ОТКАЗОМ ОТ АВТОИНКРЕМЕНТА в пользу СЛУЧАЙНЫХ чисел и специальных техник. GUIDы случайны и неповторяемы по определению и в этом его достоинство и недостаток. Например, в предопределенных элементах и произвольных идентификаторах используется Random GUIDs (Version 4). В "типизированных" же Time-Based GUIDs (Version 1). 

Используются разные стандарты?
Да, но когда индексам БД приходится работать со случайными значениями ключей(см. B-Tree Insertion) возникают проблемы. 
[1] [2]

То есть для ссылок может создаваться Random GUID?
Только для предопределенных элементов и вручную созданных гуидов.

ГУИДВидНоменклатуры = Новый УникальныйИдентификатор();
ВидНоменклатурыСсылка = Справочники.ВидыНоменклатуры.ПолучитьСсылку(ГУИДВидНоменклатуры);
ВидНоменклатурыОбъект = Справочники.ВидыНоменклатуры.СоздатьЭлемент();
ВидНоменклатурыОбъект.УстановитьСсылкуНового(ВидНоменклатурыСсылка);
ВидНоменклатурыОбъект.Наименование = "тест";
ВидНоменклатурыОбъект.Записать();
Результат:
Ссылка    Код    Предопределенный    Наименование
4ad76228-517f-4496-aa6c-eef36d3de35a    000000001    истина    Товар        <-- Random UUID (version 3)
01d3ff0d-cc37-4863-adef-72d3b0dbf08a    000000002    истина    Продукция
623bca27-dffd-4391-b233-20ca170549d4    000000010    ложь      тест
769e3f33-50d7-11e7-bcda-94de807c3939    000000005    ложь      1            <-- Time-based UUID (version 1)
769e3f34-50d7-11e7-bcda-94de807c3939    000000006    ложь      2
769e3f35-50d7-11e7-bcda-94de807c3939    000000007    ложь      3

Первые три - random based, вторые три - time-based.

И все-таки?
Random UUIDs вызывают деградацию операций вставки. У таких гуидов индексы получаются плохо кластеризованы, дерево поиска максимально широкое. Для обхода этого недостатка был придуман COMB Guid - Combined Guid for the combination of a timestamp. Поэтому когда используюся Time-Based GUIDs для первичных ключей, они получаются более сгруппированными, но никак не последовательными. "Механизм генерации ссылок обеспечивает только их уникальность. Возрастающая последовательность при их генерации не обеспечивается." (c) БГ
[1]

Но у гуидов есть же последовательность? Что-то там про МоментВремени?
Да сколько можно? Нет у гуидов последовательности! Кто первый запросил - тому и выдается пул. А когда уж сеанс его исчерпает - зависит от него самого. Читаем подробнее про эксперимент с МоментомВремени.
//infostart.ru/public/84177/

Можно ли вытащить время из гуида?
Можно. Но не нужно.
bdb62d89-cede-11e4-b12b-d4ae52b5e909
Алгоритм:
дата содержится в первых символах, bdb62d89-cede-11e4 которые нужно переставить задом наперед: 11e4-cede-bdb62d89
первый символ отбрасываем, убираем "лишние" знаки "-"(тире)
интервал в десятых долях микросекунд (HEX) получается равным: интервал16= 1E4CEDEBDB62D89
переводим его в десяничный интервал интервал10 = HexToDec(интервал16);
в результате получаем: интервал10 = 136 461 344 788 852 105
находим интервал в секундах: интервалСек = интервал10 / 10 000 000;
Делаем сдвиг даты от 15.10.1582 г. + 13 646 134 478 + сдвиг на часовой пояс (Московское время) от "мирового времени" (GMT) = 20.03.2015 16:54:38
[1] [2] [3]

Почему части времени идут "задом-наперед"?
"Так сложилось" ;) 
Например потому что guid'ы появились задолго до того, как до них добрались руки ietf и баз данных.
Или потому что платформа написана на C, а не на Java, а как мы знаем из асемблера архитектура x86 имеет little-endian byte order.
Или, как говорит википедия, использовалось 2 варианта: для передачи по сети "on-wire" "network" (big-endian) byte order, а для хранения "native" (little-endian) byte order. 
В любом случая я не знаю как там было и можно только догадываться.
[1] [2] [3] [4]

А последние две части что значат?
bdb62d89-cede-11e4-b12b-d4ae52b5e909
Счетчик "уникальности" и физический MAC-адрес.

Почему нельзя использовать время из GUID?
Во-первых, гуид может быть случайным, а не основаным на времени.
Во-вторых, гуиды выдаются пулом по 32 штуки для каждого сеанса.
В-третьих, гуид случаен по своему стандарту и время в нем это лишь способ сгруппировать первичные ключи для уменьшения ширины В-дерева и ускорения операций вставки в кластерный индекс!
[1] [2] [3]

Если отчет из одной конфигурации копипастой тащу в другую - ID сохранится его?(в моей его не было) (c) 2michael

Ответ: При копировании объекта из одной конфы в другую _копипастом_ внутренний гуид меняется!
НО: при сравнении объединении этого не видно!, так как происходит сопоставление по имени.
НО: это не касается и предопределённых данных! Если добавлять их вручную, а потом конфу разработки сравнить-объединить с боевой - возникнут дубли в справочнике!
В edt же есть режим сравнения только по guid.

Именно поэтому создание нового объекта желательно делать через сравнение-объединение, иначе будет замедление на больших конфигурациях. Подробнее в ИТС: https://its.1c.ru/db/metod8dev/content/2299/hdoc

При замене отчета в дереве конфигурации командой "Заменить на внешнюю обработку, отчет..." меняется ли внутренний идентификатор объекта (отчета)? (с) Pandoch upd:02.07.20

Ответ: Нет, гуид при замене из файла остаётся прежним

Другая вариация вопроса: Есть две разные конфы. Но в них есть одинаковый объект метаданных например документ "Покупка". Как можно получить внутренний идентификатор этого объекта в обеих базах, используемый в сравнении и объединении, чтобы удостовериться, что этот объект, не зависимо от имени, замениться, а не дублируется ? Как я понял ЗначениеВСтрокуВнутр() дает не тот ID который нужен мне.

Вообще, внутренний идентификатор объекта программно узнать нельзя, а увидеть его можно в выгрузке конфигурации в файлы, строка <Report uuid="1ce0ffe7-2218-4d9d-88d5-d3eec204bfff">:

<MetaDataObject xmlns="http://v8.1c.ru/8.3/MDClasses" ... version="2.6">
<!--это внутренний гуид отчета:-->
	<Report uuid="98b2e87d-e5cc-449a-aeab-e4ca51d5c46a"> 
		<InternalInfo>
<!--это гуид типа объекта:-->
			<xr:GeneratedType name="ReportObject.ДебиторскаяЗадолжность" category="Object">
				<xr:TypeId>6737b9b2-732d-4051-8166-59d1d4209295</xr:TypeId>
				<xr:ValueId>b93b9dff-ff02-4fd6-860b-ce98ef64df97</xr:ValueId>
			</xr:GeneratedType>
<!--это гуид типа менеджера:-->
			<xr:GeneratedType name="ReportManager.ДебиторскаяЗадолжность" category="Manager">
				<xr:TypeId>b0291e09-dae8-47bb-b380-9c25be22fab3</xr:TypeId>
				<xr:ValueId>4bfb0318-b989-43c3-937d-b32ac8b80385</xr:ValueId>
			</xr:GeneratedType>

 

При каждой выгрузке во внешний отчет/обработку guid генерируется заного. При загрузке из файла - востанавливается. Это позволяет хоть 10 раз выгрузить отчет/обработу во внешний файл, и каждый из этих файлов можно будет открыть параллельно в клиенте.

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

МенеджерОтчета = Отчеты.ДебиторскаяЗадолжность;
Сообщить(ТипЗнч(МенеджерОтчета));   // Отчет менеджер: Дебиторская задолжность
Сообщить(ЗначениеВСтрокуВнутр(МенеджерОтчета)); // {"#",b0291e09-dae8-47bb-b380-9c25be22fab3,

ОбъектОтчета = Отчеты.ДебиторскаяЗадолжность.Создать();
Сообщить(ТипЗнч(ОбъектОтчета));					// Отчет объект: Дебиторская задолжность
Сообщить(ЗначениеВСтрокуВнутр(ОбъектОтчета));	// {"#",6737b9b2-732d-4051-8166-59d1d4209295}

МетаданныеОтчета = Метаданные.Отчеты.ДебиторскаяЗадолжность; 
Сообщить(ТипЗнч(МетаданныеОтчета));   // Объект метаданных
Сообщить(ЗначениеВСтрокуВнутр(МетаданныеОтчета)); // {"#",9fb58eea-17f2-4200-b105-b288d62f4303}

МетаданныеЯзыка = Метаданные.Языки.Русский;
Сообщить(ТипЗнч(МетаданныеЯзыка));   // Объект метаданных
Сообщить(ЗначениеВСтрокуВнутр(МетаданныеЯзыка)); // {"#",9fb58eea-17f2-4200-b105-b288d62f4303}

// выводит тоже самое, так как это гуид типа встроенного в платформу


Все типы имеют свои идентификаторы, но при загрузке через "Заменить на внешнюю обработку, отчет..." они, так же как и идентификатор метаданных, заменяются на текущие.

Например - загрузка в отчет ABCАнализПокупателей внешнего отчета ДебиторскаяЗадолжность.epf вызовет лишь добавление суффикса (такой отчет уже есть в конфигурации), а все идентификаторы остаются прежними.

Скрин до загрузки - после загрузки:

Идентификаторы не изменились.

Почему используется "перевернутый" формат UUID внутри 1с? 
<Объект не найден> (26:80f408002771598b11e7a3f0a3a64c3b)
Не знаю. Знаю только что первая цифра соответствует имени таблицы в sql: Reference26 -> ВидыНоменклатуры  


[1]

Есть же спецификация?
Есть.

bdb62d89-cede-11e4-b12b-d4ae52b5e909

   Layout

   0               1               2               3               
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                          time_low                             |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |       time_mid                |         time_hi_and_version   |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |clk_seq_hi_res |  clk_seq_low  |         node (0-1)            |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                         node (2-5)                            |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   
   
   Bit mask
   
   FFFFFFFF-0000-0000-0000-000000000000 time_low 
   00000000-FFFF-0000-0000-000000000000 time_mid 
   00000000-0000-F000-0000-000000000000 version 
   00000000-0000-0FFF-0000-000000000000 time_hi
   00000000-0000-0000-C000-000000000000 variant 
   00000000-0000-0000-3FFF-000000000000 clock_seq
   00000000-0000-0000-0000-FFFFFFFFFFFF node
   
   Byte order
   
   Field                  Data Type     Octet  Note
                                        #

   time_low               unsigned 32   0-3    The low field of the
                          bit integer          timestamp

   time_mid               unsigned 16   4-5    The middle field of the
                          bit integer          timestamp

   time_hi_and_version    unsigned 16   6-7    The high field of the
                          bit integer          timestamp multiplexed
                                               with the version number

   clock_seq_hi_and_rese  unsigned 8    8      The high field of the
   rved                   bit integer          clock sequence
                                               multiplexed with the
                                               variant

   clock_seq_low          unsigned 8    9      The low field of the
                          bit integer          clock sequence

   node                   unsigned 48   10-15  The spatially unique
                          bit integer          node identifier

 

Расшифровываю:
Timestamp - это 60-битное число, содержащее количество 100-наносекундных интервалов с 15 октября 1582 г.
Часть low обнуляется каждые 2^32 / 10^7 / 60 ~ 7 минут, часть mid через 1 год, часть hi сами представляете.

Version - старшие 4 бита в седьмом октете, содержат тип гуида.
0x0001   1   time-based version
0x0010   2   DCE Security version (POSIX UIDs)
0x0011   3   name-based version (MD5 hashing)
0x0100   4   randomly generated version
0x0101   5   name-based version (SHA-1 hashing)


Clock Sequence - используется чтобы избежать появления дубликатов, когда часы переводятся назад или меняется идентификатор узла. Если предыдущее  значение счетчика известно - то увеличивается на единицу, иначе берется случайное число. 

Node - содержит физический MAC-адрес сервера. Дада, проверьте ipconfig /all  ;)

Примеры? Есть их у меня.
Мы же "программисты", накодим функции:

 
 Код
// Возвращает время создания GUID'а
//
Функция UUID_Timestamp(ГУИД)
        
    // Например ГУИД равен: bdb62d89-cede-11e4-b12b-d4ae52b5e909
    // Дата содержится в первых символах, bdb62d89-cede-11e4 которые нужно переставить задом наперед: 11e4-cede-bdb62d89
    Строка16 = Сред(ГУИД, 15, 4) + Сред(ГУИД, 10, 4) + Сред(ГУИД, 1, 8);
    
    // Убираем "лишние" знаки "-"(тире).
    Строка16 = СтрЗаменить(Строка16, "-", "");
    
    // Убираем первый символ, так как в нем содержится версия стандарта (зашит в седьмой октет)
    Строка15 = Сред(Строка16, 2);
    
    // Получаем timestamp в 60 бит : 1E4 CEDE BDB6 2D89
    ЧислоСек = 0;
    Для Позиция = 1 По СтрДлина(Строка15) Цикл
        ЧислоСек = ЧислоСек + Найти("123456789abcdef",Сред(Строка15,Позиция,1))*Pow(16,СтрДлина(Строка15) - Позиция);
    КонецЦикла;
    ЧислоСек = ЧислоСек / 10000000;
    
    // Прибавляем к дате начала Григореанского календаря
    Возврат Дата(1582, 10, 15, 00, 00, 00) + ЧислоСек + СмещениеСтандартногоВремени() + СмещениеЛетнегоВремени();;
    
КонецФункции

// Возвращает версию GUID'а
//
Функция UUID_Version(ГУИД)
    
    // Пусть ГУИД равен: bdb62d89-cede-11e4-b12b-d4ae52b5e909
    // Тогда номер версии содержится в старшем байте седьмого октета
    Версия = Сред(ГУИД, 15, 1)*1;
    
    СтрокаВерсий = "Version 1. Time-based
    | Version 2. DCE Security (POSIX)
    | Version 3. Name-based (MD5 hashing)
    | Version 4. Random
    | Version 5. Name-based (SHA-1 hashing)
    | Unknown version";
    
    Возврат СтрПолучитьСтроку(СтрокаВерсий, Мин(СтрЧислоСтрок(СтрокаВерсий), Версия));
    
КонецФункции

// Возвращает mac-адрес сервера
//
Функция UUID_Node(ГУИД)

    // Пусть ГУИД равен: bdb62d89-cede-11e4-b12b-d4ae52b5e909
    // Тогда MAC-адрес в последней части
    Строка12 = Сред(ГУИД, 25);
    
    // Разделим на октеты
    Результат = "";
    Для Позиция = 1 По СтрДлина(Строка12) Цикл
        Если Позиция % 2 = 1 Тогда
            Результат = Результат + " ";
        КонецЕсли;
        Результат = Результат + ВРЕГ(Сред(Строка12,Позиция,1));
    КонецЦикла;
    Результат = СтрЗаменить(СокрЛП(Результат), " ", ":");
    
    Возврат Результат;
    
КонецФункции

 

Проверим ссылку обычного документа:

    // Вытащим информацию из ссылки, созданной системой
    Выборка = Документы.ПоступлениеТоваровУслуг.Выбрать( , , , "Дата УБЫВ");
    Если Выборка.Следующий() Тогда
        ГУИД = Выборка.Ссылка.УникальныйИдентификатор();
        Сообщить("Ссылка: " + Выборка.Ссылка);
        Сообщить("GUID: " + ГУИД);
        Сообщить("Дата создания: " + UUID_Timestamp(ГУИД));
        Сообщить("Версия: " + UUID_Version(ГУИД));
        Сообщить("MAC-адрес хоста: " + UUID_Node(ГУИД));
    КонецЕсли;
    
    // Получим:
    //Ссылка: Поступление товаров и услуг ВА000000560 от 06.06.2017 0:00:01
    //GUID: a7de1f17-4a83-11e7-9e20-0021918e8333
    //Дата создания: 06.06.2017 10:44:57
    //Версия: Version 1. Time-based
    //MAC-адрес хоста: 00:21:91:8E:83:33

Проверим ссылку, сформированную вручную:

    // Вытащим информацию из ссылки, созданной &НаКлиенте
    ДокСсылка = Документы.ПоступлениеТоваровУслуг.ПолучитьСсылку(Новый УникальныйИдентификатор());
    ГУИД2= ДокСсылка.УникальныйИдентификатор();
    Сообщить("Ссылка нового: " + ДокСсылка);
    Сообщить("GUID нового: " + ГУИД2);
    Сообщить("Версия нового: "+ UUID_Version(ГУИД2));
    
    //Ссылка нового: <Объект не найден> (152:936654ac78639f43411ad7a77db94d48)
    //GUID нового: 7db94d48-d7a7-411a-9366-54ac78639f43
    //Версия нового:  Version 4. Random

Проверим работу счетчика "уникальности":

    // Проверим работу clock_seq
    Для й=1 по 32 Цикл
        НачатьТранзакцию();
        ВидНоменклатураОбъект = Справочники.НоменклатураТест.СоздатьЭлемент();
        ВидНоменклатураОбъект.наименование = "тест1";
        ВидНоменклатураОбъект.Записать();
        ГУИД = ВидНоменклатураОбъект.Ссылка.УникальныйИдентификатор();
        Сообщить(ГУИД);
        ОтменитьТранзакцию();
    КонецЦикла;
    
    // переведем время на минуту назад
    КомандаСистемы("time "+Формат(ТекущаяДата()-60, "ДФ='hh:mm:ss tt'")); 
    
    // Выберем весь старый пул
    Для й=1 по 32 Цикл
        НачатьТранзакцию();
        ВидНоменклатураОбъект = Справочники.НоменклатураТест.СоздатьЭлемент();
        ВидНоменклатураОбъект.наименование = "тест2";
        ВидНоменклатураОбъект.Записать();
        ГУИД = ВидНоменклатураОбъект.Ссылка.УникальныйИдентификатор();
        Сообщить(ГУИД);
        ОтменитьТранзакцию();
    КонецЦикла;
    
    // Получим:
    //...
    //81c42878-526c-11e7-80f0-08002771598b
    //81c42879-526c-11e7-80f0-08002771598b
    //81c4287a-526c-11e7-80f0-08002771598b
    //723dee43-526c-11e7-80f1-08002771598b
    //723dee44-526c-11e7-80f1-08002771598b
    //...

Можно даже так:

НачатьТранзакцию();

ГУИД = Новый УникальныйИдентификатор("deadbeef-d7a7-411a-9366-defaced0babe");
НовыйОбъект = Справочники.Номенклатура.СоздатьЭлемент();
НовыйОбъект.УстановитьСсылкуНового(Справочники.Номенклатура.ПолучитьСсылку(ГУИД));
НовыйОбъект.ВидНоменклатуры = Справочники.ВидыНоменклатуры.ПолучитьСсылку(ГУИД);
НовыйОбъект.Наименование = "Свежее мясо";
НовыйОбъект.ОбменДанными.Загрузка = Истина;
НовыйОбъект.Записать();

Сообщить("GUID нового: " + НовыйОбъект.Ссылка.УникальныйИдентификатор());
Сообщить("Реквизит нового: " + НовыйОбъект.ВидНоменклатуры);

ОтменитьТранзакцию();

//GUID нового: deadbeef-d7a7-411a-9366-defaced0babe
//Реквизит нового: <Объект не найден> (5433:9366defaced0babe411ad7a7deadbeef)


Какой мак-адрес у меня, вы уже знаете ;)

ps: под "упорядочить по ссылке" везде имеется ввиду сортировка в порядке создания ссылок и вообще в каком-либо порядке, отличном от сравнения в побитовом бинарном формате хранения бд.

Ну вот и все.

Надеюсь, теперь мысль о том, чтобы "упорядочить по ссылке", я из вас вытряхнул окончательно.

;-P

Специальные предложения

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. nytlenc 16.06.17 13:15 Сейчас в теме
13. starik-2005 2579 19.06.17 12:22 Сейчас в теме
Блин, хотел как в (1), но уже )))
2. Идальго 201 16.06.17 13:45 Сейчас в теме
3. NoRazum 29 16.06.17 14:07 Сейчас в теме
как долго шел к сути ответа.
Отличная статья.
4. kolya_tlt 72 16.06.17 15:00 Сейчас в теме
5. dmpas 16.06.17 15:06 Сейчас в теме
(4) знать, не задавать вопросов и давать ссылку тем, кто не знает и задаёт вопросы.
user717534; davdykin; Terabaytus; FrancuzbyGmailcom; ivangrant; ComradV; user1058210; Lazio; VasDmi666; EVKash; NN2P; DoctorRoza; WellMaster; _Farsh_; oleg-x; mvgfirst; frkbvfnjh; wowik; Plotks2017; t.v.s.; Tavalik; Liris; SeiOkami; mpeg1989; tara84; йцукенг; zqzq; KroVladS; i_a; YanTsys; Gureev; herfis; Gluk_1C; ice-net; japopov; Saint13; SazhnevDI; sorb; monkbest; Ганс; Vladimir Litvinenko; sergpogo; DarkAn; starik-2005; kolya_tlt; JohnyDeath; bulpi; jaroslav.h; CyberCerber; +49 Ответить
6. dgolovanov 16.06.17 15:17 Сейчас в теме
"Надеюсь, теперь мысль о том, чтобы "упорядочить по ссылке", я из вас вытряхнул окончательно."
Ну или ставить галку "Автоупорядочивание" ))
7. NN2P 390 16.06.17 15:17 Сейчас в теме
Так держать, Николай! Отличная статья!
8. panvartan 16.06.17 15:21 Сейчас в теме
Кто-нибудь знает, почему в измерениях регистра накопления нельзя использовать уникальный идентификатор?
9. корум 285 16.06.17 15:27 Сейчас в теме
(8) а почему решил, что нельзя?
Записывай как строку и вперёд.
61. kirinalex 13 08.09.20 14:06 Сейчас в теме
(9) в ms sql представление уида строкой занимает в 4 раза больше места, т.к. каждый байт уида представлен двумя символами 16-ричного формата + каждый полученый символ хранится в формате уникод т.е. занимает 2 байта
10. panvartan 16.06.17 16:35 Сейчас в теме
(8) а почему решил, что нельзя?
Записывай как строку и вперёд.

Поэтому и спрашиваю - почему отсутствует нативный способ выбора типа "уникальный идентификатор", в регистре сведений он же присутствует. Может причина в нежелательности его использования.
62. SeiOkami 2535 15.10.20 08:52 Сейчас в теме
(10) а что с этим потом делать и как работать?
Делаешь ссылочный тип - вот и гуид.
Выйдет тоже самое, но так ты хотя бы сможешь нормально работать с той же формой списка и отчётами
26. sdv91 11 26.06.17 15:13 Сейчас в теме
(8)В измерениях регистра использовать строки - это треш.
Windsor77; the1; +2 1 Ответить
45. Plotks2017 259 14.02.19 10:30 Сейчас в теме
(26)
8)В измерениях регистра использовать строки - это треш.

почему?
kirinalex; 🅵🅾️🆇; +2 Ответить
11. bforce 463 16.06.17 22:40 Сейчас в теме
Не думал, что будет интересно. Но автору удалось. Узнал новые аспекты и позаимствовал себе
СмещениеСтандартногоВремени() + СмещениеЛетнегоВремени()


Спасибо!
kirinalex; +1 Ответить
12. PerlAmutor 126 17.06.17 07:23 Сейчас в теме
Если кому интересно почему дата 15.10.1582. В этот день Папа Римский ввел Григорианский календарь взамен Юлианского.

использовалось 2 варианта: для вередачи по сети

Поправьте опечатку.

Есть вопрос. MAC адрес берется клиента или сервера?

Упорядочивать по времени не будем, а вот отсечь какие-нибудь элементы справочника на основе времени полученного из UUIDA все-таки можно.
Windsor77; PowerBoy; user707374_exchang; Solovyeff; kare; +5 Ответить
14. Region102 20.06.17 21:14 Сейчас в теме
А можно как-то сформировать GUID на php? Просто пишу front для 1С и охота чтобы при отсутствии связи с 1С можно было создавать элементы в MySQL, а потом синхронить их с 1С с готовыми GUID.
15. starik-2005 2579 20.06.17 22:57 Сейчас в теме
(14)
А можно как-то сформировать GUID на php?
Так.
CratosX; Поручик; +2 Ответить
16. Region102 21.06.17 04:30 Сейчас в теме
(15) Спасибо, слона то я и не заметил )
36. Поручик 4553 30.09.17 00:01 Сейчас в теме
(15) Надо же, я тоже не знал. А вещь в моём деле нужная.
30. YanTsys 12 25.09.17 19:30 Сейчас в теме
(14) В GUID насколько я в курсе зашит еще и уникальный код типа объекта, причем не уверен что в разных базах построенных на одном и том же шаблоне конфигурации у одного и того же типа объекта метаданных будет одинаковый.

И если вы напишете код который для вашей организации будет создавать GUID для нового документа с типом Документ.МойКрутойАвансовыйОтчет то далеко не факт что на такой же аналогичной конфигурации в другой базе вашей компании этот код даст работоспособный GUID, придется перепроверять.
31. kuzyara 1221 26.09.17 10:05 Сейчас в теме
(30) В принципе верно, только не зашит, а подставляется, не в GUID, а в представление ссылки, не код, а номер таблицы sql, не уникальный, а порядковый ;)
Windsor77; Sapiens_bru; EugeneSemyonov; Gaster; POWone; CratosX; ulen; JohnyDeath; Vladimir Litvinenko; deaddy64; Vyacheslav_Kochnev; SeiOkami; zqzq; PowerBoy; +14 Ответить
79. ArsenProg 12.12.21 05:50 Сейчас в теме
(31) Выдернуть бы еще ответственного кто создал по GUID
17. Aprobator 21.06.17 10:01 Сейчас в теме
Вот спасибо! Теперь буду знать, что гуид уникален не в рамках одной базы 1с. А то по дурости (незнанию - эти понятия недалеко друг от друга ушли), в правилах конвертации отключал поиск по уникальному идентификатору. Надо было, реально, самому погуглить, а что же такое GUID.
19. Трактор 1233 21.06.17 10:38 Сейчас в теме
(17)
Теперь буду знать, что гуид уникален не в рамках одной базы 1с.

Всё несколько печальнее. Гуид МОЖЕТ быть уникален не в пределах одной базы. Практически же в одной базе может существовать несколько объектов с одинаковым гуид. В разных таблицах.
Я столкнулся с этим, когда пользовал конвертацию данных. Конвертация данных сохраняет идентификатор объекта при передаче его в другую базу. Если одному источнику соответствует несколько получателей, то мы получим в одной базе несколько объектов с одинаковы гуид.
Например, при переходе с УТ10 на УТ11 справочник контрагенты передаётся в справочники контрагенты и партнёры. При этом гуиды у контрагента и партнёра получаются одинаковыми.
Ermigen; EugeneSemyonov; SirAlexIT; wowik; CratosX; red80; +6 Ответить
20. Aprobator 21.06.17 11:46 Сейчас в теме
(19) интересно однако. Но, я так понимаю, на перенос данных через конвертацию это не особо повлияло, поскольку поиск по идентификатору должен идти в рамках определенного объекта метаданных?
24. Altair777 643 22.06.17 17:42 Сейчас в теме
(19) не так давно встретился с ситуацией когда гуиды были не уникальны в разных базах. Когда нужно было по-быстрому развернуть новую базу - скопировали старую. Грохнули документы, а справочники оставили. Вместе с их гуидами
22. Трактор 1233 21.06.17 13:34 Сейчас в теме
18. baclanov 21.06.17 10:35 Сейчас в теме
Замечательная статья! Считаю, что тема раскрыта не полностью, скромно опущен "идентификатор метаданных" ({"#",643bfde6-77a8-4438-874d-733071adf65e,373:a2b40050569302c311e73a3f23930d2d}), а об этом хотелось бы узнать по-подробнее.
23. brr 181 21.06.17 13:43 Сейчас в теме
55. kuzyara 1221 05.09.19 12:03 Сейчас в теме
(18) baclanov, это идентификатор типа ссылки. Сравните:
_а1 = значениевстрокувнутр(Тип("Массив"));
_а2 = значениевстрокувнутр(новый("Массив"));
//{"T",51e7a0d2-530b-11d4-b98a-008048da3034}
//{"#",51e7a0d2-530b-11d4-b98a-008048da3034,{0}}
_б1 = значениевстрокувнутр(Тип("ТекстовыйДокумент"));
_б2 = значениевстрокувнутр(новый("ТекстовыйДокумент"));
//{"T",ebf766b1-f32c-11d3-9851-008048da1252}
//{"#",ebf766b1-f32c-11d3-9851-008048da1252,{0,{#base64:77u/}}}
_в1 = значениевстрокувнутр(Тип("СправочникСсылка.Справочник1"));
_в2 = значениевстрокувнутр(справочники.справочник1.пустаяссылка());
_в3 = значениевстрокувнутр(справочники.справочник1.первый);
//{"T",03f456d1-078b-47bd-821e-1d16c25cdd8d}
//{"#",03f456d1-078b-47bd-821e-1d16c25cdd8d,10:00000000000000000000000000000000}
//{"#",03f456d1-078b-47bd-821e-1d16c25cdd8d,10:9db766f0d06c0eb24ef19d0bbdc5c7af}
Показать

_Все_ внутренние типы данных имеют идентификатор, в том числе и объекты типа ссылка. Любая ссылка состоит из идентификатора типа, и, собственно, самой ссылки. https://infostart.ru/public/196623/

Идентификатор же объекта метаданных программно получить нельзя, только выгрузкой конфигурации в файлы.
57. kuzyara 1221 31.01.20 12:34 Сейчас в теме
21. vladismi 163 21.06.17 12:05 Сейчас в теме
25. AlexGroovy 23.06.17 07:30 Сейчас в теме
Очень мощная и полезная статья.Автору большой респект!
27. koshak84 8 29.06.17 07:21 Сейчас в теме
Как-то была задача во все документы добавить реквизит "Дата создания документа". Для всех существующих документов заполнить эту дату автоматически на основании GUID. Документов было более миллиона. У всех дата из GUID сформировалась в принципе правильно. Т.е. можно сделать вывод, что в 1С (по крайней мере на платформе 8.1) используется Time-Based GUIDs.
28. Irwin 380 25.09.17 09:50 Сейчас в теме
Дополню немного статью комментарием сотрудника 1С на форуме:
Внесем некоторую ясность. Ссылка и UUID - это разные вещи. Но при этом существует однозначное преобразование UUID в ссылку и наоборот. Ссылка представляет собой массив из 16 байт. Если рассматривать UUID как последовательность байт, то получается что в ссылке те же самые байты переставлены в другом порядке. Определение структуры GUID можно найти в файле Guiddef.h Windows SDK. Выглядит она следующим образом:

typedef struct _GUID {
unsigned long Data1;
unsigned short Data2;
unsigned short Data3;
unsigned char Data4[ 8 ];
} GUID;

В ссылке данные переставлены следующим образом:
- Data4 - 8 байт
- 1-й байт Data3
- 0-й байт Data3
- 1-й байт Data2
- 0-й байт Data2
- 3-й байт Data3
- 2-й байт Data3
- 1-й байт Data3
- 0-й байт Data3

При автоматической генерации ссылок, UUID'ы, используемые для получения ссылок, генерируются в Windows с помощью функции Win32 API UuidCreateSequential(). В результате ссылки, полученные по последовательно сгенерированным UUID'ам отличаются в байтах с максимальными индексами. То есть две последовательно сгенерированные ссылки будут отличаться значениями байтов с индексом 15 (0-базированный индекс).
Такая дисциплина генерации ссылок дает очень компактные индексы по ссылкам в файловой базе данных, так как в терминальных страницах индекса (листьях дерева) для упаковки ключей используется общий префикс. Другими словами, на терминальной странице индекса целиком обязательно записывается только первый ключ. Если последующий ключ имеет общий префикс с предыдущим, то для последующего ключа записываются только отличающиеся хвостовые байты.
Еще одной особенностью является то, для автоматической генерации ссылок, соединение с базой данных получает сразу пакет из последовательно сгенерированных UUID'ов. Размер пакета равен 64. При необходимости генерации новой ссылки используется очередной UUID из этого пакета. Как только пакет заканчивается соединение запрашивает новый пакет и т. д. Пакеты были введены для борьбы с неприятными последствия KeyRange блокировок, используемых MS SQL Server в режиме изоляции транзакций SERIALIZABLE. Не вдаваясь в излишние подробности, рассмотрим простой пример. Если в режиме SERIALIZABLE в рамках транзакции выполнить SELECT с WHERE <ссылка>=<значение ссылки>, то для индекса, построенного по ссылке, до конца транзакции окажется заблокированным диапазон ключей от ближайшего меньшего, чем <значение ссылки> до ближайшего большего, чем <значение ссылки>. (Если ближайшего меньшего или ближайшего большего нет, то блокируется все начало или весь хвост индекса.) Соответственно, внесение другими транзакциями новых записей с ключами попадающими в этот диапазон будет заблокировано до завершения транзакции, заблокировавшей диапазон.
Пакеты ссылок позволяют возможное пространство ключей разделить на диапазоны, каждый из которых "принадлежит" определенному соединению. Диапазоны непостоянны и меняются со временем. Но в идеальном случае такой диапазон с одной стороны ограничен максимальной использованной ссылкой из пакета, принадлежащего данному соединению, а с другой стороны - минимальной ссылкой из пакета, принадлежащего другому соединению.
В режиме управляемых блокировок режим SERIALIZABLE не используется и использование пакетов в значительной мере утратило свой смысл.
Показать

Источник: [1]
Ermigen; kuzyara; d4rkmesa; CratosX; Sodrugestvo; sashocq; KilloN; Dach; TIS_08; herfis; +10 Ответить
29. TIS_08 93 25.09.17 13:00 Сейчас в теме
48. MrTom 14.02.19 20:10 Сейчас в теме
(28) Я думаю это знает любой, кто работал с битыми ссылками.

Битая ссылка имеет вид <Объект не найден> (77:805f000c291e652311e0ad237dea6181). Здесь 77 - это номер таблицы, т.е. тип объекта, об этом уже говорили выше. А строка после двоеточия - это и есть ссылка.

Если получить ссылку в УФ-базе по кнопке "Получить ссылку", то она будет вот такой:
e1cib/data/Справочник.Контрагенты?ref=80c574d43512a57311e5ffc8937f5c0f
Здесь тип указан строкой, а ссылка идет после "ref="


Вот код, который получает GUID из ссылки (писал очень давно и для себя :) )

  Поз = Найти(СсылкаУИД, "ref=");
	Если Поз=0 Тогда
		Поз = Найти(СсылкаУИД, ":");
		Поз = ?(Поз=0, 0, Поз+1);
	Иначе
		Поз = Поз+4;
	КонецЕсли;		
		
	Если Поз=0 Тогда
		Предупреждение("Ссылка имеет неизвестный формат");
	Иначе
		Стр = Сред(СсылкаУИД, Поз, 32);
		УИД = Прав(Стр,8)+"-"+Сред(Стр,21,4)+"-"+Сред(Стр,17,4)+"-"+Лев(Стр,4)+"-"+Сред(Стр,5,12);
	КонецЕсли;
Показать

Одинаковые ссылки с разными типами встречаются не так уж редко даже в одной базе.
Aleskey_K; garibyanlev; +2 1 Ответить
32. red80 27.09.17 09:34 Сейчас в теме
А у кого нибудь были одинаковые GUID разных объектов? У меня - да.
33. Arxxximed 9 27.09.17 11:13 Сейчас в теме
(32) Брехня )))) Наверняка объекты в разных таблицах и получены переносом данных или конвертации ....
В (19) уже это рассмотрели.
34. red80 27.09.17 11:43 Сейчас в теме
(33) Одинаковые GUID в разных таблицах одной базы. Были выявлены при выгрузке из нескольких типов документов (Реализация, Авансовый, РозничныеПродажи, ЧекККМ, ОтчетКомиссионера,...) одной базы в документы ВводОстатков другой базы с сохранением GUID документа-источника в документе-приемнике. Что в базе делали до меня - хз.
35. anatoliy.kichuk 83 29.09.17 09:43 Сейчас в теме
Въедлив - крут! Статья интересная!
37. tormozit 6470 30.09.17 09:31 Сейчас в теме
Надеюсь, теперь мысль о том, чтобы "упорядочить по ссылке", я из вас вытряхнул окончательно.
Рекомендую явно указать, что имеется ввиду "упорядочить по ссылке для получения порядка создания". Иначе неподготовленный читатель может сделать неправильный вывод.
38. kuzyara 1221 02.10.17 11:30 Сейчас в теме
(37) Да нет, все правильно. Гуиды практически случайны и упорядочивание по ним бессмысленно.
ИТС: Особенности упорядочивания по ссылочным полям

Ссылка - это идентификатор объекта в информационной базе. Как ФИО для человека. Какой смысл выяснять, кто больше, Иванов Иван Иванович или Сидоров Сидор Сидорович?

Так же и в языке запросов, только сначала сравнивается номер таблицы.
Упорядочивание по ссылке - есть упорядочивание по бинарному представлению GUID.
39. tormozit 6470 02.10.17 11:53 Сейчас в теме
(38) Не соглашусь.
1. Если надо упорядочить по моменту времени, то я использую дату + ссылку (ГУИД).
2. Если надо получить стабильный порядок ссылок, то я сделаю упорядочивание по ссылке (ГУИД).
Irwin; kirinalex; JohnyDeath; kuzyara; +4 Ответить
40. kuzyara 1221 02.10.17 13:08 Сейчас в теме
(39) Спасибо, меня смутила формулировка. Упорядочивание по ссылке в пределах секунды действительно имеет смысл для работы с моментом времени. А по второму пункту?
41. tormozit 6470 02.10.17 13:54 Сейчас в теме
42. PerlAmutor 126 30.03.18 11:38 Сейчас в теме
(40) Нашел интересное, на мой взгляд, применение вашим изысканиям.
В БСП есть механизм регламентного удаления помеченных на удаление объектов.
В обработке идет вызов стандартной функции НайтиПомеченныеНаУдаление(), которая возвращает массив ссылок.
Проход по этому массиву идет с обратным индексом, с конца к началу. Ваша функция получения времени из ссылки помогла определить как именно распределяются объекты в этом массиве по дате создания. И я пришел к выводу, что ссылки в этом массиве располагаются в последовательности прохождения по дереву метаданных, т.к. типы ссылок сгруппированы. Соответственно объекты в этом массиве разбросаны по датам создания и вот чем это плохо:
- У меня больше 50 000 помеченных на удаление объектов, большая часть из которых Ключи Аналитики Учета Номенклатуры.
При каждом запуске удаления до "свежепомеченных" объектов дело почти никогда не доходит, т.к. регламентое задание может выполняться больше недели в поисках всех ссылок на эти ключи и это ненормально
- Регламентное задание каждый раз перелопачивает одни и те же данные снова и снова, хотя заранее и так понятно, что объекты эти не будут удалены никогда, период закрыт. Некоторые объекты полуинформативные, и к сожалению заменить их тоже не чем.

В общем есть мысль пересортировать массив помеченных таким образом, чтобы объекты помеченные в последнее время удалялись первыми, а старье и объекты с программно установленным Уникальным Идентификатором без даты оказывались в конце списка.
CheBurator; +1 Ответить
63. Cyberhawk 130 18.10.20 13:51 Сейчас в теме
(42)
заранее и так понятно, что объекты эти не будут удалены никогда, период закрыт
А снять с таких объектов пометку удаления что мешает?
64. user1464234 18.10.20 14:02 Сейчас в теме
(63) в новых конфигурациях есть функционал "архив", когда элементы не показываются в списке для выбора, а в старых только пометка удаления и при быстром выборе не из справочника она не видна.
65. Cyberhawk 130 18.10.20 14:06 Сейчас в теме
(64) Но разве интерактивный показ / выбор ключей аналитики - это какой-то пользовательский и/или высокочастотный сценарий, чтобы ради него продолжать удерживать эти ключи помеченными на удаление?
66. user1464234 18.10.20 14:14 Сейчас в теме
(65) ключи аналитики вообще все помеченные на удаление держим, чтобы при удалении помеченных не блокировали. Или вручную каждый ключ отдельно в обработке удаления.
К выбору из списка отношения не имеет, как и к теме статьи.
67. Cyberhawk 130 18.10.20 15:04 Сейчас в теме
(66)
чтобы при удалении помеченных не блокировали. Или вручную каждый ключ отдельно в обработке удаления
Типовая обработка удаления, увы, в этом плане весьма неудобна.
А описанный кейс легко решается в любой нетиповой обработке удаления, которая умеет автоматически помечать на удаление выбранные типы объектов метаданных, чтобы они не блокировали удаление, а удалялись вместе со ссылающимися на них объектами.
Неужели вы там у себя заранее держите ключи помеченными на удаление ради пользователей, которые что-то удаляют через типовую обработку удаления?
68. user1464234 18.10.20 15:08 Сейчас в теме
(67) надеюсь уже нет, я тогда на инфостарт не заходила, только типовое из коробки/диска итс использовала или что сама напишу. Спасибо что напомнили. То что диск ИТС теперь на инфостарте это радует.
69. PerlAmutor 126 18.10.20 15:11 Сейчас в теме
(63) То, что при желании можно открыть себе дату запрета и начать наводить порядок выборочно. А если снимешь пометку удаления, то уже при удалении какого-нибудь документа - ключик останется в базе. Т.е. теряем информацию о его ненужности.
70. Cyberhawk 130 18.10.20 15:14 Сейчас в теме
(69)
теряем информацию о его ненужности
А кто и как этой информацией сейчас пользуется?
71. PerlAmutor 126 18.10.20 15:18 Сейчас в теме
(70) Никто, не хватает рук и времени наводить порядок в базе.
72. Cyberhawk 130 18.10.20 15:20 Сейчас в теме
(71) А как ключ стал помеченным на удаление в первый раз? В результате каких / чьих действий и зачем?
73. PerlAmutor 126 18.10.20 15:42 Сейчас в теме
(72) Создали дубль номенклатуры, пользователи понацепляли в документы. Затем дубль обнаружили и давай заменять все ссылки одной номенклатуры на другую по всей базе. В итоге имеем 2 ключа аналитики, где ссылка на номенклатуру одна и та же. Лишнее помечали на удаление... А вот заменить один ключ другим по всей базе никто не удосужился (решение тоже не самое лучшее, т.к. возникают проблемы в регистрах накоплениях - записи становятся не уникальными). А делали всё это люди, которые мало понимали как работает ERP.
Cyberhawk; +1 Ответить
43. Shaka13 29.08.18 10:29 Сейчас в теме
а как, например "b0d27f78-dc86-11e6-898b-bcaec5369a36" преобразовать в бинарник и наоборот из бинарника сделать "b0d27f78-dc86-11e6-898b-bcaec5369a36"?
44. kuzyara 1221 30.08.18 06:48 Сейчас в теме
(43)
// Преобразует ГУИД из формата 1С в формат SQL
Функция ГУИДдляSQL(Строка) Экспорт 
Если ПустаяСтрока(Строка) Тогда 
Возврат Строка; 
КонецЕсли; 
Результат = ""; 
Строка = СтрЗаменить(СтрЗаменить(СтрЗаменить(Строка, "-",""), "{", ""), "}", ""); 
СтрокаПозиций = "23211917272531291315091101030507"; 
Для к = 0 По 15 Цикл 
ИсхПозиция = Число(Сред(СтрокаПозиций, к*2+1,2)); 
Результат = Результат + Сред(Строка, ИсхПозиция, 2); 
КонецЦикла; 
Возврат Врег(Сред(Результат, 1, 8)+"-"+Сред(Результат, 9, 4)+"-"+Сред(Результат, 13, 4)+"-"+Сред(Результат, 17, 4)+"-"+Сред(Результат, 21, 12)); 
КонецФункции // ГУИДдляSQL() 
Показать


// Преобразует ГУИД из формата SQL в формат 1С
Функция ГУИДдля1С(Строка) Экспорт 
Если ПустаяСтрока(Строка) Тогда 
Возврат Строка; 
КонецЕсли; 
Результат = ""; 
Строка = СтрЗаменить(СтрЗаменить(СтрЗаменить(Строка, "-",""), "{", ""), "}", ""); 
СтрокаПозиций = "25272931212317190705030111091513"; 
Для к = 0 По 15 Цикл 
ИсхПозиция = Число(Сред(СтрокаПозиций, к*2+1,2)); 
Результат = Результат + Сред(Строка, ИсхПозиция, 2); 
КонецЦикла; 
Возврат Врег(Сред(Результат, 1, 8)+"-"+Сред(Результат, 9, 4)+"-"+Сред(Результат, 13, 4)+"-"+Сред(Результат, 17, 4)+"-"+Сред(Результат, 21, 12)); 
КонецФункции 
Показать


http://forum.infostart.ru/forum105/topic34914/message385150/#message385150
	г = Справочники.Валюты.ПолучитьСсылку();
	р=ГУИДдляSQL(XMLСтрока(г));
	а="80B7001517A39B3511E0F63522D8E339";
	п=ГУИДдля1С(а);
46. Shmell 407 14.02.19 12:25 Сейчас в теме
Работа проделана колоссальная! Молодец. Статья в фаворитах )
47. MrTom 14.02.19 19:35 Сейчас в теме
Для тех, у кого с типами и версиями GUID картинка не сошлась (как у меня), можно посмотреть вот здесь:
http://guid.one/guid

Кратко: типов (они же версия, хотя странная путаница здесь) на самом деле 5.
49. SerGeoSik 2 15.02.19 01:57 Сейчас в теме
Хорошо написал. давно искал нечто подобное
50. d4rkmesa 18.02.19 09:33 Сейчас в теме
Спасибо. Однако, вот это утверждение:

В-третьих, гуид случаен по своему стандарту и время в нем это лишь способ сгруппировать первичные ключи для уменьшения ширины В-дерева и ускорения операций вставки в кластерный индекс!


ИМХО, это спорно. Т.к. УИД ссылки упаковывается в бинарник, то это почти нивелирует этот эфффект. Я сам как то думал, что рандомные УИД'ы - зло для ссылок в 1С, спорил по этому поводу на форуме. Делал опыт, программно создавал несколько сот элементов справочника Номенклатура в УТ, как вручную назначая УИД ("random"), так и нет (чтобы УИД'ы брались из пула сеанса, псевдоупорядочивание).
Запускал dm_db_index_physical_stats в SQL и никакой разницы не было, индекс не фрагментировался от "рандомных" УИД'ов. Не знаю, может на миллионах записей это имеет значение.
60. kirinalex 13 08.09.20 13:59 Сейчас в теме
(50) насколько я знаю группировка ключей позволяет уменьшить количество блокировок при Serializable
51. frkbvfnjh 646 19.02.19 11:27 Сейчас в теме
UUID_Node возвращает каждый раз разное значение если передавать ГУИД в виде
Строка(Новый УникальныйИдентификатор());
Какой версии должен быть UUID, что бы всегда МАС возвращался?
tormozit; +1 Ответить
52. frkbvfnjh 646 20.08.19 13:33 Сейчас в теме
Что за тайные знаки?
tormozit; +1 Ответить
53. frkbvfnjh 646 20.08.19 13:47 Сейчас в теме
И как в 1С можно сгенерировать time based uuid? Может кто нибудь придумает? У меня вот что то не выходит :(
tormozit; +1 Ответить
74. vlm88 1 26.10.20 11:19 Сейчас в теме
(53)
1 time based
Документы.<Имя документа>.ПолучитьСсылку().УникальныйИдентификатор()
54. kuzyara 1221 21.08.19 04:51 Сейчас в теме
(51-52-53)
- первой
- я мясоед)
- xmlстрока(документы.перемещениетоваров.ПолучитьСсылку())
56. lame 62 31.10.19 17:34 Сейчас в теме
Пользуюсь вот такой вот процедуркой - для получения времени создания объекта по гуид

Функция ДатаСозданияСсылки(Ссылка)
//Ссылка-  любая ссылка  конфигурации на документ или справочник
	ГУИД = Ссылка.УникальныйИдентификатор();
	Строка16 = Сред(ГУИД, 16, 3) + Сред(ГУИД, 10, 4) + Сред(ГУИД, 1, 8);
	Разрядность = СтрДлина(Строка16);
	ЧислоСек = 0;
	Для Позиция = 1 По Разрядность Цикл
		ЧислоСек = ЧислоСек + Найти("123456789abcdef",Сред(Строка16,Позиция,1))*Pow(16,Разрядность - Позиция);
	КонецЦикла;
	ЧислоСек = ЧислоСек / 10000000;
	Возврат Дата(1582, 10, 15, 00, 00, 00) + ЧислоСек + СмещениеСтандартногоВремени() + СмещениеЛетнегоВремени();  
КонецФункции
Показать
Windsor77; +1 Ответить
77. Windsor77 14 28.08.21 21:54 Сейчас в теме
(56) Уже с 8.3.10 появилась же ЧислоИзШестнадцатеричнойСтроки(), зачем столько страданий?
58. 2michael 21 26.08.20 10:37 Сейчас в теме
если отчет из одной конфигурации копипастой тащу в другую - ID сохранится его?(в моей его не было)
59. user1455510 28.08.20 04:55 Сейчас в теме
75. XelOla 17 15.02.21 12:43 Сейчас в теме
Доброго дня!
Скажите пожалуйста, требуется с одной базы 10.3 перенести товары в 11.4 сохраняя все идентификаторы.
МОжно и GUID перенести?!
76. user1455510 15.02.21 12:57 Сейчас в теме
(75) насколько я помню, универсальный обмен переносит гуиды, если вы об https://infostart.ru/public/723145/
78. ArsenProg 12.12.21 05:47 Сейчас в теме
Выдернуть бы еще ответственного кто создал по GUID
80. пользователь 29.12.21 04:57
Сообщение было скрыто модератором.
...
Оставьте свое сообщение

См. также

Аналог PIVOT в запросе 1С (как выполнить транспонирование таблицы в запросе 1С) Промо

Практика программирования v8 Бесплатно (free)

В статье показывается простой метод реализации аналога оператора PIVOT в запросе 1С без использования соединений.

12.12.2020    5300    Eugen-S    24    

СКД: 5 советов, как сделать лучше

Практика программирования v8 v8::СКД 8.3.14 Бесплатно (free)

Несколько примеров решения задач с использованием разных подходов

27.10.2021    5698    Neti    19    

Полезные примеры СКД, ч.2

Практика программирования v8 v8::СКД Бесплатно (free)

Еще несколько примеров решения задач в СКД.

06.04.2021    11923    Neti    8    

Неочевидные нюансы записи управляемой формы

Практика программирования v8 v8::УФ Платформа 1C v8.2 1cv8.cf Бесплатно (free)

Разберем несколько нюансов записи управляемой формы.

02.04.2021    14707    SeiOkami    54    

Использование классов .Net в 1С для новичков Промо

Разработка внешних компонент Универсальные функции Практика программирования v7.7 v8 Бесплатно (free)

Руководство для новичков. Написав статью http://infostart.ru/public/238584/, я понял, что многие не понимают того, что написано. Поэтому в этой статье постараюсь более подробно остановиться на азах и без кода на вражеском языке (C#)

27.01.2016    86816    Serginio    116    

Обзор полезных методов БСП 3.1.4

БСП (Библиотека стандартных подсистем) Практика программирования v8 1cv8.cf Бесплатно (free)

Библиотека стандартных подсистем (далее - БСП) является частью любой типовой конфигурации, поэтому умение применять готовые процедуры и функции повышает качество разработки и избавляет от написания лишнего кода. К сожалению, не у всех есть время и упорство овладеть всей документацией, поэтому я собрал воедино наиболее популярный функционал.

25.03.2021    47570    rayastar    53    

Звуковое управление в 1С 8.3

Практика программирования v8 1cv8.cf Бесплатно (free)

В данной статье описано создание библиотеки для звукового управления (выполнение команд голосом) для платформы 1С 8.3. Задача была поставлена так, чтобы модуль функционировал непосредственно на клиенте 1С, осуществляя управление формами, и взаимодействовал с интерфейсом.

16.03.2021    7691    velemir    33    

Доработка проведения в ERP 2.5. (Регистры накопления, Регистры сведений)

Практика программирования v8 ERP2 БУ Бесплатно (free)

Покажу точки входа для доработки "типового" проведения документов в ERP для регистров оперативного учета. Рассмотрим три основные ситуации: нужно изменить имеющееся проведение документа; нужно сделать записи в существующие регистры; нужно с нуля описать алгоритм проведения в добавленный регистр. Пример реализован на 1С:ERP Управление предприятием 2 (2.5.4.120)

10.01.2021    12049    BuriyLesha    10    

Использование программных перечислений, ч.1: строковые константы Промо

Практика программирования v8 1cv8.cf Бесплатно (free)

Часто ли у вас возникает необходимость в коде выполнять сравнение на строку?

10.12.2016    41381    unichkin    74    

Serverless (Faas) в 1С. Создание и вызов Yandex Cloud Functions

Универсальные функции Практика программирования v8 Бесплатно (free)

"Я не могу просто взять и скопировать код с гитхаба", "у нас 1С микросервисами окружена", "возможностей мало" - частые фразы 1С разработчиков. которым не хватает возможностей платформы в современном мире. Faas, конечно, история не новая, но нас сдерживало 152ФЗ и задержки по пингам. Для того, чтобы действительно использовать в 1С код, к примеру, на Python, надо было приложить усилия. Теперь всё намного проще - берём и используем.

28.12.2020    9441    comol    31    

Базовые вещи БСП, которые облегчат жизнь программисту 1С

БСП (Библиотека стандартных подсистем) Практика программирования v8 1cv8.cf Россия Бесплатно (free)

В данной публикации я опишу полезные процедуры и функции модуля общего назначения библиотеки стандартных подсистем, обязательные к использованию любым программистом 1С.

30.08.2020    21829    quazare    34    

Вспомогательные инструкции в коде 1С Промо

Практика программирования v8 1cv8.cf Бесплатно (free)

Помогаем редактору кода 1С помогать нам писать и анализировать код.

15.10.2018    36746    tormozit    107    

Серверные вызовы, которые нельзя вызывать

Практика программирования v8 v8::УФ 1cv8.cf Бесплатно (free)

Не баян, а классика. Рассмотрим особенность платформы настолько же древнюю, как сами УФ.

12.05.2020    9886    SeiOkami    34    

Форма выбора (подбор) в управляемых формах

Практика программирования v8 v8::УФ 1cv8.cf Россия Бесплатно (free)

Разбор небольших примеров того, как правильно открывать форму выбора (подбора) в управляемых формах, не прибегая к модальным окнам.

08.05.2020    89758    user5300    28    

Конвертация расширения cfe в конфигурацию сf руками

Практика программирования v8 1cv8.cf Бесплатно (free)

Как быстро преобразовать расширение в конфигурацию (для дальнейшего переноса в основную конфигурацию, например).

18.03.2020    11689    wtlz    35    

Оформление и рефакторинг сложных логических выражений Промо

Практика программирования v8 Россия Бесплатно (free)

В сложных логических выражениях нередко самому автору спустя какое-то время тяжело разобраться, не говоря уже о других программистах. Предлагаемая методика позволяет повысить наглядность таких выражений путем оформления в виде И-ИЛИ дерева и одновременно выполнять их рефакторинг.

20.09.2012    83228    tormozit    131    

Эволюция расширения конфигурации

Практика программирования v8 1cv8.cf Бесплатно (free)

С каждым днем всё больше возможностей появляется в расширении конфигурации, но не все до сих пор работают даже на платформе 8.3.6! Давайте окунемся в историю появления и эволюции расширения конфигурации, чтобы знать и понимать, когда можно применить тот или иной функционал!

06.02.2020    16463    Xershi    47    

Программная работа с настройками СКД

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Нюансы программной работы с настройками системы компоновки данных в отчетах и динамических списках. Обзор всех видов настроек компоновки. Что в каких случаях правильно применять. В качестве примера рассмотрена работа с отборами и группировками.

27.01.2020    70771    ids79    27    

[СКД] Программное создание схемы компоновки данных

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Сделаем отчет на СКД полностью программно, без использования макета "схема компоновки данных".

15.01.2020    46090    John_d    22    

Запись значения в поле ввода/формы со срабатыванием события ПриИзменении Промо

Практика программирования v8 1cv8.cf Россия Бесплатно (free)

Иногда возникает необходимость после записи значения в какое либо поле ввода/формы вызвать для него обработчик события ПриИзменении, а о вызове самого события приходится только мечтать. В этой статье приводится программный способ вызова этого события.

11.07.2007    55187    tormozit    51    

Последовательности событий при проведении документа 1С. Шпаргалка + про формы + про расширения

Практика программирования v8 Россия Бесплатно (free)

Собрал информацию о событиях/подписках/расширениях в одном месте.

30.12.2019    38070    kuzyara    38    

Мониторим производительность с помощью 1С RAS

Практика программирования v8 1cv8.cf Бесплатно (free)

Подключаемся и анализируем данные через 1С RAS. Необходимо выполнить 5 пунктов и серьезный инструмент мониторинга будет у вас в руках.

19.12.2019    15933    ivanov660    51    

30 задач. Странных и не очень

Практика программирования v8 Бесплатно (free)

30 задач на знание языка программирования 1С и некоторого поведения платформы. Маленьких. Странных и не очень.

02.12.2019    25845    YPermitin    63    

Как сделать из &НаКлиентеНаСервереБезКонтекста почти &НаКлиентеНаСервере Промо

Практика программирования v8 1cv8.cf Россия Бесплатно (free)

Как сделать метод формы, доступный на клиенте и на сервере одновременно, и сохранить при этом удобство разработки

10.09.2017    51967    tormozit    74    

Обновление релиза измененной типовой конфигурации

Практика программирования v8 1cv8.cf Бесплатно (free)

Пригодится тем, кому еще не приходилось обновлять измененную типовую конфигурацию.

29.11.2019    16048    John_d    76    

Как передать IP адрес, который вызвал HTTP запрос в 1C (для веб-сервера Apache)

Практика программирования v8 Бесплатно (free)

Столкнулся с задачей получения IP адреса, который вызывает http сервис 1С. Итак, решение:

22.11.2019    13246    Sibars    19    

Шпаргалка (БСП). Добавление в новый документ механизма печати дополнительных печатных форм

Практика программирования v8 1cv8.cf Бесплатно (free)

Постоянно приходится вспоминать, как добавить механизм печати (БСП) в новый документ. Поэтому решил написать шпаргалку.

10.10.2019    32820    John_d    21    

Выгрузка документа по условию Промо

Практика программирования v8 Бесплатно (free)

Что делать, если документы нужно выгружать не все подряд, а по какому-то фильтру: статусу, дате, набору условий... А что если он соответствовал этим условиям, а потом перестал? А если потом опять начал? Такие ситуации заставили попотеть не одного программиста.

25.04.2019    18186    m-rv    3    

Таблица значений. Нюансы

Практика программирования v8 Бесплатно (free)

Обзор некоторых аспектов использования общеизвестного инструмента 1С.

01.10.2019    55702    Yashazz    56    

[Шпаргалка] Программное создание элементов формы

Работа с интерфейсом Практика программирования v8 1cv8.cf Бесплатно (free)

Программное создание практически всех популярных элементов формы.

06.09.2019    111729    rpgshnik    77    

Агрегатные функции СКД, о которых мало кто знает

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Пользуетесь ли Вы всеми возможными агрегатными функциями, которые предоставляет система компоновки данных? Если Вы используете только: СУММА, КОЛИЧЕСТВО, МИНИМУМ, МАКСИМУМ, СРЕДНЕЕ, то эта статья для Вас.

05.09.2019    82197    ids79    56    

Как прикрутить ГУИД к регистру сведений Промо

Практика программирования v8 Бесплатно (free)

... и немного теории обмена данными. В частности, разберем боль всех, кто пишет небанальные обмены данными: как набору записей регистра сведений назначить гуид и далее использовать его в обмене для идентификации этого набора.

16.04.2019    23625    m-rv    18    

Регистры бухгалтерии. Общая информация

Математика и алгоритмы Практика программирования v8 v8::БУ БУ Бесплатно (free)

Общая информация о внутреннем устройстве регистров бухгалтерии.

05.09.2019    48980    YPermitin    27    

Три костыля. Сказ про фокусы в коде

Практика программирования v8 Бесплатно (free)

Три интересных (или странных) костыля в коде, которые могут помочь в повседневных и не очень задачах.

03.09.2019    30660    YPermitin    81    

Отслеживание выполнения фонового задания

Практика программирования v8 1cv8.cf Бесплатно (free)

Запуск фонового задания из модуля внешней обработки. Отслеживание выполнения задания в виде прогресса, расположенного на форме.

17.08.2019    46683    ids79    22    

Как сделать запрос на изменение данных Промо

Практика программирования v8 v8::Запросы 1cv8.cf Бесплатно (free)

В статье приведены особенности внутренней архитектуры и примеры работы с расширением языка запросов 1С.

01.06.2018    37907    m-rv    23    

Функции СКД: ВычислитьВыражение, ВычислитьВыражениеСГруппировкойМассив

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Подробное описание и использование внутренних функций системы компоновки данных: Вычислить, ВычислитьВыражение, ВычислитьВыражениеСГруппировкойМассив, ВычислитьВыражениеСГруппировкойТаблицаЗначений.

08.08.2019    162836    ids79    77    

Фоновое выполнение кода в 1С - это просто

Практика программирования v8 1cv8.cf Бесплатно (free)

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

02.08.2019    64293    avalakh    27    

Разбираемся с параметрами редактирования СКД

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Связь по типу, Параметры выбора, Связи параметров выбора

31.07.2019    44731    json    17    

Метод формирования движений в типовых регистрах нетиповыми регистраторами Промо

Практика программирования v8 1cv8.cf Бесплатно (free)

Вариант решения задач с проведением по типовым регистрам нетиповыми регистраторами. Зачем - чтобы при сравнении конфигурации не обращать внимание на свойства регистров и исключить вероятность допущения горькой оплошности при обновлении информационных баз, заменив типы регистраторов основной конфигурации типами конфигурации поставщика. Для программных продуктов, имеющих в своем составе метаданных документ "Корректировка регистров"("Корректировка записей регистров").

05.12.2017    30978    itriot11    34    

СКД - наборы данных и связи между ними, создание собственной иерархии, вложенные отчеты

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Набор данных объект. Использование в схеме компоновки нескольких наборов данных. Различные варианты связи наборов: объединение, соединение. Использование иерархии в отчетах на СКД. Создание собственной иерархии, иерархия детальных записей. Использование вложенных схем в отчетах на СКД.

26.07.2019    112069    ids79    18    

СКД - использование расширений языка запросов, секция ХАРАКТЕРИСТИКИ

Практика программирования v8 v8::СКД Бесплатно (free)

Автоматическое и не автоматическое заполнение полей компоновки данных. Использование расширений языка запросов для СКД «{…}», секция ВЫБРАТЬ, секция ГДЕ, параметры виртуальных таблиц. Автоматизированное использование дополнительных данных в запросе: секция ХАРАКТЕРИСТИКИ.

17.07.2019    50230    ids79    27    

Регистры сведений. За кулисами

Практика программирования v8 1cv8.cf Бесплатно (free)

Небольшие заметки по внутреннему устройству регистров сведений.

09.07.2019    35116    YPermitin    15    

"Меньше копипаста!", или как Вася универсальную процедуру писал

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Программист Вася разбирает подход создания универсальных методов на примере программного вывода СКД.

04.07.2019    22853    SeiOkami    53    

Работа с настройками системы компоновки данных

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Варианты отчетов, работа с настройками вариантов: структура группировок, поля отчета, отборы, сортировка, условное оформление, другие настройки, настройки отображения диаграмм.

02.07.2019    88892    ids79    18    

Регистры накопления. Виртуальные таблицы. Часть №2: "Остатки" и "Остатки и обороты"

Практика программирования v8 1cv8.cf Бесплатно (free)

Описание работы платформы 1С:Предприятие 8.2 с виртуальными таблицами регистров накопления "Остатки" и "Остатки и обороты". Анализ SQL-запрос при работе с виртуальными таблицами

22.05.2019    47355    YPermitin    9    

1Script.Web. Интернет-приложения на языке 1С

Практика программирования v8 Бесплатно (free)

Запросы рынка таковы, что любое современное клиент-серверное приложение должно иметь веб-интерфейс. Почему бы не писать такие приложения на языке 1С? Андрей Овсянкин расскажет о возможностях разработки веб-приложений на базе 1Script, рассмотрит перспективы этого направления и в качестве демонстрации покажет «боевое» веб-приложение на новом движке – кроссплатформенную консоль администрирования парка кластеров 1С.

20.05.2019    22659    Evil Beaver    33    

Регистры накопления. Структура хранения в базе данных

Практика программирования v8 1cv8.cf Бесплатно (free)

Структура хранения регистров накопления в базе данных для платформы 1С:Предприятие 8.x. Первая часть в серии публикаций.

16.05.2019    67057    YPermitin    31