При разработке управляемых форм в платформе «1С:Предприятие 8.3» разработчики часто сталкиваются с нестандартным поведением предопределенного обработчика ПередЗакрытием. Параметр ЗавершениеРаботы, который по логике и документации должен содержать булево значение (Истина или Ложь), неожиданно возвращает Неопределено. Проанализируем причину такого поведения платформы и разберем варианты решения данной задачи.
Рассмотрим типовой пример обработчика в модуле формы документа или справочника:
&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
Если ЗавершениеРаботы Тогда
// Код при закрытии всего приложения
КонецЕсли;
КонецПроцедуры
Если при вызове этого события ЗавершениеРаботы содержит Неопределено, проверка условия Если ЗавершениеРаботы Тогда вызовет ошибку несоответствия типов или отработает некорректно.
Параметры ЗавершениеРаботы и ТекстПредупреждения для события ПередЗакрытием (а также параметр ЗавершениеРаботы для события ПриЗакрытии) были добавлены разработчиками платформы, начиная с версии 8.3.8. Это нововведение было связано с реализацией новой модели интерактивного завершения работы приложения (в первую очередь для работы веб-клиента в современных браузерах).
Если в свойствах конфигурации установлен Режим совместимости с версией 8.3.7 или ниже, платформа эмулирует поведение старых версий. В этом случае, даже если в коде модуля формы объявлена сигнатура процедуры с четырьмя параметрами, платформа передает в параметр ЗавершениеРаботы значение Неопределено, так как на уровне совместимости механизм флагов завершения работы еще не поддерживается полноценно.
Если конфигурация допускает обновление режима совместимости, это наиболее правильный и системный способ устранить проблему. Разберем по шагам, как изменить эту настройку:
После изменения режима совместимости параметр ЗавершениеРаботы начнет штатно возвращать значения типа Булево:
Важно помнить об ограничениях новой модели завершения работы. Если ЗавершениеРаботы = Истина, действуют строгие правила платформы:
ПоказатьВопрос()).Отказ = Истина и заполнить строковый параметр ТекстПредупреждения. Платформа самостоятельно покажет штатное диалоговое окно с указанным текстом.Посмотрим на корректный пример использования нового механизма:
&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
Если Модифицированность Тогда
Отказ = Истина;
ТекстПредупреждения = "В документе есть несохраненные изменения. Вы действительно хотите выйти?";
КонецЕсли;
КонецПроцедуры
Если режим совместимости повышать нельзя (например, из-за зависимостей от сторонних библиотек или ограничений типовой конфигурации), рассмотрим альтернативные пути обхода:
1. Безопасная проверка значения в коде:
Вместо неявного приведения к булеву типу используем явное сравнение с конкретным значением. Это предотвратит ошибки времени выполнения, если придет Неопределено:
&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
Если ЗавершениеРаботы = Истина Тогда
// Обработка выхода из программы
Иначе
// Обычное закрытие формы или режим совместимости 8.3.7 и ниже
КонецЕсли;
КонецПроцедуры
2. Использование устаревшей сигнатуры события:
Для конфигураций с режимом совместимости 8.3.7 и ниже стандартная сигнатура обработчика содержит только два параметра:
&НаКлиенте
Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка)
// Логика проверки и подтверждения закрытия через асинхронные методы
КонецПроцедуры
Таким образом, появление значения Неопределено в параметре ЗавершениеРаботы напрямую свидетельствует о работе платформы в режиме совместимости с версиями 8.3.7 и ниже. Для полноценной поддержки логики завершения работы достаточно перевести конфигурацию на режим совместимости 8.3.8 или выше.