Как получить строку из ссылки в 1С 8.3

· 9 мин

Содержание

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

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

Что хранит ссылка и какие строки из неё получают

Ссылка (СправочникСсылка.Номенклатура, ДокументСсылка.РеализацияТоваровУслуг и подобные) — это не сам объект, а указатель на запись в таблице базы. Внутри ссылки лежит пара: тип объекта и его уникальный идентификатор (GUID). Наименование, реквизиты, движения подтягиваются из базы только когда вы к ним обращаетесь.

Поэтому «строка из ссылки» — понятие неоднозначное. Одна и та же ссылка превращается в несколько разных строк:

  • 📝 Представление — читаемый текст для человека: наименование элемента справочника, номер и дата документа.
  • 🔑 GUID — 36-символьный идентификатор вида 550e8400-e29b-41d4-a716-446655440000.
  • 🔁 XML-строка — технический формат для сериализации и обмена.
  • 🔗 Навигационная ссылка — адрес e1cib/data/…, открывающий объект в 1С.

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

Сравнение способов — чтобы сразу выбрать нужный:

ФункцияЧто вернётКогда применятьОбратимо
Строка(Ссылка)Наименование / представлениеПоказать человекуНет
Строка(Ссылка.УникальныйИдентификатор())GUID (36 символов)Логи, внешние системыДа, ПолучитьСсылку()
XMLСтрока(Ссылка)Строку идентификатораОбмен между базами 1СДа, 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. Используйте ПолучитьНавигационнуюСсылку() — платформа соберёт корректно.

Проверка перед хранением ссылки как строки
Выполнено: 0 / 5

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

Чем отличается `Строка()` от `XMLСтрока()` для ссылки?
Строка() даёт наименование или представление для человека и обратно не преобразуется. XMLСтрока() возвращает технический идентификатор, по которому ссылку можно восстановить функцией XMLЗначение() с указанием типа.
Почему GUID из 1С не совпадает с тем, что лежит в SQL-таблице?
В базе идентификатор хранится в бинарном поле с переставленными половинами по 8 байт. Метод УникальныйИдентификатор() отдаёт его в «правильном» порядке. При сравнении строки из 1С и значения из SQL нужно учитывать эту перестановку.
Можно ли из наименования получить ссылку обратно?
Напрямую нет — представление необратимо, а наименования не уникальны. Найти объект по наименованию можно только запросом или методом НайтиПоНаименованию(), и то он вернёт лишь первое совпадение.
Что вернёт `Строка()` для пустой или удалённой ссылки?
Для пустой ссылки — пустую строку. Для ссылки на удалённый (несуществующий) объект — служебный текст вида Объект не найден с идентификатором. Поэтому результат Строка() нельзя считать гарантированным наименованием.
Как из GUID-строки получить ссылку, если тип объекта известен?
Создайте Новый УникальныйИдентификатор(ГУИДСтрокой) и передайте в ПолучитьСсылку() нужного менеджера, например Справочники.Номенклатура.ПолучитьСсылку(Идентификатор).