Как получить строку из ссылки в 1С 8.3
Содержание
Строку из ссылки в 1С получают четырьмя разными функциями, и каждая даёт свой результат. Строка(Ссылка) вернёт наименование или представление объекта для человека. Строка(Ссылка.УникальныйИдентификатор()) — GUID для хранения и поиска. XMLСтрока(Ссылка) — строку для обмена между базами. ПолучитьНавигационнуюСсылку(Ссылка) — адрес, по которому объект открывается прямо в 1С.
Выбор зависит от задачи: показать пользователю, записать в лог, передать во внешнюю систему или сделать кликабельную ссылку. Ниже — что именно возвращает каждый способ, как из полученной строки вернуться обратно к ссылке и где чаще всего ошибаются.
Что хранит ссылка и какие строки из неё получают
Ссылка (СправочникСсылка.Номенклатура, ДокументСсылка.РеализацияТоваровУслуг и подобные) — это не сам объект, а указатель на запись в таблице базы. Внутри ссылки лежит пара: тип объекта и его уникальный идентификатор (GUID). Наименование, реквизиты, движения подтягиваются из базы только когда вы к ним обращаетесь.
Поэтому «строка из ссылки» — понятие неоднозначное. Одна и та же ссылка превращается в несколько разных строк:
- 📝 Представление — читаемый текст для человека: наименование элемента справочника, номер и дата документа.
- 🔑 GUID — 36-символьный идентификатор вида
550e8400-e29b-41d4-a716-446655440000. - 🔁 XML-строка — технический формат для сериализации и обмена.
- 🔗 Навигационная ссылка — адрес
e1cib/data/…, открывающий объект в 1С.
Реквизит может хранить ссылки не одного, а нескольких типов — это составной тип (например, «ссылка на контрагента или на физлицо»). При преобразовании в строку тип теряется: Строка() и GUID сами по себе не говорят, откуда ссылка. Поэтому для хранения и обмена тип объекта записывают рядом со строкой — к этому мы вернёмся ниже.
Сравнение способов — чтобы сразу выбрать нужный:
| Функция | Что вернёт | Когда применять | Обратимо |
|---|---|---|---|
Строка(Ссылка) | Наименование / представление | Показать человеку | Нет |
Строка(Ссылка.УникальныйИдентификатор()) | GUID (36 символов) | Логи, внешние системы | Да, ПолучитьСсылку() |
XMLСтрока(Ссылка) | Строку идентификатора | Обмен между базами 1С | Да, XMLЗначение() |
ПолучитьНавигационнуюСсылку(Ссылка) | e1cib/data/… | Кликабельная ссылка | Да, в интерфейсе |
Строка(Ссылка). Вернёт наименование справочника или представление документа.Строка(Ссылка.УникальныйИдентификатор()) — GUID. По нему объект восстанавливается методом ПолучитьСсылку().XMLСтрока(Ссылка) вместе с типом объекта. Обратно — через XMLЗначение().ПолучитьНавигационнуюСсылку(Ссылка) — строка вида e1cib/data/….Строка() — текстовое представление объекта
Самый частый случай: вывести ссылку в сообщение, подставить в макет печатной формы или в тему письма. Для этого достаточно обернуть ссылку в функцию Строка().
Сообщить(Строка(Номенклатура)); // "Клавиатура Logitech K120"
Сообщить(Строка(Контрагент)); // "ООО Ромашка"
Сообщить(Строка(ДокументПоступления)); // "Поступление товаров 0000-000123 от 05.03.2025"
Для справочника Строка() возвращает основное представление — обычно наименование. Для документа — представление вида «Вид документа номер от даты». Что именно войдёт в представление, настраивается в конфигураторе свойством объекта Представление и модулем менеджера.
Для подстановки в строку вместе с другим текстом удобнее СтрШаблон:
СтрШаблон("Отгружено по документу %1", Документ) — здесь неявно вызывается то же представление, явный Строка() не нужен.
Важная деталь: Строка() обращается к базе за наименованием. В цикле по тысячам ссылок это тысячи запросов. Если нужно только представление без прочих реквизитов, в запросе есть удобный способ — поле Представление(Ссылка), которое платформа вычисляет пакетно.
GUID объекта: метод УникальныйИдентификатор()
Когда ссылку нужно сохранить и потом найти тот же объект — наименование не годится — оно меняется, повторяется, не уникально. Для этого берут GUID.
У любой ссылки есть метод УникальныйИдентификатор(). Он возвращает значение типа УникальныйИдентификатор. Чтобы получить именно строку, оберните результат в Строка():
Идентификатор = Номенклатура.УникальныйИдентификатор();
ГУИДСтрокой = Строка(Идентификатор);
// "f8a1b2c3-1234-5678-9abc-def012345678"
GUID — это 32 шестнадцатеричные цифры, сгруппированные через дефисы по схеме 8-4-4-4-12, итого 36 символов. Он не меняется весь срок жизни объекта, уникален в пределах базы (а практически и глобально) и идеально подходит для логов, внешних ключей и интеграций.
У пустой ссылки идентификатор тоже есть — он состоит из нулей:
ГУИД = Строка(Справочники.Номенклатура.ПустаяСсылка().УникальныйИдентификатор());
// "00000000-0000-0000-0000-000000000000"
Это удобный признак: если в выгрузке пришёл «нулевой» GUID, значит ссылка была пустой, а не потерялась при передаче.
Сравнивать два объекта на равенство лучше по ссылке целиком — Ссылка1 = Ссылка2, — а не по строкам GUID. Ссылка несёт и тип, и идентификатор, поэтому сравнение по ней не перепутает объекты разных справочников с совпавшим идентификатором.
GUID из метода УникальныйИдентификатор() и GUID в SQL-таблице базы — это не одна и та же строка. В бинарном поле _IDRRef платформа хранит идентификатор с переставленными половинами (первые и вторые 8 байт меняются местами). Если вы читаете базу напрямую через SQL, сравнивать строки «в лоб» нельзя — сначала приведите порядок байтов к виду, который отдаёт 1С.
XML-строка и внутреннее представление
Для переноса ссылки между базами 1С или выгрузки в файл подходит XML-сериализация. Функция XMLСтрока() превращает ссылку в строку идентификатора, а обратная XMLЗначение() восстанавливает ссылку по типу и строке:
Строка1 = XMLСтрока(Номенклатура);
// обратно:
Ссылка = XMLЗначение(Тип("СправочникСсылка.Номенклатура"), Строка1);
Главное отличие от Строка(): XML-формат обратим. Вы гарантированно получите тот же тип ссылки, если знаете имя объекта метаданных.
Есть ещё старая пара глобальных функций — ЗначениеВСтрокуВнутр() и ЗначениеИзСтрокиВнутр(). Они сворачивают любое значение, включая ссылку, во внутренний строковый формат платформы:
Текст = ЗначениеВСтрокуВнутр(Номенклатура);
Ссылка = ЗначениеИзСтрокиВнутр(Текст);
Внутренний формат работает, но 1С не рекомендует хранить его долго: при переходе на новый релиз платформы структура строки может измениться, и старые значения перестанут читаться. Для длительного хранения выбирайте GUID или XML.
Навигационная ссылка на объект
Если нужна строка, по которой пользователь одним кликом откроет объект в 1С, — это навигационная ссылка. Её собирает глобальная функция ПолучитьНавигационнуюСсылку() (англоязычный синоним — GetURL):
Адрес = ПолучитьНавигационнуюСсылку(Контрагент);
// "e1cib/data/Справочник.Контрагенты?ref=801b0000..."
Результат — строка с префиксом e1cib/data/, именем объекта метаданных и параметром ref. Такую строку можно:
- 📧 вставить в письмо — получатель с доступом к базе откроет карточку;
- 📌 положить в поле формы как гиперссылку;
- 🗂 сохранить в заметку или задачу, чтобы вернуться к объекту.
Внутри параметра ref лежит тот же идентификатор объекта, но в шестнадцатеричном виде без дефисов, а перед ним — имя объекта метаданных. Разбирать строку вручную не нужно и не стоит: формат служебный и может измениться. Для хранения берите чистый GUID из УникальныйИдентификатор(), а навигационную ссылку используйте целиком — как «кликабельный адрес для человека».
Для обратного перехода платформа сама разбирает навигационную ссылку в интерфейсе — пользователю достаточно по ней кликнуть.
Обратное преобразование: из строки в ссылку
Восстановить ссылку можно из GUID или из XML-строки. Из наименования (Строка(Ссылка)) вернуться к ссылке напрямую нельзя — представление необратимо, одинаковых наименований бывает несколько.
Из строки-GUID. У каждого менеджера объекта есть метод ПолучитьСсылку(), который принимает УникальныйИдентификатор:
Идентификатор = Новый УникальныйИдентификатор("f8a1b2c3-1234-5678-9abc-def012345678");
Ссылка = Справочники.Номенклатура.ПолучитьСсылку(Идентификатор);
Конструктор Новый УникальныйИдентификатор(Строка) принимает GUID в стандартном 36-символьном виде с дефисами.
ПолучитьСсылку() не проверяет, существует ли объект. Метод всегда вернёт ссылку указанного типа с этим GUID, даже если такой записи в базе нет. Проверяйте результат: Ссылка.Пустая() или чтение реквизита.
Из XML-строки — через XMLЗначение() с указанием типа (пример выше).
Когда тип заранее неизвестен. Если в строке хранится только GUID, а тип объекта не записан, восстановить ссылку нельзя — один и тот же GUID может принадлежать разным объектам. Поэтому для интеграций храните пару «тип + идентификатор», а не один GUID.
Если во внешней строке не GUID, а код или артикул. Тогда это не преобразование, а поиск: объект ищут запросом по реквизиту или методом НайтиПоКоду() для справочника. Учтите два ограничения — код можно изменить, и он не всегда уникален, так что метод вернёт лишь первое совпадение. Для надёжной связи с внешней системой всё равно лучше хранить GUID.
Примеры под реальные задачи и работу в формах
Разберём сценарии, которые встречаются в разработке чаще всего, — с готовым кодом.
Запись ссылки в журнал регистрации или текстовый лог. В лог кладут GUID и тип — по ним потом находят объект, даже если его переименовали или пометили на удаление:
ТекстЛога = СтрШаблон("Обработан %1, id=%2",
Ссылка.Метаданные().ПолноеИмя(),
Ссылка.УникальныйИдентификатор());
ЗаписьЖурналаРегистрации("МойМодуль.Обработка",
УровеньЖурналаРегистрации.Информация, , Ссылка, ТекстЛога);
У самого метода ЗаписьЖурналаРегистрации() есть параметр для ссылки на данные — журнал сам сохранит переход к объекту. Отдельная строка в тексте нужна, когда лог читают вне 1С.
Передача ссылки во внешнюю систему по HTTP. Во внешний сервис уходит строка-GUID с указанием типа объекта. На приём объект собирается обратно:
// отправка
Тело = Новый Структура;
Тело.Вставить("тип", Ссылка.Метаданные().ПолноеИмя());
Тело.Вставить("id", Строка(Ссылка.УникальныйИдентификатор()));
// приём и восстановление
Идентификатор = Новый УникальныйИдентификатор(Тело.id);
Ссылка = Справочники.Номенклатура.ПолучитьСсылку(Идентификатор);
Письмо со ссылкой на объект. В тело письма вставляют навигационную ссылку — получатель с доступом к базе откроет карточку одним кликом:
Адрес = ПолучитьНавигационнуюСсылку(Заказ);
Текст = СтрШаблон("Проверьте заказ: %1", Адрес);
Гиперссылка в управляемой форме. Чтобы в форме появился кликабельный текст, поле делают с видом «Поле надписи» и свойством гиперссылки, а в обработчике нажатия открывают объект. Строить строку e1cib/… руками для этого не нужно.
Теперь про клиент и сервер. Строка(), XMLСтрока() и метод УникальныйИдентификатор() одинаково доступны и на клиенте, и на сервере. С навигационными ссылками тоньше: ПолучитьНавигационнуюСсылку() рассчитана на сервер и толстый клиент, а в тонком и веб-клиенте надёжнее открывать объект стандартными средствами, а не собирать адрес вручную.
Чтобы показать объект пользователю из клиентского кода, строка вообще не нужна — есть процедура ПоказатьЗначение():
&НаКлиенте
Процедура ОткрытьКарточку()
ПоказатьЗначение(, Контрагент);
КонецПроцедуры
Она откроет форму объекта независимо от типа клиента.
В веб-клиенте помните про разницу контекстов: реквизиты объекта читаются на сервере. Если собираете строку из нескольких полей ссылки, выносите сборку в серверную процедуру, а на клиент передавайте готовую строку.
Типичные ошибки при работе со строкой ссылки
🔸 Хранят наименование вместо GUID. Сохранили Строка(Контрагент) во внешнюю систему, контрагента переименовали — связь потеряна. Для хранения всегда берите GUID.
🔸 Путают УникальныйИдентификатор() и GUID из SQL. Сравнивают строку из 1С с идентификатором из бинарного поля базы и получают «не найдено». Причина — переставленные половины байт (см. раздел про GUID).
🔸 Не проверяют результат ПолучитьСсылку(). Метод вернёт ссылку на несуществующий объект без ошибки. Обращение к реквизиту такой «битой» ссылки даст пустое значение, а Строка() по ней вернёт текст вида Объект не найден.
🔸 Ждут обратного преобразования от Строка(). Представление необратимо. Если нужна возможность восстановить ссылку — сразу храните GUID или XML-строку.
🔸 Собирают навигационную ссылку руками. Склеивают e1cib/data/ с именем и GUID самостоятельно и путаются в формате ref. Используйте ПолучитьНавигационнуюСсылку() — платформа соберёт корректно.
Частые вопросы
Чем отличается `Строка()` от `XMLСтрока()` для ссылки?
Строка() даёт наименование или представление для человека и обратно не преобразуется. XMLСтрока() возвращает технический идентификатор, по которому ссылку можно восстановить функцией XMLЗначение() с указанием типа.Почему GUID из 1С не совпадает с тем, что лежит в SQL-таблице?
УникальныйИдентификатор() отдаёт его в «правильном» порядке. При сравнении строки из 1С и значения из SQL нужно учитывать эту перестановку.Можно ли из наименования получить ссылку обратно?
НайтиПоНаименованию(), и то он вернёт лишь первое совпадение.Что вернёт `Строка()` для пустой или удалённой ссылки?
Объект не найден с идентификатором. Поэтому результат Строка() нельзя считать гарантированным наименованием.Как из GUID-строки получить ссылку, если тип объекта известен?
Новый УникальныйИдентификатор(ГУИДСтрокой) и передайте в ПолучитьСсылку() нужного менеджера, например Справочники.Номенклатура.ПолучитьСсылку(Идентификатор).