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














































