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