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