В процессе интеграции систем часто возникает задача сопоставления объектов без изменения структуры метаданных. Одним из элегантных, но технически сложных решений является «зашивание» внешнего уникального идентификатора (ID) непосредственно в УникальныйИдентификатор (UUID) объекта 1С. Рассмотрим, как реализовать этот механизм, соблюдая стандарты и минимизируя риски для производительности базы данных.
Прежде чем мы начнем конструировать свой UUID, разберем, из чего он состоит. УникальныйИдентификатор в 1С представляет собой 128-битное число, которое в строковом виде записывается как 36 символов (включая 4 дефиса). Пример: 550e8400-e29b-41d4-a716-446655440000.
Важные поля в структуре UUID:
4 в примере выше). Платформа 1С в новых релизах (начиная с 8.3.18) использует 4-ю версию (случайные числа), а ранее чаще использовала 1-ю версию (на основе времени и MAC-адреса).Проанализируем задачу автора: нам нужно вставить 17 собственных символов. Поскольку UUID использует шестнадцатеричную систему (0-9, a-f), наши 17 десятичных цифр гарантированно поместятся в отведенное пространство, если их правильно подготовить.
Для создания идентификатора «со своим хвостом» мы будем использовать конструктор объекта Новый УникальныйИдентификатор(СтрокаИдентификатора). Рассмотрим по шагам, как подготовить эту строку.
Шаг 1. Подготовка исходных данных. Если ваш идентификатор состоит из цифр, его можно использовать как есть в «хвосте» UUID, либо перевести в шестнадцатеричный формат (Hex), чтобы он занимал меньше места. 17 десятичных цифр — это примерно 14-15 символов в Hex.
Шаг 2. Заполнение «безопасных» зон. Чтобы наш идентификатор не конфликтовал с системными UUID, которые генерирует 1С, мы можем искусственно занизить «версию» идентификатора до 0. Это сделает наш GUID нестандартным, но полностью рабочим внутри платформы.
Проанализируем пример кода для формирования такой строки:
// Функция формирует UUID, где последние 17 символов (без учета дефисов)
// заняты нашими данными, дополненными нулями слева.
Функция СформироватьКастомныйУИД(ВнешнийИД)
// ВнешнийИД — это строка из 17 цифр
// Дополним нулями до нужной длины в 32 символа (без дефисов)
// Структура: 00000000-0000-0000-0000-000000000000
ЧастьХвоста = ВнешнийИД; // Допустим, это "12345678901234567"
Префикс = "00000000-0000-0000-0000-0"; // 20 символов (с дефисами) + 1 в хвосте
// Формируем итоговую строку, следя за позициями дефисов
// UUID: 8-4-4-4-12
// Нам нужно 32 hex-символа.
// Заполним первые 15 символов нулями, а последние 17 — нашими данными.
Стр = "00000000-0000-0000-0000-" + Лев(ВнешнийИД, 12);
// Это только пример, логику разбиения по дефисам нужно соблюдать строго.
Возврат Новый УникальныйИдентификатор(ИтоговаяСтрока);
КонецФункции
Выясним причину, по которой многие эксперты предостерегают от использования случайных UUID. В СУБД (MS SQL Server, PostgreSQL) идентификатор объекта в 1С является **кластерным индексом** (поле _IDRRef). Это означает, что физическое расположение строк в таблице зависит от значения этого поля.
Рассмотрим последствия:
Чтобы избежать этого, постараемся сделать так, чтобы левая (старшая) часть UUID содержала данные, которые со временем только растут (например, инвертированная дата в Hex), а наш «уникальный хвост» располагался справа. Для оценки влияния структуры данных на СУБД можно использовать обработку для анализа объемов таблиц и индексов SQL.
Проанализируем ситуацию с коллизиями (совпадениями). Если вы забиваете UUID нулями и вставляете свой код, вероятность того, что 1С сама сгенерирует точно такой же идентификатор, стремится к нулю. Однако стоит учитывать следующие моменты:
Если вы опасаетесь за производительность или не хотите «портить» стандартную логику платформы, разберем альтернативный вариант, который не требует изменения метаданных объекта. В составе Библиотеки стандартных подсистем (БСП) есть механизм «Дополнительные сведения».
Преимущества этого подхода:
ДополнительныеСведения.Для реализации программной установки ссылки при создании объекта (если вы все же выбрали путь с UUID), используйте метод УстановитьСсылкуНового(). Это позволит вам заранее определить идентификатор еще до того, как объект будет физически записан в базу данных.
НоваяСсылка = Справочники.Контрагенты.ПолучитьСсылку(МойКастомныйУИД);
Объект = Справочники.Контрагенты.СоздатьЭлемент();
Объект.УстановитьСсылкуНового(НоваяСсылка);
// Заполнение реквизитов...
Объект.Записать();
Подведем итог: генерация UUID «со своим хвостом» технически возможна и эффективна для задач синхронизации без изменения метаданных. Однако при реализации необходимо строго соблюдать 16-ричный формат символов и помнить о потенциальной фрагментации индексов в базе данных.