Как отловить закрытие открываемой формы в 1С:Предприятие 8.3

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В процессе разработки на платформе 1С:Предприятие 8.3 часто возникает задача не просто открыть вспомогательную форму (например, форму выбора или подбора), но и выполнить определенные действия в форме-владельце сразу после того, как вспомогательное окно будет закрыто. Это может быть обновление данных, расчет итогов или вывод оповещения пользователю. Рассмотрим подробнее, как реализовать этот механизм в управляемом приложении, разберем типичные ошибки и современные подходы.

Метод 1: Использование объекта ОписаниеОповещения (классический способ)

Для управляемых форм основным механизмом взаимодействия при закрытии окон является использование специального объекта ОписаниеОповещения. Этот объект «объясняет» системе, какую именно процедуру нужно вызвать, когда произойдет событие (в данном случае — закрытие формы).

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


&НаКлиенте
Процедура ОткрытьФормуВыбора(Команда)

    // Создаем объект оповещения, указывая имя экспортной процедуры 
    // и контекст, в котором она находится (обычно ЭтаФорма)
    Оповещение = Новый ОписаниеОповещения("ВыполнитьПослеЗакрытияФормы", ЭтаФорма);
    
    // Открываем форму, передавая оповещение в качестве одного из параметров
    // Обратите внимание на 4-й параметр метода ОткрытьФорму
    ОткрытьФорму("ОбщаяФорма.ВыбораСотрудника", , ЭтаФорма, , , , Оповещение);

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

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

    Если РезультатЗакрытия <> Неопределено Тогда
        Сообщить("Форма была закрыта с результатом: " + РезультатЗакрытия);
    Иначе
        Сообщить("Форма была закрыта крестиком или отменой.");
    КонецЕсли;

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

Важные нюансы реализации:

  1. Количество параметров: Обработчик оповещения (в нашем примере ВыполнитьПослеЗакрытияФормы) обязательно должен принимать два параметра: РезультатЗакрытия и ДополнительныеПараметры. Даже если вы не планируете их использовать, отсутствие этих параметров в объявлении процедуры приведет к ошибке при попытке вызова.
  2. Ключевое слово Экспорт: Процедура-обработчик должна быть помечена как Экспорт, иначе платформа не сможет найти её при закрытии подчиненной формы.
  3. РезультатЗакрытия: Сюда попадает то значение, которое было передано в метод Закрыть() внутри открытой формы.

Разбор типичной ошибки: Ошибка отображения типов

Часто программисты допускают ошибку, пытаясь передать объект типа Форма внутрь структуры параметров. Рассмотрим пример некорректного кода, который приводит к ошибке «Отсутствует отображение для типа ФормаКлиентскогоПриложения»:


// ОШИБОЧНЫЙ КОД
ПараметрыФорма = Новый Структура;
ПараметрыФорма.Вставить("Владелец", ЭтаФорма); // ТАК ДЕЛАТЬ НЕЛЬЗЯ
ОткрытьФорму("ОбщаяФорма.ВыбораСотрудника", ПараметрыФорма, ЭтаФорма);

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

Метод 2: Асинхронный подход (платформа 8.3.18+)

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

Проанализируем пример использования метода ОткрытьФормуАсинх:


&НаКлиенте
Асинх Процедура КомандаОткрытьАсинхронно(Команда)

    // Код "замирает" на этой строке до тех пор, пока форма не будет закрыта
    Результат = Ждать ОткрытьФормуАсинх("ОбщаяФорма.ВыбораСотрудника", , ЭтаФорма);
    
    // Следующий код выполнится только ПОСЛЕ закрытия формы
    Если Результат <> Неопределено Тогда
        Сообщить("Пользователь выбрал: " + Результат);
    КонецЕсли;

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

Преимущества асинхронного подхода:

  1. Линейность кода: Вам не нужно создавать отдельную процедуру-обработчик и помечать её как Экспорт. Вся логика сосредоточена в одном месте.
  2. Доступ к локальным переменным: Все переменные, объявленные до вызова ОткрытьФормуАсинх, доступны после закрытия формы. При использовании ОписаниеОповещения данные пришлось бы передавать через ДополнительныеПараметры.

Метод 3: Использование события ОбработкаВыбора

Если ваша задача заключается именно в получении выбранного значения (например, конкретного сотрудника из списка), стоит рассмотреть стандартный механизм выбора. Посмотрим на шаги реализации:

  1. При открытии формы укажите владельца (ЭтаФорма).
  2. В вызываемой форме при выборе значения используйте метод ОповеститьОВыборе(Значение).
  3. В форме-владельце создайте обработчик события ОбработкаВыбора.

Этот метод хорош тем, что он является наиболее «родным» для платформы 1С при работе со ссылочными типами данных и подборами.

События внутри самой открываемой формы

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

Резюме

Выбор метода зависит от ваших технических условий. Для конфигураций на старых режимах совместимости (например, многие версии УТ 11.4 или БП 3.0 на старых релизах) единственным надежным вариантом остается ОписаниеОповещения. Если же вы работаете с актуальной версией платформы 8.3.18 и выше, рекомендуем переходить на ОткрытьФормуАсинх, так как это значительно упрощает поддержку и чтение программного кода.

Помните о правильной передаче параметров в процедуру оповещения и избегайте попыток передачи объектов форм в структурах параметров — это сэкономит вам время на отладку ошибок типизации.

← На главную