Как преобразовать внутренний формат идентификатора 1С в стандартный GUID?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При интеграции 1С с внешними системами часто возникает ситуация, когда вместо привычного идентификатора вида 1aac131d-0c14-11e0-87d4-00151756e7a8 сторонний разработчик получает странную строку в фигурных скобках, например: {"#",0b5b297d-c294-4d60-ba38-bfc84bea70aa,293:87d400151756e7a811e00c141aac131d}. В рамках этой статьи мы разберем, что это за формат, почему он выглядит именно так, и как извлечь из него «нормальный» GUID.

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

Строка, которую вы получили, является результатом работы системной функции 1С ЗначениеВСтрокуВнутр(). Это специальный сериализованный формат платформы, предназначенный для сохранения объекта в текстовом виде так, чтобы его можно было восстановить обратно в базе 1С. Рассмотрим структуру этой записи подробнее, разделив её на составляющие:

  1. Класс типа (GUID): В нашем примере это 0b5b297d-c294-4d60-ba38-bfc84bea70aa. Этот идентификатор всегда одинаков для объектов типа «Ссылка». Он указывает платформе, что далее следует описание ссылки на какой-то объект базы данных.
  2. Идентификатор метаданных: Число 293 после запятой. Это внутренний номер таблицы (справочника или документа) в конкретной конфигурации. По этому номеру 1С понимает, что перед нами, например, «Справочник.Номенклатура».
  3. Внутренний идентификатор (Binary GUID): Последняя часть 87d400151756e7a811e00c141aac131d — это и есть искомый нами уникальный идентификатор, но представленный в виде шестнадцатеричной строки, в которой байты «перемешаны» определенным образом.

Проанализируем ситуацию: если выгруженные элементы относятся к одному и тому же справочнику, то первая часть строки (GUID типа и ID метаданных) будет идентичной для всех записей. Различаться будет только последняя последовательность из 32 символов.

Алгоритм преобразования в стандартный формат GUID

Стандартный GUID (согласно RFC 4122) состоит из 32 шестнадцатеричных цифр, разделенных дефисами: 8-4-4-4-12. Однако 1С при внутреннем представлении меняет порядок групп байтов. Чтобы восстановить исходный вид, нам нужно выполнить обратную перестановку.

Допустим, у нас есть внутренняя строка GUID из 32 символов. Разобьем её на блоки по порядку следования символов в строке:

Для получения стандартного представления мы должны собрать их в следующем порядке: Блок 5 - Блок 4 - Блок 3 - Блок 1 - Блок 2. В итоге получится: 1aac131d-0c14-11e0-87d4-00151756e7a8.

Программная реализация парсинга на стороне 1С

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


Функция ПолучитьНормальныйУИДИзВнутреннейСтроки(ТекстВнутр)
    // Извлекаем часть после двоеточия до закрывающей фигурной скобки
    ПозДвоеточия = Найти(ТекстВнутр, ":");
    Если ПозДвоеточия = 0 Тогда
        Возврат "";
    КонецЕсли;
    
    Стр = Сред(ТекстВнутр, ПозДвоеточия + 1, 32);
    
    // Формируем части по алгоритму перестановки 1С
    Часть1 = Прав(Стр, 8);         // символы 25-32
    Часть2 = Сред(Стр, 21, 4);     // символы 21-24
    Часть3 = Сред(Стр, 17, 4);     // символы 17-20
    Часть4 = Лев(Стр, 4);          // символы 1-4
    Часть5 = Сред(Стр, 5, 12);     // символы 5-16
    
    Возврат Часть1 + "-" + Часть2 + "-" + Часть3 + "-" + Часть4 + "-" + Часть5;
КонецФункции

Рассмотрим подробнее, как работает этот код. Сначала мы находим позицию двоеточия, за которым следует уникальный набор символов. Затем, используя функции работы со строками (Сред, Прав, Лев), мы «вырезаем» нужные фрагменты и соединяем их через дефис в правильной последовательности.

Что нужно попросить исправить программистов 1С

Хотя вы можете преобразовать эти данные самостоятельно, использование ЗначениеВСтрокуВнутр() для обмена данными считается «дурным тоном» и устаревшей практикой. Это создает лишнюю нагрузку на принимающую сторону и привязывает логику к внутренним механизмам 1С, которые могут теоретически измениться в будущих версиях платформы.

Чтобы получить данные в стандартном виде, попросите коллег-программистов использовать один из следующих методов:

  1. Метод УникальныйИдентификатор(): Самый правильный способ. Код в 1С должен выглядеть так: Строка(Ссылка.УникальныйИдентификатор()). Это сразу вернет строку в формате 1aac131d-0c14-11e0-87d4-00151756e7a8.
  2. Метод XMLСтрока(): Это стандартный метод платформы для выгрузки ссылок. Вызов XMLСтрока(Ссылка) возвращает чистый GUID без лишних скобок и служебных символов. Это «золотой стандарт» для интеграций через XML или JSON.

Проанализируем аргументацию для общения с разработчиками: «Коллеги, вы используете внутренний формат сериализации 1С, который не является стандартом для внешних систем. Пожалуйста, замените вызов ЗначениеВСтрокуВнутр на XMLСтрока или приведение УникальныйИдентификатор к строке. Это позволит нам использовать стандартный RFC 4122 GUID без написания дополнительных парсеров».

Дополнительные сведения о генерации GUID в 1С

Вы могли заметить, что в ваших примерах часть идентификатора (151756e7a8) повторяется. Это не ошибка. В 1С идентификаторы часто генерируются на основе Version 1 UUID, который включает в себя метку времени и MAC-адрес сервера. Если объекты создаются один за другим на одном и том же сервере, большая часть GUID будет совпадать, а меняться будет только блок, отвечающий за время. Это полезно знать для понимания того, что данные не дублируются, а просто имеют общее происхождение.

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

← На главную