В экосистеме «1С:Предприятие 8.3» каждый объект ссылочного типа (справочники, документы, планы видов характеристик и др.) обладает внутренним уникальным идентификатором (UUID или GUID). Этот идентификатор является «паспортом» объекта в базе данных, позволяя системе однозначно отличать одну запись от другой, даже если их наименования или коды полностью совпадают. В рамках данной статьи мы подробно разберем, как программно получить этот идентификатор, как создавать новые значения и на что стоит обратить внимание при работе через внешние соединения.
Для получения уникального идентификатора у любой ссылки в системе 1С существует встроенный метод УникальныйИдентификатор(). Давайте проанализируем, как это работает на практике. Если у нас уже есть ссылка на объект (например, на элемент справочника «Номенклатура»), мы можем вызвать этот метод напрямую.
Рассмотрим пример кода:
// Предположим, СсылкаНаТовар — это ссылка на элемент справочника
ИдентификаторОбъекта = СсылкаНаТовар.УникальныйИдентификатор();
Сообщить("Уникальный идентификатор: " + Строка(ИдентификаторОбъекта));
Важно понимать, что метод УникальныйИдентификатор() возвращает значение специального объектного типа УникальныйИдентификатор, а не просто строку. Если вы попытаетесь вывести его в сообщение или записать в текстовый файл, система автоматически преобразует его в строковое представление формата «xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx».
Проанализируем ситуацию, когда метод вызывается у пустой ссылки. В 1С любая пустая ссылка (например, Справочники.Номенклатура.ПустаяСсылка()) также имеет свой идентификатор. Однако этот идентификатор всегда состоит из одних нулей: 00000000-0000-0000-0000-000000000000.
Разберем по шагам, зачем это нужно знать:
Ссылка.Пустая() разработчики проверяют строковое представление УИДа на равенство нулевой строке, хотя первый вариант предпочтительнее с точки зрения производительности.Иногда перед программистом стоит задача сгенерировать совершенно новый идентификатор, который не привязан к существующему объекту. Это часто требуется при реализации собственных механизмов обмена данными или при работе с внешними API. Для этого мы используем конструктор Новый.
Рассмотрим пример создания нового GUID:
// Генерация абсолютно нового, случайного идентификатора
НовыйУИД = Новый УникальныйИдентификатор();
Сообщить("Сгенерирован новый идентификатор: " + НовыйУИД);
Если же у нас есть строковое представление идентификатора, полученное из внешней системы, мы можем преобразовать его обратно в объектный тип 1С следующим образом:
СтрокаИзФайла = "550e8400-e29b-41d4-a716-446655440000";
ОбъектныйУИД = Новый УникальныйИдентификатор(СтрокаИзФайла);
Выясним одну из самых распространенных проблем, с которой сталкиваются разработчики при интеграции двух баз 1С. Как было отмечено в обсуждении, тип УникальныйИдентификатор является специфическим для платформы 1С. При передаче данных через COM-соединение (Automation) внешняя среда не всегда корректно распознает этот тип. Для изучения базовых принципов взаимодействия между конфигурациями можно использовать материал по работе с COM-соединением в 1С.
Рассмотрим правильный алгоритм действий:
Ссылка.УникальныйИдентификатор() напрямую через COM-границу. Это приведет к ошибке или непредсказуемому поведению.УникальныйИдентификатор.Для максимально быстрого и надежного преобразования в строку рекомендуется использовать функцию XMLСтрока(). Посмотрим на пример работы через COM:
// Код на стороне основной базы (вызывающей)
// Соединение — это объект COM-соединения с другой базой
СсылкаИзДругойБазы = Соединение.Справочники.Номенклатура.НайтиПоКоду("001");
// ОШИБКА: УИД = СсылкаИзДругойБазы.УникальныйИдентификатор();
// ПРАВИЛЬНО:
УИД_Строка = Соединение.XMLСтрока(СсылкаИзДругойБазы);
Использование XMLСтрока() предпочтительнее обычного метода Строка(), так как она работает быстрее и гарантирует отсутствие лишних непечатаемых символов или локализованных форматов.
После того как мы получили идентификатор, нам часто требуется найти сам объект в базе данных. Для этого в менеджерах объектов предусмотрен метод ПолучитьСсылку(). Разберем важную особенность этого метода, которую часто упускают новички.
Посмотрим на пример кода поиска (в случае расхождения ссылок в базах применяется перенос данных между похожими конфигурациями 1С с сопоставлением по произвольным полям поиска):
ИскомыйУИД = Новый УникальныйИдентификатор("...");
СсылкаНаОбъект = Справочники.Контрагенты.ПолучитьСсылку(ИскомыйУИД);
// ВНИМАНИЕ: Метод всегда возвращает ссылку, даже если объекта нет в базе!
// Нам нужно проверить реальное наличие объекта
Если СсылкаНаОбъект.ПолучитьОбъект() = Неопределено Тогда
Сообщить("Объект с таким идентификатором не найден в базе данных.");
Иначе
Сообщить("Объект найден: " + СсылкаНаОбъект);
КонецЕсли;
Метод ПолучитьСсылку() просто «конструирует» ссылку в оперативной памяти на основе переданного GUID. Он не обращается к базе данных в момент вызова. Обращение к БД происходит только тогда, когда вы пытаетесь прочитать свойства этой ссылки (через ПолучитьОбъект() или обращение к реквизитам).
Проанализируем техническую сторону вопроса. Если вы заглянете «под капот» вашей базы данных (MS SQL Server или PostgreSQL), вы обнаружите, что уникальный идентификатор хранится в поле _IDRRef.
Важный технический момент: в СУБД GUID хранится в бинарном формате (16 байт). При этом порядок байтов в строковом представлении 1С отличается от порядка байтов в SQL (Microsoft format). Если вы планируете писать прямые SQL-запросы к базе 1С, вам придется учитывать это «перевертывание» байтов для корректного сопоставления записей. В стандартной разработке на языке 1С об этом задумываться не нужно, так как платформа берет трансформацию на себя.
Подводя итог, можно выделить основные правила работы с УИД:
.УникальныйИдентификатор().Новый УникальныйИдентификатор().XMLСтрока().ПолучитьСсылку() не гарантирует существование объекта, всегда делайте проверку через ПолучитьОбъект().Соблюдение этих простых правил позволит вам избежать трудноотлавливаемых ошибок при синхронизации данных и разработке сложных распределенных систем. Для контроля результата и поиска расхождений после обмена применяется автоматическая сверка бухгалтерских и налоговых проводок между базами 1С.