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

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

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

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

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

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

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

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

&НаКлиенте

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

СсылкаНаДокумент = ПолучитьСсылкуНаДокумент(); // любой способ получения ссылки

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

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

КонецЕсли;

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

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

Способ 2. ОткрытьФорму с параметром Ключ — полный контроль

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

&НаКлиенте

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

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

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

ПараметрыФормы, ЭтаФорма, Новый УникальныйИдентификатор);

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

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

Дополнительные параметры можно добавить в ту же структуру — они попадут в обработчик ПриСозданииНаСервере формы через коллекцию Параметры. Например, так можно открыть документ и сразу развернуть нужную вкладку или установить отбор в табличной части.

Как получить оповещение о закрытии формы

Если после закрытия формы документа нужно обновить список или выполнить другие действия, передайте описание оповещения последним параметром:

&НаКлиенте

Процедура ОткрытьСОповещением(Команда)

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

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

ОткрытьФорму("Документ.ЗаказКлиента.ФормаОбъекта", ПараметрыФормы,

ЭтаФорма, , , , Оповещение);

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

&НаКлиенте

Процедура ПослеЗакрытияДокумента(Результат, ДополнительныеПараметры) Экспорт

Элементы.Список.Обновить();

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

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

Способ 3. ПолучитьФорму — для обычного приложения и особых случаев

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

ФормаДокумента = ПолучитьФорму("Документ.ПриходныйКассовыйОрдер.Форма.ФормаДокумента",

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

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

Преимущество подхода — доступ к самому объекту формы до её открытия: можно программно установить реквизиты формы, вызвать её экспортные процедуры, подписаться на события. Недостаток — метод считается устаревшим для управляемого приложения, и в новых разработках рекомендуется ОткрытьФорму().

Сравнение способов открытия

ОткрытьЗначение

Одна строка кода, всегда основная форма. Не подходит, если нужны параметры, оповещение или неосновная форма.

ОткрытьФорму

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

ПолучитьФорму + Открыть

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

Как получить ссылку на документ для открытия

Прежде чем открывать форму, ссылку нужно откуда-то получить. Типовые источники: параметр команды формы списка (Элементы.Список.ТекущаяСтрока), реквизит другого объекта, результат запроса или поиск по номеру и дате. Пример поиска и открытия документа по номеру:

&НаКлиенте

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

Ссылка = НайтиДокументПоНомеру(НомерДокумента, ДатаДокумента);

Если Ссылка = Неопределено Тогда

ПоказатьПредупреждение(, "Документ не найден");

Возврат;

КонецЕсли;

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

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

&НаСервереБезКонтекста

Функция НайтиДокументПоНомеру(Номер, Дата)

Запрос = Новый Запрос("ВЫБРАТЬ ПЕРВЫЕ 1 Ссылка

|ИЗ Документ.РеализацияТоваровУслуг

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

Запрос.УстановитьПараметр("Номер", Номер);

Запрос.УстановитьПараметр("Начало", НачалоДня(Дата));

Запрос.УстановитьПараметр("Конец", КонецДня(Дата));

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

Возврат ?(Выборка.Следующий(), Выборка.Ссылка, Неопределено);

КонецФункции

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

bsl
&НаКлиенте
Процедура ОткрытьПоСсылке(Ссылка)
	Если Не ЗначениеЗаполнено(Ссылка) Тогда
		Возврат;
	КонецЕсли;
	ПоказатьЗначение(, Ссылка); // альтернатива ОткрытьЗначение
КонецПроцедуры

Особые сценарии и ограничения

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

Вторая ситуация — открытие из фонового задания или из серверного кода. Это невозможно в принципе: интерактивные вызовы доступны только в клиентском контексте. Если нужно «показать пользователю документ после обработки», возвращайте ссылку из серверной функции и открывайте её на клиенте после завершения.

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

Типичные ошибки и как их исправить

Самая распространённая ошибка — «Ошибка открытия формы. Недопустимое значение параметра Ключ»: она возникает, когда в параметр Ключ передали значение не того типа (например, ссылку на справочник вместо документа) или «битую» ссылку на удалённый объект. Перед открытием проверяйте тип через ТипЗнч(Ссылка) и существование объекта запросом или функцией ОбщегоНазначения.СсылкаСуществует() в типовых конфигурациях на БСП.

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

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

Типичные ошибки
01
ОткрытьФорму без параметра Ключ — открывается форма нового документа вместо существующего
02
Вызов ОткрытьЗначение на сервере — исключение о недоступности интерактивных операций
03
Передача битой ссылки без проверки — ошибка открытия формы у пользователя
04
Открытие формы в цикле по сотням ссылок — клиент зависает от множества окон
05
Неверное полное имя формы — ошибка «Форма не найдена» при открытии

Как проверить, что открытие работает правильно

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

Также проверьте граничные случаи: помеченный на удаление документ, документ без прав доступа у текущего пользователя (должна быть корректная ошибка доступа, а не падение обработки), и пустую ссылку. Каждый из этих случаев должен обрабатываться явно — предупреждением или отказом от открытия.

Контрольные точки

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

Что открылось
Норма

Форма показывает документ с ожидаемым номером и датой

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

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

Права доступа
Норма

При отсутствии прав — корректное сообщение о нарушении прав

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

Необработанное исключение и аварийное закрытие

Повторное открытие
Норма

Активизируется уже открытое окно при заданной уникальности

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

Открывается дубль окна того же документа

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

Чем отличается ОткрытьЗначение от ПоказатьЗначение?

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

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

Да. Передайте в параметрах ОткрытьФорму структуру с ключом «ТолькоПросмотр» и значением Истина — форма откроется без возможности редактирования. Альтернатива — установить свойство ТолькоПросмотр у формы в обработчике ПриСозданииНаСервере по своему условию.

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

Передайте в параметрах ОткрытьФорму для формы списка структуру с ключом «Отбор», содержащим вложенную структуру, например: Новый Структура("Отбор", Новый Структура("Ссылка", СсылкаНаДокумент)). Динамический список применит отбор автоматически.

Почему ОткрытьФорму выдаёт ошибку «Форма не найдена»?

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

Как открыть документ из расшифровки отчёта на СКД?

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

Можно ли открыть форму документа модально?

В управляемом приложении модальные окна по умолчанию запрещены. Используйте ОткрытьФорму с параметром РежимОткрытияОкна = РежимОткрытияОкнаФормы.БлокироватьОкноВладельца — это асинхронный аналог модальности, совместимый с веб-клиентом и современными требованиями платформы.

Итог

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

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