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