Как автоматически открыть форму задачи у пользователя при ее создании регламентным заданием

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

При проектировании бизнес-процессов и механизмов контроля задач в платформе 1С:Предприятие часто возникает задача: регламентное задание на сервере формирует новые задачи сотрудникам, и требуется, чтобы у конкретного пользователя в активном сеансе сразу открылась форма назначенной задачи.

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

В чем заключается архитектурная сложность

Регламентные и фоновые задания выполняются в изолированном серверном сеансе. В этом контексте полностью отсутствует графический интерфейс пользователя (GUI). Сервер не может напрямую вызвать методы управления формами конкретного клиентского приложения, так как не имеет прямого канала управления окнами пользователя.

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

Способ 1. Использование клиентского обработчика ожидания

Рассмотрим классический и наиболее распространенный вариант решения — периодический опрос базы данных клиентским приложением с помощью метода ПодключитьОбработчикОжидания().

Разберем реализацию по шагам:

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

Посмотрим на пример инициализации обработчика ожидания в модуле управляемого приложения:


Процедура ПриНачалеРаботыСистемы()
    // Подключаем опрос с интервалом в 60 секунд
    ПодключитьОбработчикОжидания("ПроверитьНаличиеНовыхЗадач", 60);
КонецПроцедуры

Теперь реализуем сам клиентский метод и серверную функцию получения списка задач:


&НаКлиенте
Процедура ПроверитьНаличиеНовыхЗадач() Экспорт
    МассивНовыхЗадач = ПолучитьНевыполненныеЗадачиСервер();
    
    Для Каждого СсылкаНаЗадачу Из МассивНовыхЗадач Цикл
        ПараметрыОткрытия = Новый Структура("Ключ", СсылкаНаЗадачу);
        ОткрытьФорму("Задача.ЗадачаИсполнителя.ФормаОбъекта", ПараметрыОткрытия);
    КонецЦикла;
КонецПроцедуры

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

Обратите внимание на важные детали этой реализации:

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

Способ 2. Push-оповещения через Систему взаимодействия

Проанализируем современный механизм платформы 1С:Предприятие 8.3, который исключает постоянный периодический опрос базы с клиента — использование Системы взаимодействия.

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

На стороне клиента в процедуре-обработчике ОбработкаПолученияСообщенияПользователя модуль перехватывает входящее системное событие и выполняет переход или открытие формы:


&НаКлиенте
Процедура ОбработкаПолученияСообщенияПользователя(Сообщение)
    // Проверяем наличие навигационной ссылки в контексте сообщения
    Если Не ПустаяСтрока(Сообщение.НавигационнаяСсылка) Тогда
        ПерейтиПоНавигационнойСсылке(Сообщение.НавигационнаяСсылка);
    КонецЕсли;
КонецПроцедуры

Этот способ является более гибким и не нагружает сервер периодическими серверными вызовами из клиентских сеансов.

Способ 3. Механизмы Библиотеки стандартных подсистем (БСП)

Если конфигурация разработана на базе типовых решений или использует БСП (например, 1С:ЗУП, 1С:ERP, 1С:УТ), то в конфигурации уже присутствуют готовые подсистемы работы с задачами и напоминаниями:

  1. Подсистема «Напоминания пользователей»: Регламентное задание может сформировать запись в регистре сведений НапоминанияПользователей. Стандартный механизм БСП сам отработает наступление времени события и покажет окно напоминаний.
  2. Метод ПоказатьОповещениеПользователя(): Вместо принудительного открытия модальных или блокирующих форм поверх экрана пользователя (что может мешать текущему вводу данных) рекомендуется выводить всплывающее системное оповещение со ссылкой на созданный объект.

Особенности работы в различных режимах

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

  1. Веб-клиент: Браузеры блокируют неинициированное пользователем открытие новых окон (Pop-up blockers). Поэтому автоматическое открытие множества форм из фонового таймера в веб-клиенте может блокироваться политиками безопасности браузера. В веб-клиенте предпочтительнее использовать вывод оповещений или обновление динамических списков на рабочем столе.
  2. Файловый режим: В файловых информационных базах регламентные задания запускаются автоматически только при наличии активного сеанса с включенным планировщиком (методом ВыполнитьОбработкуЗаданий()). В клиент-серверном режиме заданиями управляет кластер серверов 1С:Предприятия.
← На главную