Ссылки в 1С: от ссылочного типа до гиперссылок в отчётах

· 9 мин

Содержание

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

Ниже разобраны все способы делать ссылки в платформе 1С:Предприятие 8.3: как получить ссылку на документ или элемент справочника, как сформировать URL программно, как сделать кликабельную гиперссылку в табличном документе и в отчёте на СКД, как сослаться на файл. Код приведён на встроенном языке, пути — для интерфейса «Такси».

Чем отличаются ссылки в платформе 1С

Прежде чем писать код, определитесь, какая именно ссылка нужна. Их четыре типа, и у каждого своя область применения:

  • 🔹 Ссылочный тип (СправочникСсылка, ДокументСсылка, ПеречислениеСсылка) — значение, которое указывает на конкретный объект базы. Хранится в реквизитах, используется в запросах.
  • 🔹 Навигационная ссылка — строка вида e1cib/data/.... По ней платформа открывает форму объекта, список или раздел. Работает внутри сеанса 1С.
  • 🔹 Гиперссылка в интерфейсе — кликабельный текст в форме, в табличном или печатном документе. Внешне подчёркнутый синий текст, по клику выполняет переход или обработчик.
  • 🔹 Адрес во временном хранилище — технический URL картинки или файла (e1cib/tempstorage/...), который живёт в пределах сеанса и нужен для показа и передачи файлов.

Ссылочный тип — это данные. Навигационная ссылка и гиперссылка — это интерфейс. Адрес временного хранилища — это транспорт для файлов. Смешивать их нельзя.

Дальше — каждый тип по отдельности, с рабочими приёмами.

Ссылочный тип: как указать на объект базы

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

Получить ссылку из объекта:

// из объекта
Ссылка = ОбъектКонтрагента.Ссылка;

// из выборки запроса
Ссылка = ВыборкаДокументов.Ссылка;

Обратный переход — от ссылки к объекту с реквизитами и табличными частями:

Объект = Ссылка.ПолучитьОбъект();

Вызов ПолучитьОбъект() в цикле по тысячам ссылок — тяжёлая операция: каждый вызов читает объект целиком с сервера. Если нужны одно-два поля, берите их прямо через точку от ссылки (Ссылка.Наименование) или одним запросом, а не через ПолучитьОбъект().

Проверить, что ссылка указывает на существующий объект:

Если Ссылка.Пустая() Тогда
    // реквизит не заполнен
КонецЕсли;

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

Определить, на какой объект указывает ссылка, если тип заранее неизвестен, помогает ТипЗнч() и обращение к метаданным:

Если ТипЗнч(Значение) = Тип("ДокументСсылка.РеализацияТоваровУслуг") Тогда
    // это реализация
КонецЕсли;

ИмяТаблицы = Значение.Метаданные().ПолноеИмя(); // "Документ.РеализацияТоваровУслуг"

Ссылки одного типа сравнивают обычным =. Две ссылки равны, только если указывают на один и тот же объект базы — наименования и прочие реквизиты в сравнении не участвуют. Это и делает ссылочный тип надёжным: переименовали контрагента — все ссылки на него остались прежними.

Навигационные ссылки e1cib и переход по ним

Навигационная ссылка — это адрес внутри приложения. По ней открывается форма объекта, список или раздел. Общий вид — e1cib/data/Справочник.Номенклатура?ref=....

Получить навигационную ссылку на объект программно:

Нс = ПолучитьНавигационнуюСсылку(ДокументСсылка);

Перейти по ней (клиентский код):

&НаКлиенте
Процедура ОткрытьДокумент()
    ПерейтиПоНавигационнойСсылке(АдресСсылки);
КонецПроцедуры

Формат e1cib/... различается по назначению ссылки:

ПрефиксЧто открываетПример
e1cib/data/форму конкретного объектаe1cib/data/Справочник.Контрагенты?ref=…
e1cib/list/списокe1cib/list/Справочник.Контрагенты
e1cib/command/выполняет командуe1cib/command/Обработка.ЗакрытиеМесяца.Форма
e1cib/app/раздел (подсистему)e1cib/app/Подсистема.Продажи

Параметр ref= в ссылке на объект — это строковое представление GUID. Руками собирать такую строку не нужно: ПолучитьНавигационнуюСсылку() формирует её сам.

ПерейтиПоНавигационнойСсылке — клиентская процедура. Из серверного модуля её не вызвать. Если ссылку готовите на сервере, передайте строку на клиент и переход делайте уже там.

Чтобы собрать ссылку, которую можно отправить коллеге письмом и открыть снаружи, одной навигационной строки мало — нужен адрес базы. Его отдаёт ПолучитьURLИнформационнойБазы(). Полную внешнюю ссылку платформа формирует функцией получения навигационной ссылки информационной базы; её результат работает при запуске через 1cestart или веб-клиент.

Гиперссылки в управляемой форме

Кликабельный текст в форме делают двумя способами — через декорацию-надпись или через поле.

Надпись-гиперссылка. Добавьте на форму декорацию типа «Надпись», в её свойствах включите флажок Гиперссылка. Текст станет подчёркнутым. Реакцию на клик пишут в событии Нажатие:

&НаКлиенте
Процедура НадписьСсылкаНажатие(Элемент)
    ПерейтиПоНавигационнойСсылке("e1cib/list/Справочник.Контрагенты");
КонецПроцедуры

Поле-гиперссылка. У поля формы, связанного с реквизитом, в свойстве Вид выбирается Поле надписи, и также включается Гиперссылка. Удобно, когда текст ссылки берётся из данных.

Что можно делать по клику:

  1. Открыть форму другого объекта — ПерейтиПоНавигационнойСсылке с заранее полученной ссылкой.
  2. Открыть внешний сайт — ПерейтиПоНавигационнойСсылке("https://...") или ЗапуститьПриложение("https://...").
  3. Выполнить произвольный код — отчёт, расчёт, заполнение.

Для адреса электронной почты и телефона подойдут схемы mailto: и tel: в той же процедуре перехода.

Гиперссылки и расшифровка в табличном документе

В печатных формах и отчётах, выводимых в табличный документ, за «ссылочность» ячейки отвечают два свойства области: Гиперссылка и Расшифровка.

  • Гиперссылка = Истина — делает текст ячейки похожим на ссылку (подчёркнутый, кликабельный).
  • Расшифровка — хранит значение, которое платформа передаст в обработчик при клике. Это может быть ссылка на объект, строка-навигация или любое значение.

Пример: при заполнении макета кладём в ячейку ссылку на документ:

Область = Макет.ПолучитьОбласть("Строка");
Область.Параметры.Номер = Выборка.Номер;
ОбластьЯчейки = Область.Области("Номер");
ОбластьЯчейки.Расшифровка = Выборка.Ссылка;
ОбластьЯчейки.Гиперссылка = Истина;

Обработку клика пишут в событии ОбработкаРасшифровки того элемента формы, где выводится табличный документ:

&НаКлиенте
Процедура ТабличныйДокументОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)
    Если ТипЗнч(Расшифровка) = Тип("ДокументСсылка.РеализацияТоваровУслуг") Тогда
        СтандартнаяОбработка = Ложь;
        ПоказатьЗначение(, Расшифровка);
    КонецЕсли;
КонецПроцедуры

Если в Расшифровка лежит ссылка на объект, платформа и без кода предложит открыть его через контекстное меню. Свой обработчик нужен, когда по клику должно происходить нестандартное действие — переход на сайт, открытие другого отчёта, печать.

Для перехода на внешний URL из табличного документа положите в Расшифровка строку адреса и в ОбработкаРасшифровки вызовите ПерейтиПоНавигационнойСсылке(Расшифровка).

Ссылки и расшифровка в отчётах на СКД

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

Что стоит проверить в настройках СКД:

  1. У ресурса или поля должна быть разрешена расшифровка — это поведение по умолчанию, но его можно отключить в настройках.
  2. Для перехода именно к карточке объекта поле должно выводить ссылку, а не её представление строкой. Если выводите Контрагент.Наименование, кликать будет не на что — нужен сам Контрагент.

Когда нужна нестандартная реакция (открыть свою форму, другой отчёт с отбором), её перехватывают в обработчике ОбработкаРасшифровки формы отчёта — так же, как для табличного документа, потому что результат СКД выводится в тот же табличный документ.

Для перехода из отчёта в отчёт удобно класть в расшифровку не ссылку на объект, а структуру с параметрами, и разбирать её в обработчике — так один клик открывает вложенный отчёт с нужным отбором.

Ещё один приём — передача ссылки между формами при открытии. Когда открываете форму списка или другого отчёта по клику, отбор и начальное значение передают через параметры:

&НаКлиенте
Процедура ОткрытьПродажиКонтрагента(КонтрагентСсылка)
    Параметры = Новый Структура("Отбор", Новый Структура("Контрагент", КонтрагентСсылка));
    ОткрытьФорму("Документ.РеализацияТоваровУслуг.ФормаСписка", Параметры);
КонецПроцедуры

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

Ссылки на файлы, картинки и вложения

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

Схема для показа картинки в форме:

// сервер: кладём данные и получаем адрес
Адрес = ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификатор);

Полученный адрес (e1cib/tempstorage/...) присваивают реквизиту формы типа «Строка», с которым связано поле картинки. Поле формы с видом «Поле картинки» показывает изображение по этому адресу.

Чтобы отдать файл пользователю на скачивание (в том числе в веб-клиенте), применяют клиентские методы получения файлов — ПолучитьФайл или НачатьПолучениеФайлов. Они берут данные по адресу временного хранилища и сохраняют на диск пользователя с диалогом выбора папки.

Важные ограничения:

  • 🔸 Адрес временного хранилища живёт в пределах сеанса. Хранить его в базе и открывать «завтра» нельзя — он станет недействительным.
  • 🔸 Если временное хранилище привязано к УникальныйИдентификатор формы, данные очищаются при закрытии формы. Для долгоживущего адреса передают пустой идентификатор, но тогда чистить хранилище нужно вручную.
  • 🔸 Постоянное хранение файлов — это не ссылка на диск, а реквизит ХранилищеЗначения в объекте или подсистема работы с файлами.

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

Почему ссылка не открывается: разбор причин

Собрал частые сбои и что их вызывает — проверяйте по порядку.

Диагностика: выберите симптом

Отлаживая переходы, помните про границу клиент–сервер. Ссылку на объект и навигационную строку готовят где угодно, но сам переход (ПерейтиПоНавигационнойСсылке, открытие формы) — только на клиенте. Директивы компиляции &НаКлиенте и &НаСервере у процедур должны этому соответствовать.

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

Чем ссылочный тип отличается от навигационной ссылки?
Ссылочный тип — это значение-указатель на объект базы, с ним работают в запросах и реквизитах. Навигационная ссылка — текстовая строка e1cib/... для открытия формы в интерфейсе. Первое — данные, второе — команда перехода.
Как получить ссылку на документ строкой, чтобы вставить в письмо?
Нужна навигационная ссылка с адресом базы, а не просто e1cib/.... Внутренняя строка откроется только у того, кто уже в этой базе; для внешнего получателя собирают полную ссылку с URL информационной базы.
Почему `ПерейтиПоНавигационнойСсылке` выдаёт ошибку на сервере?
Эта процедура выполняется только на клиенте. Получите строку ссылки на сервере, верните её на клиент и там выполните переход.
Как сделать кликабельную ячейку в печатной форме?
Включите у области свойство Гиперссылка и заполните Расшифровка ссылкой на объект или строкой адреса. Реакцию на клик, если нужна нестандартная, пишут в событии ОбработкаРасшифровки.
Можно ли хранить адрес временного хранилища в базе?
Нет. Этот адрес действителен только в текущем сеансе. Для постоянного хранения файла используют реквизит ХранилищеЗначения или подсистему работы с файлами, а адрес временного хранилища получают заново при открытии.