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

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

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

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

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

Ключевой момент — правильно сформировать имя формы и набор параметров. Для документа стандартное имя формы выглядит как Документ.<ИмяДокумента>.Форма.ФормаДокумента, а ссылка на объект передаётся через параметр Ключ. Ошибка в имени метаданных или в типе параметра — самая частая причина, по которой форма не открывается или открывается пустой.

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

Как устроено открытие управляемых форм в 1С

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

Имя формы строится по шаблону: Документ.<Имя>.Форма.<ИмяФормы>. Если у документа назначена основная форма, достаточно указать Документ.<Имя>.ФормаОбъекта — платформа подставит форму, заданную в конфигураторе как основную. Это устойчивее к переименованию форм при доработках.

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

Самый частый сценарий — показать пользователю карточку уже записанного документа. Ссылка передаётся в структуре параметров с ключом Ключ:

&НаКлиенте

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

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

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

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

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

Альтернатива без явного указания формы — метод ПоказатьЗначение(, СсылкаНаДокумент). Он открывает объект в его основной форме и корректно работает в тонком и веб-клиенте. Этот способ удобен, когда тип объекта заранее неизвестен (например, ссылка произвольного типа из отчёта).

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

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

Чтобы открыть форму создания документа, параметр Ключ просто не передаётся — платформа создаст новый объект. Для предзаполнения реквизитов используется параметр ЗначенияЗаполнения — структура, где имена совпадают с именами реквизитов документа:

&НаКлиенте

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

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

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

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

ПараметрыФормы = Новый Структура("ЗначенияЗаполнения", ЗначенияЗаполнения);

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

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

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

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

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

Отбор = Новый Структура("Контрагент", ВыбранныйКонтрагент);

ПараметрыФормы = Новый Структура("Отбор", Отбор);

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

Форма выбора открывается с параметром РежимВыбора = Истина. В немодальном режиме результат выбора возвращается через описание оповещения — процедуру, которая будет вызвана при закрытии формы:

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

ПараметрыФормы = Новый Структура("РежимВыбора", Истина);

ОткрытьФорму("Документ.ЗаказПокупателя.ФормаВыбора", ПараметрыФормы, ЭтотОбъект, , , , Оповещение);

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

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

В современных версиях платформы модальный режим по умолчанию запрещён (свойство конфигурации «Режим использования модальности»), поэтому метод ОткрытьФормуМодально() часто недоступен. Вместо него используют параметр РежимОткрытияОкна = РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс в сочетании с оповещением о закрытии:

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

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

ОткрытьФорму("Документ.ПриходныйКассовыйОрдер.ФормаОбъекта", ПараметрыФормы, , , , , Оповещение,

РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс);

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

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

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

Универсальный способ: полный контроль над формой, параметрами и оповещениями. Требует точного имени формы.

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

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

ОткрытьФормуМодально()

Возвращает результат напрямую, но запрещён при отключённой модальности и не работает в веб-клиенте. Применять только в унаследованных решениях.

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

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

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

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

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

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

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

Форма пустая или открывается создание нового документа — параметр Ключ не передан или имеет неверный тип

Заполнение нового документа
Норма

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

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

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

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

Список отфильтрован по заданному условию

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

Отбор виден в панели, но не применён — поле отбора недоступно или имя указано с ошибкой

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

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

Практические рекомендации

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

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

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

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

Как открыть форму документа из модуля объекта или менеджера?

Напрямую — никак: ОткрытьФорму доступен только на клиенте. Из серверного кода верните ссылку или структуру параметров в вызывающую клиентскую процедуру и откройте форму там. Либо используйте интерактивное действие пользователя как точку входа.

Как передать в открываемую форму произвольные данные?

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

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

Передайте параметр ТолькоПросмотр = Истина: ОткрытьФорму("Документ.Имя.ФормаОбъекта", Новый Структура("Ключ", Ссылка, "ТолькоПросмотр", Истина)). Форма откроется в режиме чтения, кнопки записи будут недоступны.

Почему ОткрытьФорму работает в толстом клиенте, но падает в тонком?

Чаще всего в коде используется модальный вызов, обращение к несуществующей в тонком клиенте функциональности или серверный контекст без директив компиляции. Проверьте директивы &НаКлиенте/&НаСервере и замените модальные вызовы на оповещения.

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

Передайте в ОткрытьФорму объект ОписаниеОповещения с именем клиентской процедуры. В открываемой форме верните значение через Закрыть(Результат) или ОповеститьОВыборе(Значение). Процедура-обработчик получит это значение первым параметром.

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

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

Итог

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

Управляемую форму документа открывают через ОткрытьФорму с именем вида Документ.<Имя>.ФормаОбъекта. Существующий документ передают в параметре Ключ, новый заполняют через ЗначенияЗаполнения или Основание, результат закрытия получают через ОписаниеОповещения. Код размещают только на клиенте, а модальные вызовы заменяют блокирующим режимом окна.