Разработка и Конфигурация · 13 мин
Как получить GUID документа в 1С
Как получить GUID документа в 1С: через запрос, метод УникальныйИдентификатор(), внешние источники и обмен данными. Примеры кода, ошибки и проверка.
GUID (глобальный уникальный идентификатор) документа в 1С — это 36-символьная строка вида 8e5f4a2b-1c3d-4e5f-9a8b-7c6d5e4f3a2b, которая однозначно определяет объект в базе. В отличие от номера документа, GUID не меняется при перенумерации, переносе между базами и обмене данными, поэтому именно его используют для интеграций, синхронизаций и поиска «потерянных» объектов.
Задача получить GUID возникает в нескольких типовых ситуациях: при настройке обмена с сайтом или другой системой, при поиске документа по ссылке из внешней базы, при отладке синхронизации, когда в логе фигурирует только идентификатор, а также при написании собственных механизмов интеграции через HTTP-сервисы или COM-соединение.
Ниже разобраны основные способы получения GUID: встроенными средствами языка 1С, запросом, через консоль кода, а также обратная задача — найти документ по известному GUID. Отдельно рассмотрены типичные ошибки, например получение GUID от несуществующей ссылки или путаница между представлением идентификатора в разных системах хранения.
Что такое GUID документа и где он хранится
Каждый объект ссылочного типа в 1С (документ, справочник, элемент плана видов характеристик) при создании получает уникальный идентификатор, который сохраняется вместе со ссылкой. Физически ссылка в базе данных состоит из идентификатора типа объекта и самого GUID. Именно поэтому один и тот же GUID в разных таблицах может означать разные объекты, если не учитывать тип.
GUID присваивается объекту один раз — в момент первой записи — и не меняется на протяжении всего жизненного цикла. Удаление документа и создание нового с теми же реквизитами приведёт к генерации нового GUID. Это важно учитывать при обменах: восстановление документа «с нуля» вместо поиска по идентификатору разорвёт связи в интегрированных системах.
Представление GUID в виде привычной строки с дефисами — это лишь текстовая форма. Внутри платформа оперирует значением типа УникальныйИдентификатор, и сравнивать идентификаторы корректно именно как значения этого типа, а не как строки.
Получение GUID методом УникальныйИдентификатор()
Самый прямой способ — вызвать метод УникальныйИдентификатор() у ссылки на документ. Метод доступен и на сервере, и на клиенте (в тонком и веб-клиенте), что делает его универсальным для большинства задач.
// ДокументСсылка — ссылка на документ
Идентификатор = ДокументСсылка.УникальныйИдентификатор();
// Если нужна строка для передачи во внешнюю систему:
СтрокаGUID = Строка(Идентификатор);
Сообщить(СтрокаGUID); // например: 8e5f4a2b-1c3d-4e5f-9a8b-7c6d5e4f3a2b
Если у вас есть объект документа (полученный через ПолучитьОбъект()), метод вызывается у его свойства Ссылка. Вызов метода непосредственно у объекта тоже сработает, так как объект делегирует его своей ссылке, но явное обращение через Ссылка делает код понятнее.
Для нового, ещё не записанного документа метод вернёт идентификатор, который уже сгенерирован платформой, однако объект в базе по нему не найдётся до первой записи. Если логика интеграции требует стабильного GUID, записывайте документ до передачи идентификатора во внешнюю систему.
Как получить GUID запросом и в консоли кода
В языке запросов 1С нет функции, напрямую возвращающей строковое представление GUID. Запрос возвращает ссылку, а идентификатор уже извлекается из неё в коде после выполнения запроса.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РеализацияТоваровУслуг.Ссылка
|ИЗ
| Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
|ГДЕ
| РеализацияТоваровУслуг.Номер = &Номер
| И РеализацияТоваровУслуг.Дата МЕЖДУ &НачалоПериода И &КонецПериода";
Запрос.УстановитьПараметр("Номер", "0000-000123");
Запрос.УстановитьПараметр("НачалоПериода", НачалоГода(ТекущаяДатаСеанса()));
Запрос.УстановитьПараметр("КонецПериода", КонецГода(ТекущаяДатаСеанса()));
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить(Строка(Выборка.Ссылка.УникальныйИдентификатор()));
КонецЦикла;
Обратите внимание на фильтрацию по номеру: номера документов в типовых конфигурациях не уникальны вне периода и могут повторяться в разных годах, а в некоторых конфигурациях — и внутри одного периода при ручной нумерации. Поэтому поиск по номеру без привязки к дате может вернуть несколько документов.
Для разового получения GUID удобна консоль кода (внешняя обработка, выполняющая произвольный код на сервере). Достаточно выбрать ссылку в параметре и выполнить одну строку с методом УникальныйИдентификатор(). Это безопасный способ, так как он не меняет данные.
- 1Определите, какой документ нужен: вид документа, номер, дата или другой отбор
- 2Получите ссылку на документ запросом, методом НайтиПоНомеру или выбором из формы
- 3Вызовите у ссылки метод УникальныйИдентификатор()
- 4Приведите результат к строке функцией Строка(), если нужен текстовый вид
- 5Проверьте, что документ существует и не помечен на удаление, прежде чем передавать GUID дальше
Поиск документа по известному GUID
Обратная задача встречается чаще: из внешней системы пришёл GUID, и нужно найти соответствующий документ в базе 1С. Для этого используется метод менеджера документа ПолучитьСсылку() с заранее созданным значением типа УникальныйИдентификатор.
СтрокаGUID = "8e5f4a2b-1c3d-4e5f-9a8b-7c6d5e4f3a2b";
Попытка
Идентификатор = Новый УникальныйИдентификатор(СтрокаGUID);
Исключение
Сообщить("Некорректный формат GUID");
Возврат;
КонецПопытки;
ДокументСсылка = Документы.РеализацияТоваровУслуг.ПолучитьСсылку(Идентификатор);
// Проверка, что объект реально существует в базе
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| Таблица.Ссылка
|ИЗ
| Документ.РеализацияТоваровУслуг КАК Таблица
|ГДЕ
| Таблица.Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", ДокументСсылка);
Если Запрос.Выполнить().Пустой() Тогда
Сообщить("Документ с таким GUID не найден");
Иначе
Сообщить("Найден: " + ДокументСсылка);
КонецЕсли;
Ключевой момент — обязательная проверка существования. Метод ПолучитьСсылку() создаёт ссылку с указанным идентификатором даже если объекта в базе нет. Попытка обратиться к реквизитам такой «битой» ссылки вызовет ошибку, а запись объекта по ней создаст документ с этим GUID, что иногда используют намеренно при синхронизации, но опасно при случайном срабатывании.
Если заранее неизвестен вид документа, придётся перебирать менеджеры нужных видов документов или использовать метаданные. Универсального метода «найти любой объект по GUID» в платформе нет, так как GUID уникален только в сочетании с типом.
GUID в обменах, COM и внешних источниках
При интеграциях GUID передают в строковом виде, и здесь есть тонкость с представлением. В COM-соединении и при выгрузке через OLE идентификатор иногда отображается в «перевёрнутом» порядке байтов, отличном от привычного строкового вида внутри 1С. Если сопоставление объектов между системами «не сходится», проверьте, не требуется ли преобразование порядка групп символов.
В планах обмена и типовых механизмах синхронизации (например, через EnterpriseData или универсальный формат) сопоставление объектов как раз строится на GUID. При ручной доработке таких механизмов не заменяйте идентификаторы и не генерируйте их заново для уже синхронизированных объектов — это приведёт к дублям в базе-приёмнике.
При передаче GUID через HTTP-сервисы передавайте строку в стандартном виде с дефисами в нижнем регистре. Принимающая сторона создаёт из неё значение через Новый УникальныйИдентификатор(Строка), и лишние пробелы или фигурные скобки в строке вызовут исключение.
Сравнение вариантов
Подходит для любого кода на встроенном языке, работает на клиенте и сервере. Ограничение: нужна уже полученная ссылка
Удобна для разового получения GUID без изменения конфигурации. Ограничение: требует прав на выполнение произвольного кода
Единственный прямой способ найти объект по GUID. Ограничение: нужно знать вид документа и проверять существование
Быстро для массового анализа, но требует знания структуры хранения и преобразования бинарного представления GUID; обход поддерживаемых механизмов платформы
Типичные ошибки и ограничения
Самая частая ошибка — сравнение GUID как строк с учётом регистра. Строковые представления могут отличаться регистром символов в разных системах, и сравнение «строка = строка» даст ложное несовпадение. Корректно приводить обе стороны к типу УникальныйИдентификатор или нормализовать регистр строк перед сравнением.
Вторая распространённая проблема — попытка получить GUID у значения, которое не является ссылкой, например у структуры или у результата запроса без обращения к полю Ссылка. Метод УникальныйИдентификатор() есть только у ссылок и объектов ссылочных типов; у регистров сведений и записей регистров его нет, там идентификация строится по измерениям и ключам записей.
Третья ошибка — использование GUID как единственного ключа поиска без учёта типа объекта. Один и тот же идентификатор теоретически может встретиться у документа и у элемента справочника, поэтому в интеграционных сообщениях всегда передавайте вместе с GUID и тип объекта.
Проверка результата и границы самостоятельной работы
После получения GUID убедитесь, что идентификатор соответствует нужному документу: выполните обратный поиск через ПолучитьСсылку() и сравните номер, дату и организацию найденного объекта с ожидаемыми. Такая двусторонняя проверка занимает минуту и исключает передачу чужого идентификатора во внешнюю систему.
Для массовой выгрузки GUID (например, всех документов за период) используйте запрос с последующим обходом выборки и записью результатов в файл или таблицу значений. Избегайте построчных обращений к базе в цикле через ПолучитьОбъект() — для получения GUID объекта загружать не нужно, достаточно ссылки из запроса.
Операции, связанные с принудительной установкой GUID при записи объектов, изменением механизмов обмена и прямой работой с базой данных вне платформы, относятся к зоне риска. Их стоит выполнять на копии базы и при наличии актуальной резервной копии, а в продуктиве — только после тестирования на реальных сценариях обмена.
Как проверить результат
36 символов, 4 дефиса, шестнадцатеричные цифры
Фигурные скобки, пробелы, другая длина — строка не распарсится
Найденный документ совпадает по номеру, дате и виду
Документ не найден или найден другой — GUID или вид документа неверны
Запрос по ссылке возвращает строку
Запрос пуст — ссылка «битая», объект отсутствует
Один GUID соответствует одному объекту в каждой базе
Дубли объектов в приёмнике — идентификаторы генерировались заново
При отладке интеграций сохраняйте в журнал пару «GUID + вид документа + номер + дата». По одному голому GUID в логе через неделю восстановить, о каком документе шла речь, заметно сложнее, особенно если объект уже удалили.
Часто задаваемые вопросы
Можно ли получить GUID документа без программирования?
Штатного отображения GUID в формах документов нет. Практический вариант без изменения конфигурации — внешняя обработка «консоль кода», где для выбранной ссылки выполняется одна строка с методом УникальныйИдентификатор(). Некоторые типовые механизмы обмена показывают идентификаторы в регистрах соответствия объектов.
Меняется ли GUID документа при перепроведении или изменении?
Нет. GUID присваивается при первой записи и остаётся неизменным при любых изменениях реквизитов, проведении, отмене проведения и пометке на удаление. Новый GUID появится только у нового объекта.
Почему ПолучитьСсылку() возвращает ссылку, а документа в базе нет?
Метод ПолучитьСсылку() не обращается к базе данных — он конструирует ссылку из переданного идентификатора. Существование объекта нужно проверять отдельно запросом или через попытку чтения данных. Это штатное поведение платформы, а не ошибка.
Уникален ли GUID во всей базе, а не только внутри вида документов?
Генератор идентификаторов делает повторение практически невозможным, но платформа гарантирует уникальность ссылки как комбинации типа и GUID. Поэтому в интеграциях всегда передавайте тип объекта вместе с идентификатором.
Как получить GUID всех документов за период?
Выполните запрос по таблице нужного вида документа с отбором по дате, затем в цикле по выборке вызывайте Ссылка.УникальныйИдентификатор() и сохраняйте результаты в файл или таблицу. Получать объект документа для этого не требуется — достаточно ссылки, что работает быстро даже на больших выборках.
Можно ли задать документу желаемый GUID при создании?
Да: создать ссылку через ПолучитьСсылку(Новый УникальныйИдентификатор(...)), затем у нового объекта вызвать УстановитьСсылкуНового() с этой ссылкой и записать объект. Такой приём применяется в механизмах синхронизации, но вне отлаженного обмена использовать его не рекомендуется — при конфликте идентификаторов запись завершится ошибкой.
Что важно запомнить
GUID документа получается методом УникальныйИдентификатор() у ссылки, обратный поиск — через ПолучитьСсылку() с обязательной проверкой существования. Идентификатор неизменен в течение жизни объекта, уникален в сочетании с типом, а при интеграциях его следует передавать вместе с видом документа и сравнивать как значение типа, а не как строку.