К статье
Практический материал

Разработка и Конфигурация · 9 мин

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

Способы получить уникальный идентификатор (GUID) документа в 1С: через конфигуратор, встроенный язык, запросы и обработки. Примеры кода и типичные ошибки.

Уникальный идентификатор документа (GUID) в 1С — это строка из 36 символов, которая однозначно определяет объект в базе данных. В отличие от номера документа, GUID не зависит от настроек нумерации, не меняется при перенумерации и одинаков во всех базах при обмене данными.

Идентификатор нужен при интеграции с внешними системами, отладке обменов, поиске «потерянных» документов и разборе дублей. Ниже разобраны основные способы получить GUID: через встроенный язык, запрос, стандартные обработки и SQL.

Что такое GUID документа и чем он отличается от номера

Каждый документ в 1С имеет два разных идентификатора. Номер документа — прикладной реквизит, видимый пользователю: он формируется по правилам нумерации, может содержать префиксы и меняется при перенумерации или переносе данных. Уникальный идентификатор — техническое значение типа «УникальныйИдентификатор», которое платформа присваивает объекту при создании и хранит в поле ссылки.

GUID состоит из 32 шестнадцатеричных цифр, сгруппированных через дефисы, например: a1b2c3d4-e5f6-7890-abcd-ef1234567890. Именно этот идентификатор используется в планах обмена, веб-сервисах, при сопоставлении объектов между базами и в механизмах синхронизации.

Как получить GUID в коде встроенного языка

Самый распространённый способ — метод УникальныйИдентификатор() у ссылки на документ. Метод возвращает значение типа «УникальныйИдентификатор», которое при необходимости преобразуется в строку:

ДокСсылка = Документы.РеализацияТоваровУслуг.НайтиПоНомеру("0000-000123", ТекущаяДатаСеанса());

Если Не ДокСсылка.Пустая() Тогда

ГУИД = ДокСсылка.УникальныйИдентификатор();

СтрокаГУИД = Строка(ГУИД); // "a1b2c3d4-..."

Сообщить(СтрокаГУИД);

КонецЕсли;

Обратный переход — получение ссылки по известному GUID — выполняется через конструктор Новый УникальныйИдентификатор() и метод ПолучитьСсылку() менеджера документа:

ГУИД = Новый УникальныйИдентификатор("a1b2c3d4-e5f6-7890-abcd-ef1234567890");

ДокСсылка = Документы.РеализацияТоваровУслуг.ПолучитьСсылку(ГУИД);

Если ДокСсылка.ПолучитьОбъект() = Неопределено Тогда

Сообщить("Документ с таким GUID не найден");

КонецЕсли;

Как получить GUID запросом

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

Запрос = Новый Запрос;

Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1

| Реализация.Ссылка КАК Ссылка

|ИЗ Документ.РеализацияТоваровУслуг КАК Реализация

|ГДЕ Реализация.Номер = &Номер";

Запрос.УстановитьПараметр("Номер", "0000-000123");

Выборка = Запрос.Выполнить().Выбрать();

Если Выборка.Следующий() Тогда

ГУИД = Выборка.Ссылка.УникальныйИдентификатор();

КонецЕсли;

В СКД и динамических списках GUID можно вывести через вычисляемое поле или получить в расшифровке. Для отчётов, где идентификатор нужен конечному пользователю, проще добавить колонку, заполняемую в коде после выполнения запроса.

Как узнать GUID без программирования

Если под рукой нет конфигуратора, GUID можно посмотреть штатными средствами. В типовых конфигурациях на БСП откройте «Все функции» (через меню или Shift+Alt+F при включённом режиме технического специалиста), найдите нужный документ и используйте стандартную обработку работы со ссылками. Также идентификатор виден в навигационной ссылке: команда «Получить ссылку» в карточке документа или копирование ссылки из журнала даёт строку вида e1cib/data/Документ.РеализацияТоваровУслуг?ref=..., где часть после ref= — это идентификатор в служебном формате.

Ещё один вариант — универсальные обработки «Поиск и замена значений» или «Консоль запросов», которые часто входят в состав типовых решений. В консоли запросов достаточно выполнить выборку документа и прочитать GUID из свойств ссылки.

Получить GUID через навигационную ссылку
  1. 1
    Откройте нужный документ в режиме предприятия
  2. 2
    Скопируйте навигационную ссылку (команда «Получить ссылку» или контекстное меню)
  3. 3
    Найдите в строке параметр ref= — после него идёт идентификатор
  4. 4
    При необходимости преобразуйте служебный формат в привычный вид GUID через метод УникальныйИдентификатор() или обработку

GUID в обменах и интеграциях

При обмене через планы обмена, EnterpriseData или веб-сервисы GUID — основной ключ сопоставления объектов. Если внешняя система передаёт документ в 1С, правильный подход — искать существующий документ по GUID через ПолучитьСсылку() и только при отсутствии создавать новый объект с принудительной установкой ссылки:

ГУИД = Новый УникальныйИдентификатор(СтрокаИзВнешнейСистемы);

ДокСсылка = Документы.ПоступлениеТоваровУслуг.ПолучитьСсылку(ГУИД);

Запрос = Новый Запрос("ВЫБРАТЬ 1 ИЗ Документ.ПоступлениеТоваровУслуг ГДЕ Ссылка = &Ссылка");

Запрос.УстановитьПараметр("Ссылка", ДокСсылка);

Если Запрос.Выполнить().Пустой() Тогда

НовыйДок = Документы.ПоступлениеТоваровУслуг.СоздатьДокумент();

НовыйДок.УстановитьСсылкуНового(ДокСсылка); // фиксируем GUID

КонецЕсли;

Учтите: в строковом представлении GUID, который возвращает 1С, порядок байтов отличается от формата, используемого в SQL Server и некоторых внешних системах. При прямой интеграции на уровне СУБД идентификатор требует перестановки групп байтов — это частая причина «не находится документ, хотя GUID совпадает».

Типичные ошибки
01
Сравнение GUID как строк без приведения регистра — сравнение даёт ложное несовпадение
02
Использование номера документа вместо GUID при обмене — после перенумерации связь теряется
03
Запись результата ПолучитьСсылку() без проверки существования — появляются битые ссылки
04
Попытка получить GUID у объекта (ДокументОбъект), а не у ссылки — метод вызывается у ссылки, у объекта берите Объект.Ссылка.УникальныйИдентификатор()
05
Игнорирование различия порядка байтов GUID между 1С и SQL — документ «не находится» при прямых запросах к СУБД

Как проверить результат и найти документ по GUID

Чтобы убедиться, что полученный идентификатор корректен, выполните обратный поиск: создайте ссылку по GUID и проверьте, существует ли объект. Признак корректной работы — запрос по ссылке возвращает строку, а реквизиты документа доступны. Если запрос пуст, а ссылка формально создана, перед вами битая ссылка или ошибка в строке идентификатора.

Контрольные точки

Как проверить результат

Формат строки GUID
Норма

36 символов, дефисы на позициях 9, 14, 19, 24

Тревожный признак

Другая длина, лишние символы, фигурные скобки

Обратный поиск по GUID
Норма

Запрос возвращает документ с ожидаемыми реквизитами

Тревожный признак

Запрос по ссылке пуст — объект не существует или GUID ошибочный

Совпадение при обмене
Норма

Один и тот же документ имеет одинаковый GUID в обеих базах

Тревожный признак

GUID различается — документы были созданы независимо, это дубли

Частые вопросы

Можно ли изменить GUID существующего документа?

Штатными средствами — нет. Идентификатор присваивается при создании объекта и хранится в ссылке. Единственный способ «поменять» GUID — создать новый документ с нужной ссылкой через УстановитьСсылкуНового() и перенести данные, удалив старый объект. Это рискованная операция: все существующие ссылки на документ в других объектах станут битыми.

Почему GUID в 1С и в SQL Server выглядит по-разному?

Платформа 1С хранит идентификатор в поле _IDRRef в двоичном виде с собственным порядком байтов. При чтении напрямую из SQL строка отличается от той, что показывает 1С. Для сопоставления нужно переставлять байты внутри групп GUID по известным правилам либо выполнять интеграцию через механизмы платформы, а не прямые запросы к СУБД.

Как получить GUID всех документов за период?

Выполните запрос по таблице документа с отбором по дате, выгрузите результат и в цикле для каждой строки вызовите Ссылка.УникальныйИдентификатор(). Результат удобно поместить в таблицу значений с колонками «Номер», «Дата», «GUID» и вывести пользователю или сохранить в файл.

Чем GUID отличается от навигационной ссылки?

Навигационная ссылка — это адрес объекта для открытия в клиенте 1С, она содержит тип объекта и его идентификатор в служебном кодировании. GUID — чистый идентификатор без привязки к типу и формату клиента. Из навигационной ссылки GUID можно извлечь, обратное преобразование требует знания типа объекта.

Работает ли УникальныйИдентификатор() на тонком клиенте?

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

Что делать, если при обмене появились дубли документов с разными GUID?

Это признак того, что документ был создан независимо в двух базах. Определите «главный» экземпляр, перенесите ссылки на него из связанных объектов, пометьте дубль на удаление и настройте сопоставление по GUID в правилах обмена, чтобы ситуация не повторялась.

Итог

Что важно запомнить

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