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

В этой статье мы разберём все актуальные способы получения ссылок по UID — от встроенных методов платформы до универсальных функций для типовых конфигураций (УТ 11, БП 3.0, ЗУП 3.1 и др.). Особое внимание уделим распространённой ошибке с пустыми ссылками при работе через COM-соединение, которая ломает обмены в 30% случаев. Также вы найдёте готовые кодовые сниппеты для вставки в свои обработки.

Что такое UID в 1С и зачем нужны ссылки по нему

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

  • 🔄 Для обмена данными между базами (например, в распределённых системах)
  • 🔗 При интеграции с внешними системами (сайты, CRM, ERP)
  • 🛠️ В обработках миграции данных между конфигурациями
  • 🔍 Для поиска "потерявшихся" объектов после сбоев

Ссылка по UID — это не просто идентификатор, а полноценный объект Ссылка, с которым можно работать дальше: получать реквизиты, вызывать методы или передавать в другие функции. Например, имея UID документа "a1b2c3d4-5678-90ef-1234-567890abcdef", вы можете получить саму ссылку на документ и затем прочитать его дату, номер или сумму.

⚠️ Внимание: В конфигурациях до версии 1С:Предприятие 8.3.10 UID мог дублироваться при ручном копировании объектов через ПометитьУдаление() + СнятьПомекуУдаления(). Проверяйте актуальность вашей платформы!

Способ 1: Встроенный метод платформы ПолучитьСсылкуПоUID()

Начиная с версии 8.3.14, в платформе появился универсальный метод ПолучитьСсылкуПоUID(), который работает для всех типов объектов. Это самый надёжный способ, если ваша конфигурация поддерживает актуальную платформу.

Синтаксис метода:

Ссылка = Метаданные.ИмяОбъекта.ПолучитьСсылкуПоUID(UID);

Пример для справочника "Номенклатура":

UID = "a1b2c3d4-5678-90ef-1234-567890abcdef";

СсылкаНаНоменклатуру = Справочники.Номенклатура.ПолучитьСсылкуПоUID(UID);

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

Сообщить("Найдена номенклатура: " + СсылкаНаНоменклатуру.Наименование);

Иначе

Сообщить("Объект с UID не найден!");

КонецЕсли;

Тип объекта Пример вызова Возвращаемый тип
Справочник Справочники.Контрагенты.ПолучитьСсылкуПоUID() СправочникСсылка.Контрагенты
Документ Документы.ЗаказПокупателя.ПолучитьСсылкуПоUID() ДокументСсылка.ЗаказПокупателя
Регистр сведений РегистрыСведений.ЦеныНоменклатуры.ПолучитьСсылкуПоUID() РегистрСведенийСсылка.ЦеныНоменклатуры
План видов характеристик ПланыВидовХарактеристик.Номенклатура.ПолучитьСсылкуПоUID() ПланВидовХарактеристикСсылка.Номенклатура
⚠️ Внимание: Метод ПолучитьСсылкуПоUID() вернёт пустую ссылку, если объект был помечен на удаление. Чтобы найти такие объекты, используйте запрос с фильтром по ПометкаУдаления = Ложь.

Используется платформа 8.3.14 или новее|UID имеет корректный формат (36 символов)|Объект не помечен на удаление|У пользователя есть права на чтение объекта-->

Способ 2: Универсальная функция для старых версий платформы

Если вы работаете с устаревшими конфигурациями (до 8.3.14), можно использовать универсальную функцию, которая ищет объект по UID через запрос. Этот метод работает для всех типов метаданных и не зависит от версии платформы.

Пример функции:

Функция ПолучитьСсылкуПоUID(ТипОбъекта, UID) Экспорт

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

Запрос.Текст =

"ВЫБРАТЬ

| Ссылка КАК Ссылка

|ИЗ

| &ТипОбъекта КАК Объект

|ГДЕ

| Объект.УникальныйИдентификатор = &UID";

Запрос.УстановитьПараметр("ТипОбъекта", ТипОбъекта);

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

Результат = Запрос.Выполнить().Выбрать();

Если Результат.Следующий() Тогда

Возврат Результат.Ссылка;

Иначе

Возврат Справочники.ПустаяСсылка();

КонецЕсли;

КонецФункции

Как использовать:

ТипНоменклатуры = Новый ОписаниеТипов("СправочникСсылка.Номенклатура");

UID = "a1b2c3d4-5678-90ef-1234-567890abcdef";

Ссылка = ПолучитьСсылкуПоUID(ТипНоменклатуры, UID);

  • ⚡ Преимущества метода:
  • 🔹 Работает на любых версиях платформы
  • 🔹 Поддерживает все типы объектов (включая регистры и планы видов характеристик)
  • 🔹 Можно доработать для поиска по дополнительным реквизитам
  • ⚠️ Недостатки:
  • 🔹 Медленнее встроенного метода (запрос к базе)
  • 🔹 Требует прав на выполнение запросов

Встроенный метод платформы|Универсальная функция через запрос|Собственная доработка|Не знаю, что это-->

Способ 3: Работа с UID в типовых конфигурациях (УТ, БП, ЗУП)

Типовые конфигурации (Управление торговлей 11, Бухгалтерия предприятия 3.0, Зарплата и управление персоналом 3.1) часто имеют свои нюансы при работе с UID. Например, в УТ 11 для документов ЗаказПокупателя или РеализацияТоваровУслуг может потребоваться дополнительная проверка на принадлежность к текущему узлу РИБ (распределённой информационной базе).

Пример для УТ 11.4 (поиск документа ЗаказПокупателя с учётом РИБ):

Функция ПолучитьДокументПоUID_УТ11(UID)

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

Запрос.Текст =

"ВЫБРАТЬ

| Ссылка КАК Ссылка

|ИЗ

| Документ.ЗаказПокупателя КАК Заказ

|ГДЕ

| Заказ.УникальныйИдентификатор = &UID

| И Заказ.ЭтоГоловнойУзелРИБ()";

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

Результат = Запрос.Выполнить().Выбрать();

Если Результат.Следующий() Тогда

Возврат Результат.Ссылка;

Иначе

Возврат Документы.ЗаказПокупателя.ПустаяСсылка();

КонецЕсли;

КонецФункции

Для БП 3.0 актуальна проблема с обменом данными через планы обмена. Если UID пришёл из другой базы, может потребоваться предварительная синхронизация:

ПланОбмена = ПланыОбмена.ОсновнойПланОбмена.НайтиПоНаименованию("Узел1");

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

ПланОбмена.ЗагрузитьДанные();

КонецЕсли;

⚠️ Внимание: В ЗУП 3.1 при работе с UID сотрудников проверяйте принадлежность к физическим лицам. Один человек может иметь несколько записей в справочнике Сотрудники, но одно физическое лицо.
Как проверить принадлежность UID к текущему узлу РИБ?

В распределённых базах каждый узел имеет свой набор UID. Чтобы убедиться, что объект существует в текущем узле, используйте функцию ЭтоГоловнойУзелРИБ() в запросе или проверьте реквизит Владелец (для регистров сведений). Если объект принадлежит другому узлу, его придётся сначала загрузить через план обмена.

Способ 4: Получение ссылок по UID через COM-соединение

При работе с 1С:Предприятие через COM-соединение (например, из Excel, Python или другой внешней системы) получение ссылок по UID имеет свои особенности. Основная проблема — пустые ссылки, которые возвращаются даже для существующих объектов. Это связано с особенностями передачи данных через V83.ComConnector.

Решение: используйте двойное преобразование — сначала получите строку с UID, затем преобразуйте её обратно в ссылку на стороне 1С.

Пример кода на VBScript (для Excel):

' Подключение к базе

Set V83 = CreateObject("V83.ComConnector")

Set Connection = V83.Connect("File=""C:\Bases\Trade"";Usr=""Администратор""")

' Получение ссылки по UID

UID = "a1b2c3d4-5678-90ef-1234-567890abcdef"

Set Link = Connection.NewObject("СправочникСсылка.Номенклатура")

Link.UniqueID = UID

' Проверка, что ссылка не пустая

If Not Link.Empty() Then

MsgBox "Наименование: " & Link.Description

Else

MsgBox "Объект не найден!"

End If

Для Python (с использованием py3com):

import comtypes.client

v83 = comtypes.client.CreateObject("V83.ComConnector")

connection = v83.Connect(r'Srvr="localhost\trade";Ref="Trade";Usr="Администратор";Pwd="";')

uid = "a1b2c3d4-5678-90ef-1234-567890abcdef"

link = connection.NewObject("СправочникСсылка.Номенклатура")

link.UniqueID = uid

if not link.Empty():

print(f"Найден объект: {link.Description}")

else:

print("Объект не найден!")

  • 🐍 Частые ошибки при работе через COM:
  • 🔹 Ошибка "Недопустимый идентификатор" — проверьте формат UID (должен быть в виде строки с дефисами)
  • 🔹 Пустые ссылки — убедитесь, что объект не помечен на удаление
  • 🔹 Ошибка доступа — пользователь должен иметь права на чтение метаданных
💡

Если через COM возвращается пустая ссылка, попробуйте сначала получить объект через запрос, а затем передать его UID обратно в 1С. Это обходит ограничения COM-соединения на некоторые типы данных.

Способ 5: Поиск ссылок по UID в регистрах сведений и планах видов характеристик

Для регистров сведений и планов видов характеристик стандартные методы получения ссылок по UID могут не работать. Здесь требуется особый подход, так как эти объекты не имеют прямой привязки к справочникам или документам.

Пример для регистра сведений ЦеныНоменклатуры:

Функция ПолучитьЗаписьРегистраПоUID(UID)

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

Запрос.Текст =

"ВЫБРАТЬ

| Регистратор КАК Регистратор,

| Период КАК Период

|ИЗ

| РегистрСведений.ЦеныНоменклатуры КАК Цены

|ГДЕ

| Цены.УникальныйИдентификатор = &UID";

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

Результат = Запрос.Выполнить().Выбрать();

Если Результат.Следующий() Тогда

Возврат РегистрыСведений.ЦеныНоменклатуры.СоздатьМенеджерЗаписи().

Прочитать(Результат.Регистратор, Результат.Период);

Иначе

Возврат Неопределено;

КонецЕсли;

КонецФункции

Для планов видов характеристик (например, ХарактеристикиНоменклатуры):

Функция ПолучитьХарактеристикуПоUID(UID)

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

Запрос.Текст =

"ВЫБРАТЬ

| Ссылка КАК Ссылка

|ИЗ

| ПланВидовХарактеристик.ХарактеристикиНоменклатуры КАК Характеристика

|ГДЕ

| Характеристика.УникальныйИдентификатор = &UID";

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

Результат = Запрос.Выполнить().Выбрать();

Если Результат.Следующий() Тогда

Возврат Результат.Ссылка;

Иначе

Возврат ПланыВидовХарактеристик.ХарактеристикиНоменклатуры.ПустаяСсылка();

КонецЕсли;

КонецФункции

⚠️ Внимание: В регистрах сведений UID присваивается не самой записи, а объекту регистратора (документу). Если вам нужен UID конкретной записи регистра, используйте составной ключ из Регистратор + Период + Измерения.

Типовые ошибки и их решения

При работе со ссылками по UID разработчики часто сталкиваются с типичными ошибками. Вот самые распространённые из них и способы их исправления:

Ошибка Причина Решение
Ошибка при вызове метода контекста (ПолучитьСсылкуПоUID) Устаревшая версия платформы (до 8.3.14) Используйте универсальную функцию через запрос (Способ 2)
Ссылка пустая, хотя UID корректный Объект помечен на удаление или принадлежит другому узлу РИБ Проверьте ПометкаУдаления и ЭтоГоловнойУзелРИБ()
Недопустимый идентификатор при работе через COM Неправильный формат UID (отсутствуют дефисы или лишние символы) Приведите UID к стандарту: СтрЗаменить(UID, "-", "")Лев(UID, 8) + "-" + Сред(UID, 9, 4) + ...
Ошибка доступа при выполнении запроса У пользователя нет прав на чтение метаданных или объекта Настройте права в конфигураторе или используйте привилегированный режим
UID не найден, хотя объект существует В базе несколько объектов с одинаковым UID (ошибка репликации) Очистите дубликаты через ТестированиеИИсправление или вручную

Если вы получаете ошибку "Поле объекта не обнаружено (УникальныйИдентификатор)", это значит, что в вашей конфигурации отключена поддержка UID. Включить её можно в конфигураторе:

  1. Откройте конфигуратор и перейдите в Общие → Поддержка уникальных идентификаторов
  2. Установите флаг Использовать уникальные идентификаторы
  3. Выполните Обновление конфигурации базы данных
💡

Всегда проверяйте формат UID перед использованием! Корректный UID должен иметь вид xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx (36 символов с 4 дефисами).

FAQ: Частые вопросы по работе с UID в 1С

Можно ли изменить UID объекта вручную?

Нет, UID присваивается автоматически при создании объекта и не может быть изменён в стандартных механизмах платформы. Если вам нужно "перенести" историю объекта на новый UID, используйте механизм замены ссылок через ЗаменаСсылок.Выполнить().

Почему при обмене данными UID дублируются?

Это типичная проблема при ручном копировании объектов через ПометитьУдаление() + СнятьПомекуУдаления() или при некорректной настройке плана обмена. Чтобы избежать дублей:

  1. Используйте ТестированиеИИсправление с флагом Поиск и удаление дублей
  2. Настройте правильную синхронизацию по UID в плане обмена
  3. Проверяйте уникальность UID перед загрузкой данных
Как получить UID объекта, если известна только ссылка?

Используйте свойство УникальныйИдентификатор:

Ссылка = Справочники.Номенклатура.НайтиПоНаименованию("Товар 1");

UID = Ссылка.УникальныйИдентификатор; // Вернёт строку вида "a1b2c3d4-5678-90ef-1234-567890abcdef"

Если свойство отсутствует, обновите конфигурацию — поддержка UID могла быть отключена.

Можно ли искать объекты по UID в мобильной платформе 1С?

Да, в мобильной платформе 1С (начиная с версии 8.3.13) также поддерживается работа с UID. Используйте те же методы, что и для десктопной версии. Ограничения:

  • 📱 Запросы могут выполняться медленнее из-за особенностей мобильных устройств
  • 🔒 Некоторые методы (например, ЭтоГоловнойУзелРИБ()) могут быть недоступны

Для ускорения работы кэшируйте часто используемые UID в ХранилищеНастроек.

Как массово получить ссылки по списку UID?

Для массовой обработки используйте пакетные запросы:

Функция ПолучитьСсылкиПоСпискуUID(СписокUID, ТипОбъекта)

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

Запрос.Текст =

"ВЫБРАТЬ

| Объект.УникальныйИдентификатор КАК UID,

| Объект.Ссылка КАК Ссылка

|ИЗ

| &ТипОбъекта КАК Объект

|ГДЕ

| Объект.УникальныйИдентификатор В(&СписокUID)";

Запрос.УстановитьПараметр("ТипОбъекта", ТипОбъекта);

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

Результат = Запрос.Выполнить();

Возврат Результат.Выгрузить();

КонецФункции

Этот метод в 10-50 раз быстрее, чем перебор UID в цикле с отдельными запросами.