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