Ссылки в 1С: от ссылочного типа до гиперссылок в отчётах
Содержание
Под словом «ссылка» в 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/Справочник.Контрагенты");
КонецПроцедуры
Поле-гиперссылка. У поля формы, связанного с реквизитом, в свойстве Вид выбирается Поле надписи, и также включается Гиперссылка. Удобно, когда текст ссылки берётся из данных.
Что можно делать по клику:
- Открыть форму другого объекта —
ПерейтиПоНавигационнойСсылкес заранее полученной ссылкой. - Открыть внешний сайт —
ПерейтиПоНавигационнойСсылке("https://...")илиЗапуститьПриложение("https://..."). - Выполнить произвольный код — отчёт, расчёт, заполнение.
Для адреса электронной почты и телефона подойдут схемы mailto: и tel: в той же процедуре перехода.
Гиперссылки и расшифровка в табличном документе
В печатных формах и отчётах, выводимых в табличный документ, за «ссылочность» ячейки отвечают два свойства области: Гиперссылка и Расшифровка.
Гиперссылка = Истина— делает текст ячейки похожим на ссылку (подчёркнутый, кликабельный).Расшифровка— хранит значение, которое платформа передаст в обработчик при клике. Это может быть ссылка на объект, строка-навигация или любое значение.
Пример: при заполнении макета кладём в ячейку ссылку на документ:
Область = Макет.ПолучитьОбласть("Строка");
Область.Параметры.Номер = Выборка.Номер;
ОбластьЯчейки = Область.Области("Номер");
ОбластьЯчейки.Расшифровка = Выборка.Ссылка;
ОбластьЯчейки.Гиперссылка = Истина;
Обработку клика пишут в событии ОбработкаРасшифровки того элемента формы, где выводится табличный документ:
&НаКлиенте
Процедура ТабличныйДокументОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)
Если ТипЗнч(Расшифровка) = Тип("ДокументСсылка.РеализацияТоваровУслуг") Тогда
СтандартнаяОбработка = Ложь;
ПоказатьЗначение(, Расшифровка);
КонецЕсли;
КонецПроцедуры
Если в Расшифровка лежит ссылка на объект, платформа и без кода предложит открыть его через контекстное меню. Свой обработчик нужен, когда по клику должно происходить нестандартное действие — переход на сайт, открытие другого отчёта, печать.
Для перехода на внешний URL из табличного документа положите в Расшифровка строку адреса и в ОбработкаРасшифровки вызовите ПерейтиПоНавигационнойСсылке(Расшифровка).
Ссылки и расшифровка в отчётах на СКД
В отчётах на системе компоновки данных расшифровка работает почти без кода. Поля ссылочного типа в результате компоновки автоматически становятся кликабельными: по клику открывается контекстное меню с командой открыть объект, отфильтровать, сгруппировать.
Что стоит проверить в настройках СКД:
- У ресурса или поля должна быть разрешена расшифровка — это поведение по умолчанию, но его можно отключить в настройках.
- Для перехода именно к карточке объекта поле должно выводить ссылку, а не её представление строкой. Если выводите
Контрагент.Наименование, кликать будет не на что — нужен самКонтрагент.
Когда нужна нестандартная реакция (открыть свою форму, другой отчёт с отбором), её перехватывают в обработчике ОбработкаРасшифровки формы отчёта — так же, как для табличного документа, потому что результат СКД выводится в тот же табличный документ.
Для перехода из отчёта в отчёт удобно класть в расшифровку не ссылку на объект, а структуру с параметрами, и разбирать её в обработчике — так один клик открывает вложенный отчёт с нужным отбором.
Ещё один приём — передача ссылки между формами при открытии. Когда открываете форму списка или другого отчёта по клику, отбор и начальное значение передают через параметры:
&НаКлиенте
Процедура ОткрытьПродажиКонтрагента(КонтрагентСсылка)
Параметры = Новый Структура("Отбор", Новый Структура("Контрагент", КонтрагентСсылка));
ОткрытьФорму("Документ.РеализацияТоваровУслуг.ФормаСписка", Параметры);
КонецПроцедуры
Так ссылка на объект превращается в «ссылку-навигацию» внутри вашего интерфейса: пользователь кликает по контрагенту в отчёте и сразу видит его документы.
Ссылки на файлы, картинки и вложения
Файл нельзя показать в форме «по пути на диске» — на сервере этого пути у клиента нет. Поэтому картинки и вложения проходят через временное хранилище, а ссылкой на них служит его адрес.
Схема для показа картинки в форме:
// сервер: кладём данные и получаем адрес
Адрес = ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификатор);
Полученный адрес (e1cib/tempstorage/...) присваивают реквизиту формы типа «Строка», с которым связано поле картинки. Поле формы с видом «Поле картинки» показывает изображение по этому адресу.
Чтобы отдать файл пользователю на скачивание (в том числе в веб-клиенте), применяют клиентские методы получения файлов — ПолучитьФайл или НачатьПолучениеФайлов. Они берут данные по адресу временного хранилища и сохраняют на диск пользователя с диалогом выбора папки.
Важные ограничения:
- 🔸 Адрес временного хранилища живёт в пределах сеанса. Хранить его в базе и открывать «завтра» нельзя — он станет недействительным.
- 🔸 Если временное хранилище привязано к
УникальныйИдентификаторформы, данные очищаются при закрытии формы. Для долгоживущего адреса передают пустой идентификатор, но тогда чистить хранилище нужно вручную. - 🔸 Постоянное хранение файлов — это не ссылка на диск, а реквизит
ХранилищеЗначенияв объекте или подсистема работы с файлами.
Если вложения в конфигурации ведутся через типовую подсистему работы с файлами (присоединённые файлы к документу или элементу справочника), «ссылкой» на вложение служит ссылка на сам объект присоединённого файла. Двоичные данные при этом хранятся либо в базе, либо в томах на диске — какой вариант выбран, видно в настройках работы с файлами. Для показа или выгрузки такого файла его данные сначала помещают во временное хранилище, а дальше работают по уже описанной схеме с адресом.
Почему ссылка не открывается: разбор причин
Собрал частые сбои и что их вызывает — проверяйте по порядку.
ПерейтиПоНавигационнойСсылке вызывается в серверной процедуре. Эта процедура только клиентская — перенесите вызов в клиентский контекст.Гиперссылка у области, либо не заполнена Расшифровка. Нужны оба свойства.1cestart или веб-клиент.ПолучитьОбъект() у пустой или битой ссылки. Проверьте ссылку на Пустая() и на существование объекта до вызова.Отлаживая переходы, помните про границу клиент–сервер. Ссылку на объект и навигационную строку готовят где угодно, но сам переход (ПерейтиПоНавигационнойСсылке, открытие формы) — только на клиенте. Директивы компиляции &НаКлиенте и &НаСервере у процедур должны этому соответствовать.
Частые вопросы
Чем ссылочный тип отличается от навигационной ссылки?
e1cib/... для открытия формы в интерфейсе. Первое — данные, второе — команда перехода.Как получить ссылку на документ строкой, чтобы вставить в письмо?
e1cib/.... Внутренняя строка откроется только у того, кто уже в этой базе; для внешнего получателя собирают полную ссылку с URL информационной базы.Почему `ПерейтиПоНавигационнойСсылке` выдаёт ошибку на сервере?
Как сделать кликабельную ячейку в печатной форме?
Гиперссылка и заполните Расшифровка ссылкой на объект или строкой адреса. Реакцию на клик, если нужна нестандартная, пишут в событии ОбработкаРасшифровки.Можно ли хранить адрес временного хранилища в базе?
ХранилищеЗначения или подсистему работы с файлами, а адрес временного хранилища получают заново при открытии.