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

Обновлено: 06.07.2024

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

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

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

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

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

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

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

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

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

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

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

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

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

Наконец-то платформа 1С с версии 8.3.9 позволяет разработчику работать с двоичными данными в полном объеме при помощи встроенных функций, не прибегая к COM-объектам и внешним компонентам. Рассмотрим упрощенный алгоритм генерации уникального идентификатора версии 1, то есть по алгоритму основанному на времени. Конструкция Новый УникальныйИдентификатор() генерирует уникальный идентификатор версии 4, то есть по алгоритму основанному на случайном числе. Выяснить версию уникального идентификатора очень легко, так как уникальный идентификатор хранит в себе версию, поэтому можно либо самому декодировать UUID и вычислить версию, либо прибегнуть к помощи сайтам, которые умеют декодировать UUID (см. рисунок 1).

Уникальный идентификатор состоит из шести полей, которые представляют собой упорядоченную последовательность:

  1. Поле TimeLow - четыре октета;
  2. Поле TimeMid - два октета;
  3. Поле VersionAndTimeHigh - два октета;
  4. Поле VariantAndClockSeqHigh - один октет;
  5. Поле ClockSeqLow - один октет;
  6. Поле Node - шесть октетов.

1) Генерируем случайное 14-битное число для временной последовательности, значение 16383 является максимальным беззнаковым 14-битным десятичным числом. Так как рассматриваем упрощенный алгоритм, то при каждой генерации нового уникального идентификатора будем генерировать случайное число для временной последовательности.

2) Время должно быть 60-битовым значением, отсчитываем в 100 наносекундных интервалах всемирного скоординированного времени (UTC), начиная от полуночи 15 октября 1582 года (дата григорианской реформы христианского календаря). Внимание, так как время отсчитываем в 100 наносекундных интервалах UTC, то переменная МеткаВремени должна содержать время UTC.

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

3) Помещаем время, отсчитанное в 100 наносекундных интервалах, в буфер двоичных данных. В байте, который находится в нулевой позиции буфера для бита под номером 4 устанавливаем значение Истина (1), тем самым указываем версию алгоритма.

4) Помещаем случайное 14-битное число в буфер двоичных данных. В байте, который находится в нулевой позиции буфера для бита под номером 7 устанавливаем значение Истина (1), так требует алгоритм.

5) Получаем HEX-строки для полей уникального идентификатора: TimeLow, TimeMid, VersionAndTimeHigh, VariantAndClockSeqHigh, ClockSeqLow.

6) HEX-строку для поля Node получаем из шестнадцатеричного представления MAC-адреса сетевой карты, из которого убираем двоеточие. Средствами платформы невозможно получить MAC-адрес сетевой карты, поэтому переменная АдресСетевойКарты должна содержать строку вида "XX:XX:XX:XX:XX:XX".

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

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

Все хорошо, уникальный идентификатор декодируется, он версии 1, содержит в себе закодированную дату UTC.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Читайте также: