Почему параметр ЗавершениеРаботы в событии формы ПередЗакрытием принимает значение Неопределено?

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

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

Рассмотрим типовой пример обработчика в модуле формы документа или справочника:


&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
    
    Если ЗавершениеРаботы Тогда
        // Код при закрытии всего приложения
    КонецЕсли;

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

Если при вызове этого события ЗавершениеРаботы содержит Неопределено, проверка условия Если ЗавершениеРаботы Тогда вызовет ошибку несоответствия типов или отработает некорректно.

Выясним причину поведения платформы

Параметры ЗавершениеРаботы и ТекстПредупреждения для события ПередЗакрытием (а также параметр ЗавершениеРаботы для события ПриЗакрытии) были добавлены разработчиками платформы, начиная с версии 8.3.8. Это нововведение было связано с реализацией новой модели интерактивного завершения работы приложения (в первую очередь для работы веб-клиента в современных браузерах).

Если в свойствах конфигурации установлен Режим совместимости с версией 8.3.7 или ниже, платформа эмулирует поведение старых версий. В этом случае, даже если в коде модуля формы объявлена сигнатура процедуры с четырьмя параметрами, платформа передает в параметр ЗавершениеРаботы значение Неопределено, так как на уровне совместимости механизм флагов завершения работы еще не поддерживается полноценно.

Способ 1. Повышение режима совместимости конфигурации (рекомендуемый)

Если конфигурация допускает обновление режима совместимости, это наиболее правильный и системный способ устранить проблему. Разберем по шагам, как изменить эту настройку:

  1. Откроем дерево метаданных в конфигураторе.
  2. Выделим корневой элемент конфигурации, нажмем правую кнопку мыши и перейдем в пункт Свойства.
  3. В палитре свойств найдем раздел Совместимость и параметр Режим совместимости.
  4. Установим значение Версия 8.3.8 или выше (либо выберем Не использовать, если конфигурация готова к работе на актуальной версии платформы).
  5. Сохраним и обновим конфигурацию базы данных.

После изменения режима совместимости параметр ЗавершениеРаботы начнет штатно возвращать значения типа Булево:

  1. Истина — происходит полное закрытие сеанса или приложения «1С:Предприятие».
  2. Ложь — пользователь закрывает только текущее окно или форму.

Особенности работы с ЗавершениеРаботы в режиме 8.3.8 и выше

Важно помнить об ограничениях новой модели завершения работы. Если ЗавершениеРаботы = Истина, действуют строгие правила платформы:

  1. Запрет серверных вызовов: в момент завершения работы нельзя вызывать серверные процедуры и функции из клиентских обработчиков.
  2. Запрет модальных и диалоговых окон: нельзя вызывать методы открытия окон (включая немодальные методы вроде ПоказатьВопрос()).
  3. Отмена закрытия: чтобы предупредить пользователя о несохраненных данных или отменить выход, необходимо установить флаг Отказ = Истина и заполнить строковый параметр ТекстПредупреждения. Платформа самостоятельно покажет штатное диалоговое окно с указанным текстом.

Посмотрим на корректный пример использования нового механизма:


&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
    
    Если Модифицированность Тогда
        Отказ = Истина;
        ТекстПредупреждения = "В документе есть несохраненные изменения. Вы действительно хотите выйти?";
    КонецЕсли;

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

Способ 2. Решение проблемы без изменения режима совместимости

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

1. Безопасная проверка значения в коде:

Вместо неявного приведения к булеву типу используем явное сравнение с конкретным значением. Это предотвратит ошибки времени выполнения, если придет Неопределено:


&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
    
    Если ЗавершениеРаботы = Истина Тогда
        // Обработка выхода из программы
    Иначе
        // Обычное закрытие формы или режим совместимости 8.3.7 и ниже
    КонецЕсли;

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

2. Использование устаревшей сигнатуры события:

Для конфигураций с режимом совместимости 8.3.7 и ниже стандартная сигнатура обработчика содержит только два параметра:


&НаКлиенте
Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка)
    
    // Логика проверки и подтверждения закрытия через асинхронные методы
    
КонецПроцедуры

Таким образом, появление значения Неопределено в параметре ЗавершениеРаботы напрямую свидетельствует о работе платформы в режиме совместимости с версиями 8.3.7 и ниже. Для полноценной поддержки логики завершения работы достаточно перевести конфигурацию на режим совместимости 8.3.8 или выше.

← На главную