Как исправить ошибку «Серверные вызовы при завершении работы запрещены» в расширении 1С?

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

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

Причина возникновения ошибки при завершении работы

Рассмотрим подробнее, почему возникают подобные ограничения. При отключении режима совместимости вступают в силу новые стандарты работы клиентского приложения, введенные платформой начиная с версии 8.3.8.

В этой модели платформенно введен полный запрет на выполнение любых серверных вызовов (с аннотациями &НаСервере и &НаСервереБезКонтекста) в обработчиках событий выхода из программы:

  1. События модуля управляемого приложения: ПередЗавершениемРаботыСистемы и ПриЗавершенииРаботыСистемы.
  2. События управляемой формы: ПередЗакрытием и ПриЗакрытии, если закрытие формы происходит в процессе завершения сеанса работы приложения.

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

Особенности работы расширений и отладки

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

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

Способы решения проблемы

Разберем по шагам основные подходы к устранению ошибки без нарушения правил архитектуры платформы 1С.

Способ 1. Использование обработчика ожидания (рекомендуемый подход)

Наиболее надежным решением для выполнения серверной логики при выходе из системы является схема с временным отказом от закрытия и подключением обработчика ожидания.

Рассмотрим алгоритм реализации:

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

Посмотрим на пример реализации данного шаблона:


&НаКлиенте
Перем РазрешеноЗавершение;

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

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

&НаКлиенте
Процедура ОбработчикЗавершенияНаСервере()
    
    // Выполняем необходимый серверный вызов
    ВыполнитьСохранениеНаСервере();
    
    РазрешеноЗавершение = Истина;
    ЗавершитьРаботуСистемы(Ложь);

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

Способ 2. Предварительная загрузка и кэширование данных

Если серверный вызов при закрытии формы требуется только для чтения данных, следует перенести эту логику на момент открытия формы (события ПриСозданииНаСервере или ПриОткрытии). В таком случае все необходимые данные будут заблаговременно сохранены в клиентских переменных, и необходимость обращения к серверу при выходе отпадет.

Способ 3. Сохранение данных в момент их изменения

При необходимости сохранения пользовательских настроек или состояния формы рекомендуется выполнять запись на сервер сразу в момент совершения действия пользователем, не откладывая процедуру сохранения до момента закрытия приложения.

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

← На главную