Разработка и Конфигурация · 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С:Предприятие
- 2Нажмите кнопку «Ещё» в командной панели формы
- 3Выберите команду «Получить ссылку»
- 4Скопируйте строку из появившегося окна
- 5Проверьте: вставьте ссылку через Shift+F11 и убедитесь, что открывается нужный объект
Типичные ошибки при работе со ссылками
Первая распространённая ошибка — сравнение ссылок через строковое представление. Строковое представление ссылки зависит от контекста и не предназначено для сравнения; сравнивать нужно сами значения ссылок оператором равенства или методом Сравнить(). Для сравнения по GUID используют УникальныйИдентификатор() обеих ссылок.
Вторая ошибка — обращение к реквизитам ссылки в цикле. Конструкция вида Ссылка.Наименование внутри цикла вызывает обращение к базе на каждой итерации. Правильное решение — один запрос, выбирающий все нужные поля сразу.
Третья группа ошибок связана с пустыми и битыми ссылками. Перед использованием найденной ссылки всегда проверяйте Пустая(), а при получении ссылки по GUID извне — существование объекта запросом. Игнорирование этих проверок приводит к исключениям «Объект не найден» в продуктиве и к мусорным значениям в реквизитах.
Проверка результата и контрольные точки
После получения ссылки убедитесь, что она корректна, прежде чем передавать её дальше по коду или записывать в реквизиты. Минимальный набор проверок: ссылка не пустая, тип ссылки соответствует ожидаемому (функция ТипЗнч() и сравнение с Тип("СправочникСсылка.Номенклатура")), объект существует в базе.
Как проверить результат
Метод Пустая() возвращает Ложь
Пустая() = Истина — поиск ничего не нашёл
Запрос по ссылке возвращает строку
Запрос пуст — ссылка битая, объект отсутствует
ТипЗнч() соответствует ожидаемому типу ссылки
Получен GUID или строка вместо ссылки — нужна конвертация через ПолучитьСсылку()
Для отладки удобно выводить ссылку и её GUID через Сообщить() или смотреть в табло переменных конфигуратора. В окне «Выражение» достаточно ввести имя переменной — платформа покажет тип значения и представление ссылки.
В интеграциях передавайте наружу GUID, а не навигационную ссылку: GUID не зависит от конкретной базы и клиента, а навигационная ссылка привязана к текущей информационной базе и бесполезна для внешней системы.
Частые вопросы
Чем ссылка отличается от объекта в 1С?
Ссылка — это только идентификатор, указывающий на запись в базе. Объект (например, СправочникОбъект) — это полная копия данных в памяти, которую можно изменять и записывать. Объект получают из ссылки методом ПолучитьОбъект(), а ссылку из объекта — через свойство Ссылка.
Как узнать GUID элемента справочника без программирования?
Штатного пользовательского инструмента для просмотра GUID нет. Обычно используют внешнюю обработку, показывающую уникальный идентификатор выбранной ссылки, либо смотрят навигационную ссылку — GUID можно извлечь из неё программно. Пользователю проще передать разработчику навигационную ссылку, чем искать GUID самостоятельно.
Что такое «битая ссылка» и как её найти?
Это ссылка, указывающая на объект, которого нет в базе (удалён физически или никогда не существовал). В формах она отображается как «Объект не найден». Найти такие значения в реквизитах можно запросом с соединением к таблице объекта: записи, для которых соединение не дало результата, и содержат битые ссылки.
Можно ли получить ссылку на удалённый объект?
Если объект помечен на удаление, ссылка остаётся рабочей — объект физически в базе есть. После выполнения «Удаление помеченных объектов» запись исчезает, и все ссылки на неё становятся битыми. Восстановить ссылку можно только зная GUID: методом ПолучитьСсылку(Идентификатор) создают ссылку и записывают по ней новый объект.
Как передать ссылку между двумя базами 1С?
Через GUID: в исходной базе получают УникальныйИдентификатор() ссылки, передают строку, а в приёмнике вызывают ПолучитьСсылку() у менеджера соответствующего типа. Это работает, только если обмен настроен так, что GUID объектов совпадают в обеих базах — например, при типовой синхронизации данных.
Почему НайтиПоНаименованию не находит элемент, который точно есть?
Чаще всего причина в нестрогом совпадении: метод по умолчанию ищет точное соответствие, а в наименовании могут быть лишние пробелы или другой регистр. Проверьте параметр «ТочноеСоответствие» и попробуйте поиск через запрос с условием ПОДОБНО. Также убедитесь, что ищете в нужном справочнике и элемент не помечен на удаление.
Что важно запомнить
Ссылку получают поиском (НайтиПоКоду, запрос), из объекта через свойство Ссылка или по GUID методом ПолучитьСсылку(). Всегда проверяйте ссылку на пустоту и существование объекта, а для интеграций передавайте GUID, а не навигационную ссылку.