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