Разработка и Конфигурация · 13 мин
Как открыть форму документа по ссылке в 1С
Разбираем, как открыть форму документа по ссылке в 1С: методы ОткрытьЗначение, ПолучитьФорму и ОткрытьФорму, примеры кода, ошибки и проверка результата.
В прикладной разработке на платформе 1С:Предприятие постоянно возникает задача: есть ссылка на документ (полученная из запроса, реквизита другого объекта или журнала), и нужно программно открыть пользователю его форму. Это типовой сценарий для кнопок перехода из отчётов, обработчиков гиперссылок, уведомлений и механизмов согласования.
Платформа предлагает несколько способов решения: универсальный метод ОткрытьЗначение(), устаревший, но рабочий ПолучитьФорму() и современный ОткрытьФорму() с параметрами. Выбор зависит от режима работы (обычное или управляемое приложение), необходимости передавать дополнительные параметры и требований к блокировке окна владельца.
Важно понимать разницу: ссылка — это просто указатель на объект базы данных, а форма — интерфейсное представление, которое платформа строит на лету. Открывая форму «по ссылке», вы фактически просите платформу найти подходящую форму документа и передать ей ключ записи. Ниже разберём все способы с примерами кода и типичными ошибками.
Что такое ссылка на документ и как её получить
Ссылка (тип ДокументСсылка.ИмяДокумента) — это уникальный идентификатор объекта в базе, который не содержит данных самого документа, но позволяет к ним обратиться. Получить ссылку можно несколькими путями: из результата запроса, из реквизита другого объекта, методом НайтиПоНомеру() менеджера документа или через Документы.ИмяДокумента.ПолучитьСсылку(УникальныйИдентификатор).
Типичный пример получения ссылки запросом:
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1 Док.Ссылка ИЗ Документ.РеализацияТоваровУслуг КАК Док
|ГДЕ Док.Номер = &Номер И Док.Дата МЕЖДУ &Начало И &Конец";
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
СсылкаНаДокумент = Выборка.Ссылка;
КонецЕсли;
Прежде чем открывать форму, полезно убедиться, что ссылка не пустая и объект реально существует в базе. Проверка на пустую ссылку выполняется через ЗначениеЗаполнено(Ссылка) или сравнение с Документы.ИмяДокумента.ПустаяСсылка(). Проверка существования объекта — через Ссылка.ПолучитьОбъект() (если вернул Неопределено, объекта нет) или запросом по ссылке, что быстрее.
Способ 1. Универсальный метод ОткрытьЗначение
Метод ОткрытьЗначение(Значение) — самый простой и универсальный вариант. Он работает и в обычном, и в управляемом приложении, на толстом и тонком клиенте. Платформа сама определяет, какую форму открыть для переданного значения: для ссылки на документ — форму документа, для ссылки на справочник — форму элемента.
// Клиентская процедура, например обработчик команды
&НаКлиенте
Процедура ОткрытьДокумент(Команда)
Если ЗначениеЗаполнено(СсылкаНаДокумент) Тогда
ОткрытьЗначение(СсылкаНаДокумент);
КонецЕсли;
КонецПроцедуры
Преимущество метода — не нужно знать имя вида документа и имя формы: платформа возьмёт форму, назначенную основной для объекта. Это удобно, когда тип ссылки заранее неизвестен, например в универсальной обработке перехода по гиперссылке из текстового поля.
Ограничение: ОткрытьЗначение() не позволяет передать дополнительные параметры, указать владельца формы или режим открытия. Если нужен тонкий контроль — используйте ОткрытьФорму().
Способ 2. ОткрытьФорму с ключом записи
Метод ОткрытьФорму() — основной инструмент управляемого приложения. Чтобы открыть форму существующего документа, нужно указать полное имя формы и передать структуру с параметром Ключ, содержащим ссылку:
&НаКлиенте
Процедура ОткрытьДокумент(Команда)
ПараметрыФормы = Новый Структура("Ключ", СсылкаНаДокумент);
ОткрытьФорму("Документ.РеализацияТоваровУслуг.ФормаОбъекта", ПараметрыФормы);
КонецПроцедуры
Если у документа несколько форм объекта, можно указать конкретную по имени (например, Документ.ЗаказПокупателя.Форма.ФормаДокументаМобильная). Если конкретная форма не задана, платформа откроет форму, назначенную основной в конфигураторе.
Метод принимает и дополнительные аргументы после параметров: владельца формы, уникальность, окно, навигационную ссылку, описание оповещения о закрытии и режим открытия окна. Например, чтобы получить оповещение при закрытии формы документа:
ОписаниеОповещения = Новый ОписаниеОповещения("ПослеЗакрытияДокумента", ЭтотОбъект);
ОткрытьФорму("Документ.РеализацияТоваровУслуг.ФормаОбъекта",
ПараметрыФормы, ЭтотОбъект, , , , ОписаниеОповещения);
- 1Получите ссылку на документ: из запроса, реквизита или НайтиПоНомеру()
- 2Проверьте, что ссылка заполнена и объект существует в базе
- 3В клиентской процедуре вызовите ОткрытьЗначение(Ссылка) или ОткрытьФорму() с параметром Ключ
- 4Запустите сеанс и проверьте, что открывается форма именно нужного документа
- 5Проверьте поведение при отсутствии прав у пользователя и при удалённом объекте
Способ 3. ПолучитьФорму в обычном приложении
В обычном приложении (режим, который ещё встречается в старых конфигурациях на платформах 8.2–8.3) форму документа можно получить прямо у ссылки:
ФормаДокумента = СсылкаНаДокумент.ПолучитьФорму("ФормаДокумента");
ФормаДокумента.Открыть();
// или модально:
// ФормаДокумента.ОткрытьМодально();
Если имя формы не указывать, будет получена основная форма. Метод ПолучитьФорму() возвращает объект формы, что позволяет перед открытием обратиться к её экспортным процедурам или реквизитам — например, установить отбор или передать дополнительные данные.
Учтите, что в управляемом приложении этот подход не работает: там формы получают через глобальный контекст методом ПолучитьФорму("ИмяФормы", Параметры), а не через ссылку. При миграции кода из обычного приложения в управляемое все вызовы Ссылка.ПолучитьФорму() нужно переписать на ОткрытьФорму() с параметром Ключ.
Открытие формы из журнала, отчёта и по навигационной ссылке
Из динамического списка и отчёта
В форме списка документов переход к форме документа обычно уже работает по двойному щелчку. Если нужна своя команда, в обработчике берите текущую строку списка:
&НаКлиенте
Процедура ОткрытьТекущийДокумент(Команда)
ТекущиеДанные = Элементы.Список.ТекущиеДанные;
Если ТекущиеДанные <> Неопределено Тогда
ОткрытьЗначение(ТекущиеДанные.Ссылка);
КонецЕсли;
КонецПроцедуры
В отчётах на СКД расшифровка по ссылке работает через стандартную обработку расшифровки: платформа сама предложит действие «Открыть». Если отчёт построен программно и поле выводится в табличный документ, в обработчике ОбработкаРасшифровки получите значение расшифровки и вызовите ОткрытьЗначение().
По навигационной ссылке
Каждый объект имеет навигационную ссылку вида e1cib/data/Документ.РеализацияТоваровУслуг?ref=.... Её можно получить методом ПолучитьНавигационнуюСсылку(Ссылка) и, например, отправить коллеге — при переходе по ней в том же информационном базе откроется форма документа. Программно перейти по навигационной ссылке можно через ПерейтиПоНавигационнойСсылке(НавСсылка) в клиентском контексте.
Это удобный способ «открыть документ по ссылке» в буквальном смысле: пользователь вставляет навигационную ссылку в обработку, а та вызывает ПерейтиПоНавигационнойСсылке(). Учтите, что ссылка работает только внутри той же информационной базы и при наличии у пользователя прав на объект.
Сравнение вариантов
Универсально, код в одну строку, работает с любым типом ссылки. Нельзя передать параметры и указать владельца.
Полный контроль: параметры, владелец, оповещение о закрытии, режим окна. Требует знать имя формы или вида документа.
Только обычное приложение. Позволит настроить форму до открытия, но не работает в управляемом режиме.
Подходит, когда есть строка навигационной ссылки, а не объектная ссылка. Работает только внутри текущей базы.
Типичные ошибки и проверка результата
Самая частая проблема — попытка открыть форму из серверной процедуры. Компилятор пропустит такой код, но в рантайме вызов ОткрытьЗначение() на сервере завершится ошибкой, потому что у сервера нет интерфейса. Всегда проверяйте директиву компиляции: открытие формы допустимо только в &НаКлиенте.
Вторая распространённая ошибка — передача в ОткрытьФорму() неправильного имени формы. Строка "Документ.Реализация.ФормаОбъекта" вызовет ошибку, если вид документа на самом деле называется РеализацияТоваровУслуг. Имя должно точно совпадать с именем объекта метаданных в конфигураторе, включая регистр букв не обязательно, но лучше копировать имя из дерева конфигурации.
Третья группа проблем связана с данными: пустая ссылка (форма не откроется или откроется как для нового документа), битая ссылка на удалённый объект (ошибка «Объект не найден») и отсутствие прав у пользователя (сообщение о нарушении прав доступа). Все три случая стоит обрабатывать явно: проверять заполненность, существование объекта и не пытаться обойти механизм прав.
Как проверить результат
Появляется форма именно того документа, чья ссылка передана, с корректными данными
Открывается пустая форма нового документа или ошибка выполнения
Выводится понятное предупреждение, форма не открывается
Открывается форма нового документа, что путает пользователя
При отсутствии прав выдаётся штатное сообщение о нарушении прав доступа
Нестандартная ошибка или аварийное завершение обработчика
Код заранее определяет битую ссылку и сообщает об этом
Исключение 'Объект не найден' в момент открытия
Ограничения и безопасная работа
Открытие формы — безопасная операция: она не меняет данные сама по себе. Риск появляется, если пользователь после открытия редактирует и записывает документ. Поэтому в сценариях «только просмотр» открывайте форму с параметром ТолькоПросмотр:
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Ключ", СсылкаНаДокумент);
ПараметрыФормы.Вставить("ТолькоПросмотр", Истина);
ОткрытьФорму("Документ.РеализацияТоваровУслуг.ФормаОбъекта", ПараметрыФормы);
Не пытайтесь программно записать или провести документ сразу после открытия формы — это нарушает логику интерактивной работы и может привести к конфликтам блокировок, если тот же документ открыт у другого пользователя. Если нужна автоматическая запись без участия пользователя, делайте это на сервере через ПолучитьОбъект() и Записать(), без открытия формы.
При массовых операциях (например, открытие десятков документов из списка) помните, что каждая форма потребляет ресурсы клиентского сеанса. Открывайте формы по одной по явному действию пользователя, а не циклом.
FAQ: частые вопросы
Как открыть форму документа, если известен только его номер?
Получите ссылку методом менеджера: Документы.ИмяДокумента.НайтиПоНомеру(Номер, Дата). Учтите, что номер уникален только в пределах периода нумерации (обычно года), поэтому передавайте дату, попадающую в нужный период. Затем вызовите ОткрытьЗначение(Ссылка).
Можно ли открыть форму нового документа с заполненными реквизитами?
Да. В ОткрытьФорму() передайте структуру с параметром «ЗначенияЗаполнения» — вложенной структурой с реквизитами, или параметр «Основание» со ссылкой на документ-основание, если настроен ввод на основании. Параметр «Ключ» при этом не передаётся.
Почему ОткрытьЗначение() не срабатывает в фоновом задании?
Фоновое задание выполняется на сервере без пользовательского интерфейса, поэтому открытие формы там невозможно. Из фонового задания можно вернуть ссылку в клиентскую процедуру (через оповещение или результат длительной операции) и открыть форму уже на клиенте.
Как открыть форму документа из внешней обработки?
Точно так же, как из конфигурации: в клиентской процедуре формы обработки вызовите ОткрытьЗначение(Ссылка) или ОткрытьФорму() с полным именем формы. Внешняя обработка имеет доступ ко всем объектам метаданных информационной базы, в которой запущена.
Что делать, если при открытии возникает ошибка «Объект не найден»?
Это признак битой ссылки: объект удалён, а ссылка осталась в реквизите или регистре. Перед открытием проверяйте существование объекта запросом по ссылке. Для устранения причины запустите тестирование и исправление базы или обработайте битые ссылки специализированной обработкой.
Как открыть форму списка документов с отбором, а не форму одного документа?
Вызовите ОткрытьФорму("Документ.ИмяДокумента.ФормаСписка", Параметры), где в параметрах передайте структуру «Отбор» с нужными полями, например Новый Структура("Отбор", Новый Структура("Организация", Организация)). Параметр «Ключ» в этом случае не используется.
Что важно запомнить
Для открытия формы документа по ссылке в управляемом приложении достаточно ОткрытьЗначение(Ссылка); для полного контроля используйте ОткрытьФорму() с параметром Ключ. Открытие возможно только на клиенте, ссылку предварительно проверяйте на заполненность и существование объекта, а для просмотра без риска изменений передавайте параметр ТолькоПросмотр.