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

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

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

Как программно открыть форму документа в 1С 8.3: ОткрытьФорму, ОткрытьЗначение, ПоказатьЗначение, параметры формы, открытие нового и существующего документа.

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

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

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

Открытие формы существующего документа через ОткрытьФорму

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

&НаКлиенте

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

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

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

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

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

Имя формы строится по шаблону: Документ.<ИмяДокумента>.ФормаОбъекта. Если в конфигурации создана своя форма документа, укажите её имя вместо ФормаОбъекта, например Документ.ЗаказПокупателя.Форма.ФормаДокумента.

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

Быстрое открытие через ОткрытьЗначение и ПоказатьЗначение

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

&НаКлиенте

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

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

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

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

&НаКлиенте

Процедура ПоказатьДокументАсинхронно(Команда)

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

ПоказатьЗначение(Оповещение, ДокументСсылка);

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

&НаКлиенте

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

// Действия после закрытия формы документа

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

Сравнение методов открытия

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

Максимальная гибкость: параметры, владелец, уникальность. Подходит для новых документов и нестандартных форм.

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

Самый короткий код для существующей ссылки. Не позволяет передать параметры формы.

ПоказатьЗначение

Асинхронный вариант ОткрытьЗначение. Рекомендуется для веб-клиента и режима без модальности.

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

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

&НаКлиенте

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

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

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

Часто новый документ нужно предзаполнить — например, создать реализацию на основании заказа. Для этого в параметры передаётся структура ЗначенияЗаполнения или ключ Основание:

&НаКлиенте

Процедура СоздатьНаОсновании(Команда)

ЗначенияЗаполнения = Новый Структура;

ЗначенияЗаполнения.Вставить("Организация", ТекущаяОрганизация);

ЗначенияЗаполнения.Вставить("Склад", ОсновнойСклад);

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

ПараметрыФормы.Вставить("ЗначенияЗаполнения", ЗначенияЗаполнения);

ОткрытьФорму("Документ.ПеремещениеТоваров.ФормаОбъекта", ПараметрыФормы);

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

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

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

Для открытия списка используется имя формы Документ.<Имя>.ФормаСписка. Через параметр Отбор передаётся структура отбора по реквизитам документа.

&НаКлиенте

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

Отбор = Новый Структура;

Отбор.Вставить("Контрагент", ВыбранныйКонтрагент);

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

ПараметрыФормы.Вставить("Отбор", Отбор);

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

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

Отбор применяется к динамическому списку формы и отображается пользователю, поэтому он может его снять. Если нужен жёсткий запрет на просмотр чужих данных, используйте RLS или параметризуемые запросы, а не только отбор формы.

Модальное и блокирующее открытие формы

Иногда требуется, чтобы пользователь не мог продолжить работу, пока не закроет форму документа. Для этого у формы есть режим открытия окна БлокироватьОкноВладельца или БлокироватьВесьИнтерфейс.

&НаКлиенте

Процедура ОткрытьБлокирующе(Команда)

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

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

ПараметрыФормы, ЭтотОбъект, , , , ,

РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);

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

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

Порядок действий для типовой задачи
  1. 1
    Определите, что открываете: существующий документ, новый или список
  2. 2
    Сформируйте структуру параметров: Ключ, ЗначенияЗаполнения или Отбор
  3. 3
    Разместите вызов ОткрытьФорму в клиентской процедуре
  4. 4
    Укажите корректное полное имя формы по шаблону Документ.Имя.ФормаОбъекта
  5. 5
    Проверьте открытие в тонком и веб-клиенте под целевым пользователем

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

Частая ошибка начинающих разработчиков — попытка вызвать ОткрытьФорму() в серверной процедуре. Интерактивные действия доступны только на клиенте, поэтому такой код завершится ошибкой «Интерактивные операции недоступны».

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

&НаКлиенте

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

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

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

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

Возврат;

КонецЕсли;

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

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

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

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

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

"ВЫБРАТЬ ПЕРВЫЕ 1 Ссылка

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

|ГДЕ Номер = &Номер");

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

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

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

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

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

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

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

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

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

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

Открытие существующего документа
Норма

Форма открылась, реквизиты соответствуют ссылке

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

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

Открытие нового документа
Норма

Форма с незаполненным номером, статус не записан

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

Ошибка прав — у пользователя нет права Добавление

Отбор в списке
Норма

Список показывает только нужные документы, отбор виден пользователю

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

Полный список — имя поля отбора не совпадает с реквизитом

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

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

Передайте в ОткрытьФорму описание оповещения: Оповещение = Новый ОписаниеОповещения("ПослеЗакрытия", ЭтотОбъект). После закрытия формы платформа вызовет указанную процедуру и передаст результат, который форма вернула через Закрыть(Результат).

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

Нет. Фоновые задания выполняются на сервере и не имеют доступа к интерфейсу. Решение — сохранить результат в регистре или параметре сеанса, а клиентскую форму открыть после завершения задания через ожидание завершения длительной операции.

Как открыть документ, зная только его номер?

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

Что делать, если ОткрытьФорму открывает новый документ вместо существующего?

Проверьте, что в параметрах передана структура с ключом именно «Ключ» и что значение ключа — непустая ссылка нужного типа. Если ссылка Неопределено или другого типа, платформа откроет форму нового объекта без ошибки.

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

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

Итог

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

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