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