К статье
Практический материал

Разработка и Конфигурация · 13 мин

Как открыть форму документа по ссылке в 1С

Разбираем, как открыть форму документа по ссылке в 1С: методы ОткрытьЗначение, ПолучитьФорму и ОткрытьФорму, примеры кода, ошибки и проверка результата.

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

Платформа предлагает несколько способов решения: универсальный метод ОткрытьЗначение(), устаревший, но рабочий ПолучитьФорму() и современный ОткрытьФорму() с параметрами. Выбор зависит от режима работы (обычное или управляемое приложение), необходимости передавать дополнительные параметры и требований к блокировке окна владельца.

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

Что такое ссылка на документ и как её получить

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

Типичный пример получения ссылки запросом:

Запрос = Новый Запрос;

Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1 Док.Ссылка ИЗ Документ.РеализацияТоваровУслуг КАК Док

|ГДЕ Док.Номер = &Номер И Док.Дата МЕЖДУ &Начало И &Конец";

Выборка = Запрос.Выполнить().Выбрать();

Если Выборка.Следующий() Тогда

СсылкаНаДокумент = Выборка.Ссылка;

КонецЕсли;

Прежде чем открывать форму, полезно убедиться, что ссылка не пустая и объект реально существует в базе. Проверка на пустую ссылку выполняется через ЗначениеЗаполнено(Ссылка) или сравнение с Документы.ИмяДокумента.ПустаяСсылка(). Проверка существования объекта — через Ссылка.ПолучитьОбъект() (если вернул Неопределено, объекта нет) или запросом по ссылке, что быстрее.

Способ 1. Универсальный метод ОткрытьЗначение

Метод ОткрытьЗначение(Значение) — самый простой и универсальный вариант. Он работает и в обычном, и в управляемом приложении, на толстом и тонком клиенте. Платформа сама определяет, какую форму открыть для переданного значения: для ссылки на документ — форму документа, для ссылки на справочник — форму элемента.

// Клиентская процедура, например обработчик команды

&НаКлиенте

Процедура ОткрытьДокумент(Команда)

Если ЗначениеЗаполнено(СсылкаНаДокумент) Тогда

ОткрытьЗначение(СсылкаНаДокумент);

КонецЕсли;

КонецПроцедуры

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

Ограничение: ОткрытьЗначение() не позволяет передать дополнительные параметры, указать владельца формы или режим открытия. Если нужен тонкий контроль — используйте ОткрытьФорму().

Способ 2. ОткрытьФорму с ключом записи

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

&НаКлиенте

Процедура ОткрытьДокумент(Команда)

ПараметрыФормы = Новый Структура("Ключ", СсылкаНаДокумент);

ОткрытьФорму("Документ.РеализацияТоваровУслуг.ФормаОбъекта", ПараметрыФормы);

КонецПроцедуры

Если у документа несколько форм объекта, можно указать конкретную по имени (например, Документ.ЗаказПокупателя.Форма.ФормаДокументаМобильная). Если конкретная форма не задана, платформа откроет форму, назначенную основной в конфигураторе.

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

ОписаниеОповещения = Новый ОписаниеОповещения("ПослеЗакрытияДокумента", ЭтотОбъект);

ОткрытьФорму("Документ.РеализацияТоваровУслуг.ФормаОбъекта",

ПараметрыФормы, ЭтотОбъект, , , , ОписаниеОповещения);

Порядок действий
  1. 1
    Получите ссылку на документ: из запроса, реквизита или НайтиПоНомеру()
  2. 2
    Проверьте, что ссылка заполнена и объект существует в базе
  3. 3
    В клиентской процедуре вызовите ОткрытьЗначение(Ссылка) или ОткрытьФорму() с параметром Ключ
  4. 4
    Запустите сеанс и проверьте, что открывается форма именно нужного документа
  5. 5
    Проверьте поведение при отсутствии прав у пользователя и при удалённом объекте

Способ 3. ПолучитьФорму в обычном приложении

В обычном приложении (режим, который ещё встречается в старых конфигурациях на платформах 8.2–8.3) форму документа можно получить прямо у ссылки:

ФормаДокумента = СсылкаНаДокумент.ПолучитьФорму("ФормаДокумента");

ФормаДокумента.Открыть();

// или модально:

// ФормаДокумента.ОткрытьМодально();

Если имя формы не указывать, будет получена основная форма. Метод ПолучитьФорму() возвращает объект формы, что позволяет перед открытием обратиться к её экспортным процедурам или реквизитам — например, установить отбор или передать дополнительные данные.

Учтите, что в управляемом приложении этот подход не работает: там формы получают через глобальный контекст методом ПолучитьФорму("ИмяФормы", Параметры), а не через ссылку. При миграции кода из обычного приложения в управляемое все вызовы Ссылка.ПолучитьФорму() нужно переписать на ОткрытьФорму() с параметром Ключ.

Открытие формы из журнала, отчёта и по навигационной ссылке

Из динамического списка и отчёта

В форме списка документов переход к форме документа обычно уже работает по двойному щелчку. Если нужна своя команда, в обработчике берите текущую строку списка:

&НаКлиенте

Процедура ОткрытьТекущийДокумент(Команда)

ТекущиеДанные = Элементы.Список.ТекущиеДанные;

Если ТекущиеДанные <> Неопределено Тогда

ОткрытьЗначение(ТекущиеДанные.Ссылка);

КонецЕсли;

КонецПроцедуры

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

По навигационной ссылке

Каждый объект имеет навигационную ссылку вида e1cib/data/Документ.РеализацияТоваровУслуг?ref=.... Её можно получить методом ПолучитьНавигационнуюСсылку(Ссылка) и, например, отправить коллеге — при переходе по ней в том же информационном базе откроется форма документа. Программно перейти по навигационной ссылке можно через ПерейтиПоНавигационнойСсылке(НавСсылка) в клиентском контексте.

Это удобный способ «открыть документ по ссылке» в буквальном смысле: пользователь вставляет навигационную ссылку в обработку, а та вызывает ПерейтиПоНавигационнойСсылке(). Учтите, что ссылка работает только внутри той же информационной базы и при наличии у пользователя прав на объект.

Сравнение вариантов

ОткрытьЗначение(Ссылка)

Универсально, код в одну строку, работает с любым типом ссылки. Нельзя передать параметры и указать владельца.

ОткрытьФорму() с параметром Ключ

Полный контроль: параметры, владелец, оповещение о закрытии, режим окна. Требует знать имя формы или вида документа.

Ссылка.ПолучитьФорму()

Только обычное приложение. Позволит настроить форму до открытия, но не работает в управляемом режиме.

ПерейтиПоНавигационнойСсылке()

Подходит, когда есть строка навигационной ссылки, а не объектная ссылка. Работает только внутри текущей базы.

Типичные ошибки и проверка результата

Самая частая проблема — попытка открыть форму из серверной процедуры. Компилятор пропустит такой код, но в рантайме вызов ОткрытьЗначение() на сервере завершится ошибкой, потому что у сервера нет интерфейса. Всегда проверяйте директиву компиляции: открытие формы допустимо только в &НаКлиенте.

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

Третья группа проблем связана с данными: пустая ссылка (форма не откроется или откроется как для нового документа), битая ссылка на удалённый объект (ошибка «Объект не найден») и отсутствие прав у пользователя (сообщение о нарушении прав доступа). Все три случая стоит обрабатывать явно: проверять заполненность, существование объекта и не пытаться обойти механизм прав.

Типичные ошибки
01
Вызов ОткрытьЗначение() в серверной процедуре — ошибка выполнения, так как сервер не имеет интерфейса
02
Неверное имя формы в ОткрытьФорму() — исключение 'Ошибка при вызове метода контекста'; имя берите из конфигуратора
03
Открытие формы по пустой ссылке без проверки — пользователь видит форму нового документа или ошибку
04
Игнорирование битых ссылок — обращение к удалённому объекту вызывает 'Объект не найден'; проверяйте существование заранее
05
Использование Ссылка.ПолучитьФорму() в управляемом приложении — метод недоступен, нужен ОткрытьФорму() с параметром Ключ
Контрольные точки

Как проверить результат

Открывается ли форма
Норма

Появляется форма именно того документа, чья ссылка передана, с корректными данными

Тревожный признак

Открывается пустая форма нового документа или ошибка выполнения

Поведение при пустой ссылке
Норма

Выводится понятное предупреждение, форма не открывается

Тревожный признак

Открывается форма нового документа, что путает пользователя

Права пользователя
Норма

При отсутствии прав выдаётся штатное сообщение о нарушении прав доступа

Тревожный признак

Нестандартная ошибка или аварийное завершение обработчика

Удалённый объект
Норма

Код заранее определяет битую ссылку и сообщает об этом

Тревожный признак

Исключение 'Объект не найден' в момент открытия

Ограничения и безопасная работа

Открытие формы — безопасная операция: она не меняет данные сама по себе. Риск появляется, если пользователь после открытия редактирует и записывает документ. Поэтому в сценариях «только просмотр» открывайте форму с параметром ТолькоПросмотр:

ПараметрыФормы = Новый Структура;

ПараметрыФормы.Вставить("Ключ", СсылкаНаДокумент);

ПараметрыФормы.Вставить("ТолькоПросмотр", Истина);

ОткрытьФорму("Документ.РеализацияТоваровУслуг.ФормаОбъекта", ПараметрыФормы);

Не пытайтесь программно записать или провести документ сразу после открытия формы — это нарушает логику интерактивной работы и может привести к конфликтам блокировок, если тот же документ открыт у другого пользователя. Если нужна автоматическая запись без участия пользователя, делайте это на сервере через ПолучитьОбъект() и Записать(), без открытия формы.

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

FAQ: частые вопросы

Как открыть форму документа, если известен только его номер?

Получите ссылку методом менеджера: Документы.ИмяДокумента.НайтиПоНомеру(Номер, Дата). Учтите, что номер уникален только в пределах периода нумерации (обычно года), поэтому передавайте дату, попадающую в нужный период. Затем вызовите ОткрытьЗначение(Ссылка).

Можно ли открыть форму нового документа с заполненными реквизитами?

Да. В ОткрытьФорму() передайте структуру с параметром «ЗначенияЗаполнения» — вложенной структурой с реквизитами, или параметр «Основание» со ссылкой на документ-основание, если настроен ввод на основании. Параметр «Ключ» при этом не передаётся.

Почему ОткрытьЗначение() не срабатывает в фоновом задании?

Фоновое задание выполняется на сервере без пользовательского интерфейса, поэтому открытие формы там невозможно. Из фонового задания можно вернуть ссылку в клиентскую процедуру (через оповещение или результат длительной операции) и открыть форму уже на клиенте.

Как открыть форму документа из внешней обработки?

Точно так же, как из конфигурации: в клиентской процедуре формы обработки вызовите ОткрытьЗначение(Ссылка) или ОткрытьФорму() с полным именем формы. Внешняя обработка имеет доступ ко всем объектам метаданных информационной базы, в которой запущена.

Что делать, если при открытии возникает ошибка «Объект не найден»?

Это признак битой ссылки: объект удалён, а ссылка осталась в реквизите или регистре. Перед открытием проверяйте существование объекта запросом по ссылке. Для устранения причины запустите тестирование и исправление базы или обработайте битые ссылки специализированной обработкой.

Как открыть форму списка документов с отбором, а не форму одного документа?

Вызовите ОткрытьФорму("Документ.ИмяДокумента.ФормаСписка", Параметры), где в параметрах передайте структуру «Отбор» с нужными полями, например Новый Структура("Отбор", Новый Структура("Организация", Организация)). Параметр «Ключ» в этом случае не используется.

Итог

Что важно запомнить

Для открытия формы документа по ссылке в управляемом приложении достаточно ОткрытьЗначение(Ссылка); для полного контроля используйте ОткрытьФорму() с параметром Ключ. Открытие возможно только на клиенте, ссылку предварительно проверяйте на заполненность и существование объекта, а для просмотра без риска изменений передавайте параметр ТолькоПросмотр.