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

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

Как открыть форму документа из обработки 1С

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

Открытие формы документа из внешней обработки — одна из самых частых задач при доработке 1С. Обработка может подбирать документы по отбору, создавать новые документы по данным из файла или просто служить «пультом» для быстрого доступа к нужным объектам. Во всех этих сценариях разработчику нужно программно показать пользователю форму конкретного документа.

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

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

Как определить, какой способ открытия использовать

Первый шаг — понять, в каком режиме запускается конфигурация. Откройте свойства корня конфигурации в конфигураторе и посмотрите параметр «Режим использования модальности» и «Основной режим запуска». Большинство современных конфигураций (УТ 11, ERP, БП 3.0, ЗУП 3.1) работают только в управляемом приложении, и код для обычных форм там не выполнится.

Программно режим можно проверить так:

Если ТекущийРежимЗапуска() = РежимЗапускаКлиентскогоПриложения.УправляемоеПриложение Тогда

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

Иначе

// ПолучитьФорму().Открыть()

КонецЕсли;

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

Маршрут решения

Как выбрать способ открытия

Конфигурация работает в управляемом приложении (тонкий/веб-клиент)Используйте ОткрытьФорму() с параметром Ключ или ОткрытьЗначение()
Конфигурация в обычном приложении (толстый клиент)Используйте ПолучитьФорму() у объекта или ОткрытьЗначение()
Нужно открыть новый документ с предзаполнениемПередайте в ОткрытьФорму параметр ЗначенияЗаполнения или Основание
Нужно дождаться закрытия формы и получить результатИспользуйте ОткрытьФорму с описанием оповещения (ОписаниеОповещения)

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

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

&НаКлиенте

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

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

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

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

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

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

Есть и более короткий вариант — метод ОткрытьЗначение(). Он открывает объект в его стандартной форме, не требуя указывать имя формы:

&НаКлиенте

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

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

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

Разница принципиальна: ОткрытьЗначение() не позволяет передать дополнительные параметры и описание оповещения о закрытии. Если нужна обратная связь от открываемой формы — используйте только ОткрытьФорму().

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

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

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

&НаКлиенте

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

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

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

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

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

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

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

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

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

Альтернатива — параметр Основание, который имитирует ввод на основании:

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

ПараметрыФормы.Вставить("Основание", СсылкаНаЗаказКлиента);

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

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

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

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

&НаКлиенте

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

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

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

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

ПараметрыФормы, ЭтотОбъект, , , , Оповещение);

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

&НаКлиенте

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

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

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

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

Третий параметр ОткрытьФорму() — владелец формы. Если передать ЭтотОбъект (форму обработки), открытая форма документа не сможет быть открыта повторно в том же экземпляре, а при закрытии обработки закроется и она. Это удобно для логически связанных окон.

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

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

В обычных формах (толстый клиент, старые конфигурации вроде УТ 10.3, УПП 1.3) синтаксис другой. Форму получают у объекта документа:

ДокументОбъект = СсылкаНаДокумент.ПолучитьОбъект();

ФормаДокумента = ДокументОбъект.ПолучитьФорму("ФормаДокумента");

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

Для нового документа объект сначала создают:

НовыйДокумент = Документы.РеализацияТоваровУслуг.СоздатьДокумент();

НовыйДокумент.Дата = ТекущаяДата();

ФормаДокумента = НовыйДокумент.ПолучитьФорму();

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

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

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

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

ОткрытьФорму() с параметром Ключ

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

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

Самый простой вызов по ссылке, работает в обоих режимах. Нельзя передать параметры и оповещение

ПолучитьФорму().Открыть()

Гибкий доступ к форме и её реквизитам до открытия. Только обычное приложение

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

Блокирует работу до закрытия. Требует разрешённого режима модальности, в типовых управляемых конфигурациях обычно запрещён

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

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

&НаКлиенте

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

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

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

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

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

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

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

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

Типичные ошибки и их диагностика

Самая частая проблема — форма открывается пустой, как форма нового документа. Причина почти всегда в том, что в параметре Ключ передана пустая ссылка или переменная вообще не заполнена. Перед вызовом проверяйте ссылку:

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

Сообщить("Документ не выбран");

Возврат;

КонецЕсли;

Вторая типовая ошибка — неправильное имя формы. Опечатка в имени документа или указание ФормаОбъекта, когда у документа переопределена основная форма с другим именем, приводит к ошибке «Ошибка отображения формы» или открытию сгенерированной формы без нужных элементов. Точное имя смотрите в конфигураторе в ветке документа, раздел «Формы».

Третья группа проблем — контекст вызова. ОткрытьФорму() и ОткрытьЗначение() доступны только на клиенте. Если код написан в серверной процедуре (директива &НаСервере), он не выполнится. Открытие формы всегда делайте в клиентских процедурах, а получение ссылки — на сервере, с передачей результата на клиент.

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

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

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

Отдельно проверьте права: если у пользователя нет права «Просмотр» на документ, форма не откроется, и пользователь получит сообщение о нарушении прав. Это нормальное поведение, но в обработке стоит перехватывать такую ситуацию понятным сообщением.

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

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

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

Открывается с данными выбранного документа: номер, дата, табличные части

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

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

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

Поля организации, контрагента и др. заполнены переданными значениями

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

Поля пустые — обработчик ОбработкаЗаполнения не использует переданные данные

Оповещение о закрытии
Норма

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

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

Ничего не происходит — проверьте имя процедуры в ОписаниеОповещения и директиву Экспорт

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

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

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

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

Нет. Фоновые задания выполняются на сервере без пользовательского интерфейса, интерактивные методы там недоступны. Фоновое задание может вернуть результат (например, ссылку на созданный документ) в вызывающий сеанс, а открытие формы выполняется на клиенте после получения этого результата.

Почему ОткрытьЗначение не срабатывает в веб-клиенте?

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

Как открыть документ в режиме «только просмотр»?

Передайте в параметрах ОткрытьФорму структуру с ключом ТолькоПросмотр и значением Истина. Форма откроется в режиме, где редактирование и запись недоступны. Это удобно, когда обработка используется для просмотра связанных документов без риска случайного изменения.

Чем отличается открытие формы документа из обработки в тонком и толстом клиенте?

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

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

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

Итог

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

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