Преобразовать строку в гуид 1с
"Коллеги, есть идеи, как получить последнюю созданную характеристику? Реквизиты полностью идентичны(код, наименование, и т.п.)."(c) "Насколько я знаю, ссылка не обеспечивает последовательность, а только уникальность."(c) "Я сделал по Максимум(Ссылка). Но, чета, мне кажется, это неправильно."(c) "Слышал что в ГУИд содержится как раз время создания и по всей логике вещей сортировка по ссылке должна сортировать по моменту создания объекта"(c) Сколько раз вы слышали такие фразы? На удивление я не обнаружил информации по этой теме, пришлось разбираться самому.
Почему нельзя упорядочить по ссылке, если в ней содержится дата создания?
Как уже было описано, guid изначально был придуман для РАСПРЕДЕЛЕННЫХ систем, в которых ПРОБЛЕМА УНИКАЛЬНОСТИ идентификаторов решена полным ОТКАЗОМ ОТ АВТОИНКРЕМЕНТА в пользу СЛУЧАЙНЫХ чисел и специальных техник. GUIDы случайны и неповторяемы по определению и в этом его достоинство и недостаток. Например, в предопределенных элементах и произвольных идентификаторах используется Random GUIDs (Version 4). В "типизированных" же Time-Based GUIDs (Version 1).
Можно ли вытащить время из гуида?
Можно. Но не нужно.
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;
Делаем сдвиг даты от [3]
Почему части времени идут "задом-наперед"?
"Так сложилось" ;)
Например потому что guid'ы появились задолго до того, как до них добрались руки ietf и баз данных.
Или потому что платформа написана на C, а не на Java, а как мы знаем из асемблера архитектура x86 имеет little-endian byte order.
Или, как говорит википедия, использовалось 2 варианта: для передачи по сети "on-wire" "network" (big-endian) byte order, а для хранения "native" (little-endian) byte order.
В любом случая я не знаю как там было и можно только догадываться.
[2] [3]
Если отчет из одной конфигурации копипастой тащу в другую - ID сохранится его?(в моей его не было) (c) 2michael
Ответ: При копировании объекта из одной конфы в другую _копипастом_ внутренний гуид меняется!
НО: при сравнении объединении этого не видно!, так как происходит сопоставление по имени.
НО: это не касается и предопределённых данных! Если добавлять их вручную, а потом конфу разработки сравнить-объединить с боевой - возникнут дубли в справочнике!
В edt же есть режим сравнения только по guid.
При замене отчета в дереве конфигурации командой "Заменить на внешнюю обработку, отчет. " меняется ли внутренний идентификатор объекта (отчета)? (с) Pandoch upd:02.07.20
Ответ: Нет, гуид при замене из файла остаётся прежним
Другая вариация вопроса: Есть две разные конфы. Но в них есть одинаковый объект метаданных например документ "Покупка". Как можно получить внутренний идентификатор этого объекта в обеих базах, используемый в сравнении и объединении, чтобы удостовериться, что этот объект, не зависимо от имени, замениться, а не дублируется ? Как я понял ЗначениеВСтрокуВнутр() дает не тот ID который нужен мне.
Вообще, внутренний идентификатор объекта программно узнать нельзя, а увидеть его можно в выгрузке конфигурации в файлы, строка :
При каждой выгрузке во внешний отчет/обработку guid генерируется заного. При загрузке из файла - востанавливается. Это позволяет хоть 10 раз выгрузить отчет/обработу во внешний файл, и каждый из этих файлов можно будет открыть параллельно в клиенте.
ЗначениеВСтрокуВнутр() выдает идентификатор прикладного типа, а не внутреннего объекта метаданных. Помимо внутреннего идентификатора у каждого объекта метаданных есть идентификаторы типов. Например ОтчетМенеджер. и ОтчетОбъект.:
Все типы имеют свои идентификаторы, но при загрузке через "Заменить на внешнюю обработку, отчет. " они, так же как и идентификатор метаданных, заменяются на текущие.
Например - загрузка в отчет ABCАнализПокупателей внешнего отчета ДебиторскаяЗадолжность.epf вызовет лишь добавление суффикса (такой отчет уже есть в конфигурации), а все идентификаторы остаются прежними.
Скрин до загрузки - после загрузки:
Идентификаторы не изменились.
Почему используется "перевернутый" формат UUID внутри 1с?
(26:80f408002771598b11e7a3f0a3a64c3b)
Не знаю. Знаю только что первая цифра соответствует имени таблицы в sql: Reference26 -> ВидыНоменклатуры
[1]
Есть же спецификация?
Есть.
Расшифровываю:
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 ;)
Примеры? Есть их у меня.
Мы же "программисты", накодим функции:
Проверим ссылку обычного документа:
Проверим ссылку, сформированную вручную:
Проверим работу счетчика "уникальности":
Можно даже так:
Какой мак-адрес у меня, вы уже знаете ;)
ps: под "упорядочить по ссылке" везде имеется ввиду сортировка в порядке создания ссылок и вообще в каком-либо порядке, отличном от сравнения в побитовом бинарном формате хранения бд.
Ну вот и все.
Надеюсь, теперь мысль о том, чтобы "упорядочить по ссылке", я из вас вытряхнул окончательно.
Немножко о UUID и GUID и их взаимосвязи.
Когда мы встречаемся с битой ссылкой в Предприятии 8, иногда возникает необхоимость создать объект с её идентификатором. Однако строка идентификатора и текст битой ссылки в предприятии различаются, но легко восстановить одно зная другое.
Когда мы встречаемся с битой ссылкой в Предприятии 8, иногда возникает необхоимость создать объект с её идентификатором. Однако строка идентификатора и текст битой ссылки в предприятии различаются, но легко восстановить одно зная другое.
Определимся с обозначениями:
UUID - это подстрока, которую мы видим в режиме предприятия в представлении битой ссылки
Объект не найден (N: UUID );
где N - номер таблицы таблицы в базе данных, например, _ReferenceN - это таблица справочника в базе данных.
Для документа такая таблица будет иметь имя _Document N , разглядеть имена этих таблиц можно, если имеется клиент-серверный вариант информационной базы 1С:Предприятия (см. рис.).
GUID - это строка, которую мы используем для создания объекта "УникальныйИдентификатор":
Вот две простые функции, которые легко составить по предложенному рисунку:
Функция UUIDToGUID ( UUID ) Экспорт
Возврат Прав ( UUID , 8 ) + "-" + Сред ( UUID , 21 , 4 ) + "-" + Сред ( UUID , 17 , 4 ) + "-" + Лев ( UUID , 4 ) + "-" + Сред ( UUID , 5 , 12 );
Функция GUIDToUUID ( GUID ) Экспорт
Возврат Сред ( GUID , 20 , 4 ) + Прав ( GUID , 12 ) + Сред ( GUID , 15 , 4 ) + Сред ( GUID , 10 , 4 ) + Лев ( GUID , 8 );
Исходя из смысла числа N в строке битой ссылки Объект не найден (N:UUID), это число можно считать идентификатором типа.
Для определения типа можно заполнить заранее, например, соответствие (Число N - ТипОбъекта). А N определять из представления битой ссылки.
Вот функции модуля обработки для определения типа (всего одна экспортная функция для рашифровки битой ссылки):
// Представление битой ссылки: Объект не найден (TypeID:UUID)
// TypeID - идентификатор типа
// UUID - глобальный идентификатор
Функция СтруктураПредставленияБитойСсылки ( ПредставлениеБитойСсылки )
// Ищем позицию скбоки
Поз1 = Найти ( ПредставлениеБитойСсылки , "(" );
Поз2 = Найти ( ПредставлениеБитойСсылки , ":" );
Если Поз1 > 0 И Поз2 > 0 И Поз2 > Поз1 Тогда
TypeID = Сред ( ПредставлениеБитойСсылки , Поз1 + 1 , Поз2 - Поз1 - 1 );
UUID = Сред ( ПредставлениеБитойСсылки , Поз2 + 1 , 32 );
Иначе
TypeID = "" ;
UUID = ПредставлениеБитойСсылки ;
КонецЕсли;
Возврат Новый Структура ( "TypeID, UUID" , TypeID , UUID );
КонецФункции
// Возвращает соответствие: Идентификатор типа (строка) - Строка определения типа
Функция СоответствиеИдентификаторовТипов ()
Соответствие = Новый Соответствие ;
МассивКоллекцийМенеджеровСсылочныхОбъектов = Новый Массив ;
МассивКоллекцийМенеджеровСсылочныхОбъектов . Добавить ( Справочники );
МассивКоллекцийМенеджеровСсылочныхОбъектов . Добавить ( Документы );
МассивКоллекцийМенеджеровСсылочныхОбъектов . Добавить ( ПланыВидовХарактеристик );
МассивКоллекцийМенеджеровСсылочныхОбъектов . Добавить ( ПланыСчетов );
МассивКоллекцийМенеджеровСсылочныхОбъектов . Добавить ( БизнесПроцессы );
МассивКоллекцийМенеджеровСсылочныхОбъектов . Добавить ( Задачи );
МассивКоллекцийМенеджеровСсылочныхОбъектов . Добавить ( ПланыОбмена );
Для Каждого КоллекцияМенеджеровСсылочныхОбъектов Из МассивКоллекцийМенеджеровСсылочныхОбъектов Цикл
Для Каждого МенеджерСсылоногоОбъекта Из КоллекцияМенеджеровСсылочныхОбъектов Цикл
БитаяСсылка = МенеджерСсылоногоОбъекта . ПолучитьСсылку (Новый УникальныйИдентификатор );
Соответствие . Вставить ( СтруктураПредставленияБитойСсылки ( Строка ( БитаяСсылка )). TypeID , СтрЗаменить ( БитаяСсылка . Метаданные (). ПолноеИмя (), "." , "Ссылка." ));
КонецЦикла;
КонецЦикла;
КонецФункции
// Возвращает структуру: "TypeID, UUID, Тип, GUID"
Функция РасшифровкаПредставленияБитойСсылки ( ПредставлениеБитойСсылки ) Экспорт
Если мСоответствиеИдентификаторовТипов = Неопределено Тогда
мСоответствиеИдентификаторовТипов = СоответствиеИдентификаторовТипов ();
КонецЕсли;
СтруктураПредставления = СтруктураПредставленияБитойСсылки ( ПредставлениеБитойСсылки );
СтрокаТипа = мСоответствиеИдентификаторовТипов [ СтруктураПредставления . TypeID ];
Если СтрокаТипа = Неопределено Тогда
СтрокаТипа = "Неопределено" ;
КонецЕсли;
Возврат Новый Структура ( "TypeID, UUID, Тип, GUID" , СтруктураПредставления . TypeID , СтруктураПредставления . UUID , СтрокаТипа , UUIDToGUID ( СтруктураПредставления . UUID ));
Для получения уникального идентификатора объекта, используйте код вида:
Код 1C v 8.х
Как с помощью запроса получить уникальный идентификатор:
Код 1C v 8.х
В 1С 7.7 можно получить так
Через v7plus.dll
Код 1C v 7.x
Через WScript
Код 1C v 7.x
при OLE доступе:
Код 1C v 7.x
Еще посмотрите метод:
ЗначениеВСтрокуВнутр();
Синтаксис:
ЗначениеВСтрокуВнутр()
Назначение:
Преобразование значения объекта агрегатного типа в строковое системное представление.
Возвращает: представление значения объекта в строковом системном виде.
Параметры:
- значение объекта агрегатного типа данных которое нужно преобразовать.
Похожие FAQ
Еще в этой же категории
Полнотекстовый поиск в 1С (что это и пример использования) 23
Полнотекстовый поиск - позволит найти текстовую информацию, размещенную практически в любом месте используемой конфигурации. При этом искать нужные данные можно либо по всей конфигурации в целом, либо сузив область поиска до нескольких объектов Формат, функция форматирования значений 21
//Функция формирует удобное для чтения представление значений. // Примеры форматирования чисел ЗначФормат = Формат(123456.789, " ЧЦ=10; ЧДЦ=2" ); // ЗначФормат = " 123 456,79" ЗначФормат = Формат(123456.789, " ЧГ=0; ЧДЦ=2" ); // Знач Обработчики событий при записи объектов. Зачем и что за чем? 12
Программисту, имеющего немного опыта на платформе 1С 8.2, бывает сложно разобраться: ПередЗаписью, ПриЗаписи, ПослеЗаписи, на сервере, на клиенте, в модуле формы, в модуле объекта, а-а-а-а-аааа. Именно такое сложное чувство непонимания УстановитьСсылкуНового 11
Установить ссылку нового это специальный механизм программиста, который позволяет присваивать новому объекту нужную ссылку. В основном это задача обмена, во многих типовых обменах используется синхронизация по UID объекта. Рассмотрим этот метод на к МоментВремени, получение остатков до и после проведения 9
" Момент времени" - виртуальное поле, не хранится в базе данных. Содержит объект МоментВремени (который включает в себя дату и ССЫЛКУ НА ДОКУМЕНТ) В 7.7 было понятие ПозицияДокумента, а в 8.x Момент времени Для получения Остатков, Движений: М Посмотреть все в категории Встроенные Функции
Для получения уникального идентификатора объекта, используйте код вида:
Код 1C v 8.х
Как с помощью запроса получить уникальный идентификатор:
Код 1C v 8.х
В 1С 7.7 можно получить так
Через v7plus.dll
Код 1C v 7.x
Через WScript
Код 1C v 7.x
при OLE доступе:
Код 1C v 7.x
Еще посмотрите метод:
ЗначениеВСтрокуВнутр();
Синтаксис:
ЗначениеВСтрокуВнутр()
Назначение:
Преобразование значения объекта агрегатного типа в строковое системное представление.
Возвращает: представление значения объекта в строковом системном виде.
Параметры:
- значение объекта агрегатного типа данных которое нужно преобразовать.
Похожие FAQ
Еще в этой же категории
Полнотекстовый поиск в 1С (что это и пример использования) 23
Полнотекстовый поиск - позволит найти текстовую информацию, размещенную практически в любом месте используемой конфигурации. При этом искать нужные данные можно либо по всей конфигурации в целом, либо сузив область поиска до нескольких объектов Формат, функция форматирования значений 21
//Функция формирует удобное для чтения представление значений. // Примеры форматирования чисел ЗначФормат = Формат(123456.789, " ЧЦ=10; ЧДЦ=2" ); // ЗначФормат = " 123 456,79" ЗначФормат = Формат(123456.789, " ЧГ=0; ЧДЦ=2" ); // Знач Обработчики событий при записи объектов. Зачем и что за чем? 12
Программисту, имеющего немного опыта на платформе 1С 8.2, бывает сложно разобраться: ПередЗаписью, ПриЗаписи, ПослеЗаписи, на сервере, на клиенте, в модуле формы, в модуле объекта, а-а-а-а-аааа. Именно такое сложное чувство непонимания УстановитьСсылкуНового 11
Установить ссылку нового это специальный механизм программиста, который позволяет присваивать новому объекту нужную ссылку. В основном это задача обмена, во многих типовых обменах используется синхронизация по UID объекта. Рассмотрим этот метод на к МоментВремени, получение остатков до и после проведения 9
" Момент времени" - виртуальное поле, не хранится в базе данных. Содержит объект МоментВремени (который включает в себя дату и ССЫЛКУ НА ДОКУМЕНТ) В 7.7 было понятие ПозицияДокумента, а в 8.x Момент времени Для получения Остатков, Движений: М Посмотреть все в категории Встроенные Функции
Для успешного сопоставления объектов с разными GUID при обмене через универсальный формат EnterpriseDate используется регистр сведений Публичные идентификаторы синхронизируемых объектов (далее РПИ) для хранения информации об их соответствии.
Механизм сопоставления данных при обмене через универсальный формат можно посмотреть здесь
Рис.1 Регистр сведения РПИ в дереве конфигурации
Фиктивные ссылки в регистре РПИ
Рис.2 Форма списка регистр сведения РПИ
Основные причины возникновения фиктивных ссылок в регистре РПИ
В моей практике я встречал 2 причины возникновения фиктивных ссылок в регистре РПИ
1. Порядок сопоставления объектов
Порядок сопоставления объектов – Рекомендуется выполнять сопоставление и загрузку данных с учетом ссылочных связей. Особенно, если поле используется для сопоставления объектов. Например, в конфигурации имеется справочник договоров контрагентов, который подчинен справочнику контрагентов. Сопоставление договоров контрагентов выполняется по справочнику-владельцу, т.е. по справочнику контрагентов. Следовательно, для правильного сопоставления данных необходимо сначала сопоставить и загрузить справочник контрагентов, а затем – справочник договоров контрагентов
2. Контроль записи в обработчиках модуля объекта 1С.
Режим ОбменДанными Загрузка
ОбменДанными.Загрузка — атрибут любого объекта в системе 1С предприятие. Он позволяет обозначить при записи объекта, что необходимо отключить любые проверки (в т.ч проверки на уровне платформы 1С). Сделано это было для того, чтобы избежать конфликтов при обмене данных.
Если Вы разрабатываете свою конфигурацию, во всех проверках правильности данных (например, процедура ПередЗаписью и ПриЗаписи) необходимо первой строкой добавить такую строку (См. Рис 3):
Если ОбменДанными.Загрузка Тогда
Возврат ;
КонецЕсли ;
Рис 3 Фрагмент программного кода модуля объекта в расширенной конфигурации
Поиск битых ссылок
Для поиска и исправления битых ссылок в регистре РПИ в базе источника, например БП ред.3.0, я создал внешнюю обработку ” Фиктивные ссылки в регистре РПИ” ( См. рис 4)
Рис 4. Форма внешней обработки “фиктивные ссылки в регистре РПИ”
Читайте также: