Как выполнить процедуру на сервере при завершении работы 1С и настроить систему напоминаний?

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

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

Почему серверные вызовы запрещены при завершении работы?

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

Решение задачи: выполнение процедур после завершения сеанса

Вместо того чтобы «мучить» систему попытками выполнения кода в момент закрытия, мы применим более надежные серверные механизмы. Разберем пошагово, как автоматизировать этот процесс.

  1. Использование регламентных заданий. Это лучший инструмент для фоновой обработки данных. Вместо выполнения кода «здесь и сейчас», мы поручаем серверу проверять состояние документов по расписанию.
  2. Механизм «хвостов». Если задача заключается в закрытии документов, создайте регламентное задание, которое раз в 5-10 минут будет сканировать базу на предмет документов с определенным статусом.

Рассмотрим пример того, как может выглядеть логика регламентного задания, которое заменяет событийную модель:


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

Этот метод гарантирует, что даже если пользователь просто «убил» процесс 1С, сервер рано или поздно найдет и закроет корректно все зависшие документы.

Настройка назойливых напоминаний для пользователей

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

1. Серверные оповещения через БСП

Современные версии Библиотеки Стандартных Подсистем (БСП) позволяют рассылать сообщения с сервера на клиент. Это позволяет избежать конфликтов интерфейса. Вы можете использовать процедуру ОбщегоНазначенияПереопределяемый.ПриДобавленииСерверныхОповещений для организации рассылки уведомлений пользователям в указанное время.

2. Использование управляемой формы с блокировкой интерфейса

Для создания действительно «назойливого» напоминания, которое нельзя проигнорировать, мы можем применить метод ПодключитьОбработчикОжидания. При наступлении нужного времени (например, 17:00) вызывается форма, у которой свойство РежимОткрытияОкна установлено в значение БлокироватьВесьИнтерфейс. Пользователь не сможет продолжать работу, пока не нажмет кнопку «Закрыть» на этой форме.

3. Программная блокировка соединений

Если задача стоит жестко — ограничить работу пользователей в вечернее время — используйте штатный механизм блокировки соединений. Программно через методы объекта АдминистрированиеСервера1СПредприятия вы можете установить блокировку базы данных с заданным сообщением и временем начала действия. Это наиболее профессиональный способ управления сеансами, не требующий написания «костыльных» обработок.

Резюме: Не пытайтесь перехитрить платформу, пытаясь выполнить серверный код при закрытии программы. Используйте регламентные задания для очистки данных и штатные механизмы БСП для оповещения пользователей. Это сделает вашу систему устойчивой к сбоям и предсказуемой в работе.

← На главную