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