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

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

Как узнать ссылку на объект в 1С

Как узнать ссылку на объект в 1С: через запрос, метод ПолучитьСсылку, УникальныйИдентификатор и навигационную ссылку. Примеры кода и типичные ошибки.

Ссылка на объект — один из базовых механизмов платформы 1С:Предприятие. Через ссылку система однозначно идентифицирует элемент справочника, документ, план счетов и другие объекты ссылочного типа, хранящиеся в базе данных. Задача «узнать ссылку» возникает при написании запросов, обменах данными, отладке и при разработке интеграций, где нужно передать идентификатор конкретного объекта.

Важно сразу различать три разных понятия, которые часто путают: ссылка как значение встроенного языка (тип «СправочникСсылка», «ДокументСсылка» и т.д.), уникальный идентификатор ссылки (GUID) и навигационная ссылка — строка вида e1cib/data/Справочник.Номенклатура?ref=..., которая открывает форму объекта. Каждое из этих представлений получается своим способом и используется в своих сценариях.

Ниже разобраны основные способы получения ссылки: через методы менеджера объекта, через запрос, через GUID и через пользовательский интерфейс. Также описаны обратные операции — получение объекта по ссылке и проверка существования ссылки в базе.

Что такое ссылка на объект и чем она отличается от GUID

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

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

Навигационная ссылка — третий вид представления. Это текстовая строка, которую можно вставить в браузер или передать коллеге: при переходе по ней в тонком или веб-клиенте откроется форма соответствующего объекта. Навигационная ссылка включает тип объекта и закодированное представление ссылки.

Получение ссылки из существующего объекта

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

ОбъектТовара = Справочники.Номенклатура.НайтиПоКоду("000000123").ПолучитьОбъект();

СсылкаНаТовар = ОбъектТовара.Ссылка;

Если объект ещё не записан в базу (новый, созданный через СоздатьЭлемент() или СоздатьДокумент()), его свойство Ссылка содержит пустую ссылку. В этом случае, если ссылка нужна до записи — например, чтобы заранее заполнить реквизит в другом объекте — используют метод ПолучитьСсылкуНового():

НовыйТовар = Справочники.Номенклатура.СоздатьЭлемент();

СсылкаНового = НовыйТовар.ПолучитьСсылкуНового();

// теперь СсылкаНового можно использовать, а сам объект записать позже

Как получить ссылку поиском: по коду, наименованию и через запрос

Поиск методами НайтиПоКоду и НайтиПоНаименованию

Для справочников, планов счетов и планов видов характеристик доступны методы поиска, которые сразу возвращают ссылку:

Ссылка = Справочники.Контрагенты.НайтиПоНаименованию("ООО Ромашка");

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

// объект не найден

КонецЕсли;

Для документов аналогичный метод — НайтиПоНомеру(Номер, Дата), где вторым параметром обязательно передаётся дата, ограничивающая интервал поиска. Если метод ничего не нашёл, он возвращает пустую ссылку соответствующего типа — это нужно проверять методом Пустая() перед дальнейшей работой.

Получение ссылки через запрос

Когда поиск идёт по произвольным реквизитам или нужно выбрать ссылки сразу многих объектов, используется запрос. Поле Ссылка доступно в любой таблице ссылочного типа:

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

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

"ВЫБРАТЬ

| Номенклатура.Ссылка КАК Ссылка

|ИЗ

| Справочник.Номенклатура КАК Номенклатура

|ГДЕ

| Номенклатура.Артикул = &Артикул";

Запрос.УстановитьПараметр("Артикул", "Т-100");

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

Пока Выборка.Следующий() Цикл

СсылкаНаТовар = Выборка.Ссылка;

КонецЦикла;

Запрос — предпочтительный способ при массовой обработке: он выполняется на сервере СУБД и не тащит в память лишние данные. Методы НайтиПоКоду и НайтиПоНаименованию удобны для одиночного поиска по индексированным полям.

Сравнение способов поиска ссылки

НайтиПоКоду / НайтиПоНаименованию

Быстро для одиночного поиска по ключевым полям, но не подходит для документов по произвольным реквизитам.

Запрос

Гибкий поиск по любым реквизитам и массовая выборка; требует написания текста запроса и работы с параметрами.

НайтиПоРеквизиту

Компромисс для справочников: поиск по любому реквизиту без запроса, но по неиндексированным полям работает медленнее.

Ссылка по уникальному идентификатору (GUID)

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

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

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

Обратная операция — узнать GUID существующей ссылки — выполняется методом УникальныйИдентификатор():

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

СтрокаГУИД = Строка(ГУИД); // для передачи во внешнюю систему

Как проверить, что ссылка существует в базе

Надёжный способ — выполнить запрос по этой ссылке и убедиться, что выборка не пуста:

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

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

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

Существует = Не Запрос.Выполнить().Пустой();

Часто встречающийся приём — попытка прочитать какой-либо реквизит через точку: если объекта нет, платформа выбрасывает исключение «Объект не найден». Такой подход в продуктивном коде лучше оборачивать в Попытка...Исключение, но для диагностики он вполне пригоден.

Как узнать ссылку в пользовательском режиме без программирования

Если вы не разработчик, а пользователь, и нужно просто получить ссылку на конкретный элемент, есть несколько штатных возможностей интерфейса «Такси»:

  • Откройте объект и выполните команду «Ещё → Получить ссылку» (в ряде конфигураций — «Вывести ссылку»). Платформа покажет навигационную ссылку, которую можно скопировать и отправить коллеге.
  • В форме списка нажмите «Ещё → Вывести список» — в табличный документ можно вывести внутренние поля, включая ссылку.
  • Комбинация Shift+F11 (команда «Перейти по ссылке») позволяет вставить навигационную ссылку и открыть объект — удобно для обратной проверки.

Внешний вид навигационной ссылки: e1cib/data/Справочник.Номенклатура?ref=9f1d0050568f35cc11ec.... Часть после ref= — это закодированное внутреннее представление ссылки, привязанное к конкретной информационной базе. При переносе данных в другую базу эта строка работать не будет — там у объекта будет другой идентификатор, если обмен не сохранял GUID.

Порядок действий для получения навигационной ссылки
  1. 1
    Откройте нужный объект в режиме 1С:Предприятие
  2. 2
    Нажмите кнопку «Ещё» в командной панели формы
  3. 3
    Выберите команду «Получить ссылку»
  4. 4
    Скопируйте строку из появившегося окна
  5. 5
    Проверьте: вставьте ссылку через Shift+F11 и убедитесь, что открывается нужный объект

Типичные ошибки при работе со ссылками

Первая распространённая ошибка — сравнение ссылок через строковое представление. Строковое представление ссылки зависит от контекста и не предназначено для сравнения; сравнивать нужно сами значения ссылок оператором равенства или методом Сравнить(). Для сравнения по GUID используют УникальныйИдентификатор() обеих ссылок.

Вторая ошибка — обращение к реквизитам ссылки в цикле. Конструкция вида Ссылка.Наименование внутри цикла вызывает обращение к базе на каждой итерации. Правильное решение — один запрос, выбирающий все нужные поля сразу.

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

Типичные ошибки
01
Сравнение ссылок как строк — результат непредсказуем; сравнивайте значения ссылок напрямую
02
Чтение реквизитов ссылки в цикле — лишние обращения к базе и падение производительности
03
Отсутствие проверки Пустая() после НайтиПоКоду — исключение при обращении к несуществующему объекту
04
Запись ссылки, полученной по внешнему GUID, без проверки существования — появление битых ссылок в базе

Проверка результата и контрольные точки

После получения ссылки убедитесь, что она корректна, прежде чем передавать её дальше по коду или записывать в реквизиты. Минимальный набор проверок: ссылка не пустая, тип ссылки соответствует ожидаемому (функция ТипЗнч() и сравнение с Тип("СправочникСсылка.Номенклатура")), объект существует в базе.

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

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

Значение ссылки
Норма

Метод Пустая() возвращает Ложь

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

Пустая() = Истина — поиск ничего не нашёл

Существование объекта
Норма

Запрос по ссылке возвращает строку

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

Запрос пуст — ссылка битая, объект отсутствует

Тип значения
Норма

ТипЗнч() соответствует ожидаемому типу ссылки

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

Получен GUID или строка вместо ссылки — нужна конвертация через ПолучитьСсылку()

Для отладки удобно выводить ссылку и её GUID через Сообщить() или смотреть в табло переменных конфигуратора. В окне «Выражение» достаточно ввести имя переменной — платформа покажет тип значения и представление ссылки.

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

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

Чем ссылка отличается от объекта в 1С?

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

Как узнать GUID элемента справочника без программирования?

Штатного пользовательского инструмента для просмотра GUID нет. Обычно используют внешнюю обработку, показывающую уникальный идентификатор выбранной ссылки, либо смотрят навигационную ссылку — GUID можно извлечь из неё программно. Пользователю проще передать разработчику навигационную ссылку, чем искать GUID самостоятельно.

Что такое «битая ссылка» и как её найти?

Это ссылка, указывающая на объект, которого нет в базе (удалён физически или никогда не существовал). В формах она отображается как «Объект не найден». Найти такие значения в реквизитах можно запросом с соединением к таблице объекта: записи, для которых соединение не дало результата, и содержат битые ссылки.

Можно ли получить ссылку на удалённый объект?

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

Как передать ссылку между двумя базами 1С?

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

Почему НайтиПоНаименованию не находит элемент, который точно есть?

Чаще всего причина в нестрогом совпадении: метод по умолчанию ищет точное соответствие, а в наименовании могут быть лишние пробелы или другой регистр. Проверьте параметр «ТочноеСоответствие» и попробуйте поиск через запрос с условием ПОДОБНО. Также убедитесь, что ищете в нужном справочнике и элемент не помечен на удаление.

Итог

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

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