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