Разработка и Конфигурация · 9 мин
Как программно открыть документ по ссылке в 1С
Как программно открыть документ по ссылке в 1С: методы ПоказатьЗначение и ОткрытьЗначение, обработчики формы, навигационные ссылки. Примеры кода и типичные ошибки.
Задача открыть документ по ссылке возникает у разработчика 1С регулярно: нужно показать пользователю объект из отчёта, обработать переход по гиперссылке в письме, открыть документ из внешней обработки или перейти к записи по навигационной ссылке. Во всех этих случаях у вас уже есть ссылка (объект типа «ДокументСсылка»), и остаётся правильно вызвать механизм открытия формы.
Способ зависит от контекста: из серверной процедуры форму открыть нельзя, из клиентской — можно несколькими методами, а из внешнего приложения потребуется навигационная ссылка или COM-соединение. Ниже разобраны основные варианты с примерами кода, ограничения каждого подхода и типичные ошибки, из-за которых форма не открывается или открывается не та.
Какие способы открытия документа существуют
В управляемом приложении 1С есть несколько механизмов, которые решают одну задачу по-разному. Выбор зависит от того, откуда вызывается код (клиент, сервер, внешнее приложение), нужно ли блокировать текущую форму и требуется ли реакция после закрытия документа.
- ПоказатьЗначение — асинхронный метод, открывает форму объекта и не ждёт её закрытия, поддерживает оповещение.
- ОткрытьЗначение — синхронный метод, блокирует вызывающую форму до закрытия открытой.
- ОткрытьФорму с параметром
Ключ— гибкий вариант, позволяет передать дополнительные параметры и открыть конкретную форму документа. - Навигационная ссылка — открытие документа из браузера, письма или внешней программы через веб-клиент или тонкий клиент.
- COM/HTTP-интеграция — когда ссылку нужно не показать, а получить и обработать в другой системе.
Сравнение вариантов
Подходит для обычного показа документа из клиентского кода; не блокирует интерфейс, но нельзя сразу получить результат закрытия
Удобен, когда после закрытия документа нужно продолжить логику; блокирует родительскую форму, что не всегда приемлемо
Максимальная гибкость: выбор конкретной формы, дополнительные параметры; требует знать имя формы и точный тип ссылки
Единственный способ открыть документ извне (браузер, письмо, мессенджер); требует работающего веб-сервера или протокола e1c
Открытие документа методом ПоказатьЗначение
Самый универсальный и рекомендуемый в управляемом приложении способ — метод ПоказатьЗначение. Он доступен только на клиенте, поэтому вызов размещают в директиве &НаКлиенте. Метод сам определяет, какую форму открыть для переданного типа ссылки.
&НаКлиенте
Процедура ОткрытьДокумент(Команда)
СсылкаНаДокумент = ПолучитьСсылкуНаСервере(); // ДокументСсылка
ПоказатьЗначение(, СсылкаНаДокумент);
КонецПроцедуры
Первый параметр — описание оповещения, которое будет вызвано после закрытия формы. Если реакция не нужна, передают Неопределено. Важно: метод асинхронный, код после вызова выполнится сразу, не дожидаясь закрытия документа. Если нужна последовательная логика (например, обновить список после закрытия), используйте оповещение:
&НаКлиенте
Процедура ОткрытьДокумент(Команда)
Оповещение = Новый ОписаниеОповещения("ПослеЗакрытияДокумента", ЭтотОбъект);
ПоказатьЗначение(Оповещение, СсылкаНаДокумент);
КонецПроцедуры
&НаКлиенте
Процедура ПослеЗакрытияДокумента(ДопПараметры) Экспорт
Элементы.Список.Обновить();
КонецПроцедуры
Открытие через ОткрытьЗначение и ОткрытьФорму
Метод ОткрытьЗначение(Ссылка) работает синхронно: вызывающая форма блокируется, пока пользователь не закроет документ. Это удобно в мастерах и пошаговых сценариях, но мешает, если пользователь должен видеть обе формы одновременно.
Когда нужен контроль над тем, какая именно форма откроется и с какими параметрами, применяют ОткрытьФорму с параметром Ключ:
&НаКлиенте
Процедура ОткрытьФормуДокумента(Команда)
ПараметрыФормы = Новый Структура("Ключ", СсылкаНаДокумент);
ОткрытьФорму("Документ.РеализацияТоваровУслуг.Форма.ФормаДокумента", ПараметрыФормы);
КонецПроцедуры
Параметр Ключ указывает платформе, объект какой ссылки нужно открыть. Если передать ссылку несуществующего или удалённого объекта, форма откроется с ошибкой или пустой — поэтому перед открытием стоит проверять ссылку на заполненность и существование объекта.
Как открыть документ по навигационной ссылке извне
Когда документ нужно открыть из письма, мессенджера или другой программы, используют навигационную ссылку. Получить её можно методом ПолучитьНавигационнуюСсылку(Ссылка) на сервере:
&НаСервере
Функция НавигационнаяСсылкаДокумента(Ссылка)
Возврат ПолучитьНавигационнуюСсылку(Ссылка);
КонецФункции
// Результат: e1cib/data/Документ.РеализацияТоваровУслуг?ref=8a3b00112233445566778899aabbccdd
Для открытия в браузере навигационную ссылку подставляют после адреса публикации базы: http://server/base/#e1cib/data/.... При переходе по такому URL веб-клиент откроет форму документа после авторизации. Для толстого и тонкого клиента используется протокол e1c, если он зарегистрирован в системе при установке платформы.
Учтите: навигационная ссылка содержит внутренний идентификатор объекта и привязана к конкретной информационной базе. После переноса данных в другую базу (например, из рабочей в тестовую) или после обмена с изменением GUID ссылка станет недействительной.
Открытие документа из обычного приложения и внешних обработок
В обычном приложении (режим 8.2 и ранее) вместо управляемых методов используется ОткрытьЗначение(Ссылка) без ограничений либо получение формы через Ссылка.ПолучитьФорму() с последующим вызовом Открыть() или ОткрытьМодально():
ФормаДокумента = СсылкаНаДокумент.ПолучитьФорму();
ФормаДокумента.Открыть();
Во внешних обработках, запускаемых в управляемом режиме, действуют те же правила, что и для форм конфигурации: ПоказатьЗначение и ОткрытьФорму доступны, но только в клиентских процедурах. Если обработка работает в фоновом задании или на сервере, открыть форму невозможно в принципе — формы существуют только в интерактивном сеансе пользователя.
Проверка результата и типичные ошибки
После внедрения кода проверьте сценарий на реальных данных: форма должна открываться с нужным документом, без лишних окон выбора и ошибок. Ниже — контрольные точки и типичные проблемы.
Как проверить результат
Открывается форма именно того документа, ссылка на который передана
Открывается форма выбора типа или пустая форма нового объекта
При повторном вызове активируется уже открытая форма документа
Открывается вторая копия формы того же объекта
Пользователь без прав видит понятное сообщение о недоступности
Возникает необработанная ошибка нарушения прав доступа
Отдельная частая ситуация — попытка открыть документ, полученный COM-соединением из другой базы. Ссылка, полученная через COM, существует только в контексте того соединения и не может быть показана в текущем сеансе. В таком случае передают навигационную ссылку или GUID, а в текущей базе ищут соответствующий объект через ПолучитьСсылку(Новый УникальныйИдентификатор(СтрокаGUID)).
Частые вопросы
Как открыть документ, если известен только его номер?
Сначала найдите ссылку на сервере методом Документы.ИмяДокумента.НайтиПоНомеру(Номер, Дата). Если ссылка найдена (не пустая), передайте её на клиент и откройте через ПоказатьЗначение. Учитывайте, что номер уникален только в пределах периода нумерации, поэтому передавайте и дату.
Можно ли открыть документ в режиме «только просмотр»?
Да. Используйте ОткрытьФорму с параметрами: Новый Структура("Ключ, ТолькоПросмотр", Ссылка, Истина). Форма откроется без возможности редактирования и записи.
Почему ПоказатьЗначение не срабатывает без ошибки?
Чаще всего вызов находится в серверной процедуре или в контексте, где клиентские методы запрещены (например, в фоновом задании). Проверьте директиву компиляции процедуры — она должна быть &НаКлиенте, а ссылка должна быть получена заранее.
Как открыть документ из письма электронной почты?
Сформируйте навигационную ссылку через ПолучитьНавигационнуюСсылку и вставьте в письмо полный URL вида http://сервер/база/#e1cib/data/.... Получатель с доступом к веб-клиенту откроет документ после авторизации. Для тонкого клиента используется ссылка с протоколом e1c.
Что делать, если ссылка есть, а объект удалён?
Проверьте существование объекта запросом к базе на сервере: если выборка пуста, объект физически удалён, и открывать форму не нужно — покажите пользователю сообщение. Для помеченных на удаление объектов форма откроется штатно.
Что важно запомнить
На клиенте документ по ссылке открывают через ПоказатьЗначение или ОткрытьФорму с параметром Ключ, извне — по навигационной ссылке. Перед открытием проверяйте ссылку на заполненность и существование объекта, а вызовы размещайте только в клиентских процедурах.