Как получить уникальный идентификатор объекта в 1С 8.3?

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

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

Базовый метод получения идентификатора у объекта

Для получения уникального идентификатора у любой ссылки в системе 1С существует встроенный метод УникальныйИдентификатор(). Давайте проанализируем, как это работает на практике. Если у нас уже есть ссылка на объект (например, на элемент справочника «Номенклатура»), мы можем вызвать этот метод напрямую.

Рассмотрим пример кода:


// Предположим, СсылкаНаТовар — это ссылка на элемент справочника
ИдентификаторОбъекта = СсылкаНаТовар.УникальныйИдентификатор();
Сообщить("Уникальный идентификатор: " + Строка(ИдентификаторОбъекта));

Важно понимать, что метод УникальныйИдентификатор() возвращает значение специального объектного типа УникальныйИдентификатор, а не просто строку. Если вы попытаетесь вывести его в сообщение или записать в текстовый файл, система автоматически преобразует его в строковое представление формата «xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx».

Работа с «пустыми» идентификаторами

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

Разберем по шагам, зачем это нужно знать:

  1. Проверка на заполненность: Иногда вместо проверки Ссылка.Пустая() разработчики проверяют строковое представление УИДа на равенство нулевой строке, хотя первый вариант предпочтительнее с точки зрения производительности.
  2. Инициализация: При создании структур обмена нулевой GUID может служить маркером того, что объект еще не сопоставлен. Для настройки регулярной синхронизации по расписанию используется программа автоматизации регулярного обмена данными между базами 1С.

Генерация нового уникального идентификатора

Иногда перед программистом стоит задача сгенерировать совершенно новый идентификатор, который не привязан к существующему объекту. Это часто требуется при реализации собственных механизмов обмена данными или при работе с внешними API. Для этого мы используем конструктор Новый.

Рассмотрим пример создания нового GUID:


// Генерация абсолютно нового, случайного идентификатора
НовыйУИД = Новый УникальныйИдентификатор();
Сообщить("Сгенерирован новый идентификатор: " + НовыйУИД);

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


СтрокаИзФайла = "550e8400-e29b-41d4-a716-446655440000";
ОбъектныйУИД = Новый УникальныйИдентификатор(СтрокаИзФайла);

Нюансы работы через COM-соединение

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

Рассмотрим правильный алгоритм действий:

  1. Никогда не пытайтесь передать результат Ссылка.УникальныйИдентификатор() напрямую через COM-границу. Это приведет к ошибке или непредсказуемому поведению.
  2. Преобразуйте идентификатор в строку на стороне «базы-источника» (внутри COM).
  3. На стороне «базы-приемника» при необходимости преобразуйте строку обратно в тип УникальныйИдентификатор.

Для максимально быстрого и надежного преобразования в строку рекомендуется использовать функцию XMLСтрока(). Посмотрим на пример работы через COM:


// Код на стороне основной базы (вызывающей)
// Соединение — это объект COM-соединения с другой базой
СсылкаИзДругойБазы = Соединение.Справочники.Номенклатура.НайтиПоКоду("001");

// ОШИБКА: УИД = СсылкаИзДругойБазы.УникальныйИдентификатор(); 
// ПРАВИЛЬНО:
УИД_Строка = Соединение.XMLСтрока(СсылкаИзДругойБазы);

Использование XMLСтрока() предпочтительнее обычного метода Строка(), так как она работает быстрее и гарантирует отсутствие лишних непечатаемых символов или локализованных форматов.

Поиск объекта по его уникальному идентификатору

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

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


ИскомыйУИД = Новый УникальныйИдентификатор("...");
СсылкаНаОбъект = Справочники.Контрагенты.ПолучитьСсылку(ИскомыйУИД);

// ВНИМАНИЕ: Метод всегда возвращает ссылку, даже если объекта нет в базе!
// Нам нужно проверить реальное наличие объекта
Если СсылкаНаОбъект.ПолучитьОбъект() = Неопределено Тогда
    Сообщить("Объект с таким идентификатором не найден в базе данных.");
Иначе
    Сообщить("Объект найден: " + СсылкаНаОбъект);
КонецЕсли;

Метод ПолучитьСсылку() просто «конструирует» ссылку в оперативной памяти на основе переданного GUID. Он не обращается к базе данных в момент вызова. Обращение к БД происходит только тогда, когда вы пытаетесь прочитать свойства этой ссылки (через ПолучитьОбъект() или обращение к реквизитам).

Хранение идентификаторов на уровне СУБД

Проанализируем техническую сторону вопроса. Если вы заглянете «под капот» вашей базы данных (MS SQL Server или PostgreSQL), вы обнаружите, что уникальный идентификатор хранится в поле _IDRRef.

Важный технический момент: в СУБД GUID хранится в бинарном формате (16 байт). При этом порядок байтов в строковом представлении 1С отличается от порядка байтов в SQL (Microsoft format). Если вы планируете писать прямые SQL-запросы к базе 1С, вам придется учитывать это «перевертывание» байтов для корректного сопоставления записей. В стандартной разработке на языке 1С об этом задумываться не нужно, так как платформа берет трансформацию на себя.

Итоги и рекомендации

Подводя итог, можно выделить основные правила работы с УИД:

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

← На главную