При автоматизации бизнес-процессов нередко возникает задача принудительного показа отчета пользователю в заданный час рабочего дня (например, отчет по незаполненным документам перед закрытием смены). Разберем, с какими сложностями сталкиваются разработчики при попытке решить эту задачу через регламентные задания и как правильно реализовать автовывод на клиенте в обычном приложении на примере конфигурации «Комплексная автоматизация 1.1».
Первая мысль, которая возникает у многих разработчиков, — настроить стандартное РегламентноеЗадание по расписанию и прописать в его процедуре открытие нужной формы или показ сообщения. Однако в клиент-серверном варианте работы эта схема принципиально не работает.
Проанализируем причину такого поведения платформы «1С:Предприятие»:
ЗаписьЖурналаРегистрации.Таким образом, регламентные задания предназначены исключительно для фоновой обработки данных (расчеты, выгрузки, проведение документов, рассылка отчетов по электронной почте), но не для интерактивного взаимодействия с пользователем.
Чтобы форма или отчет открылись непосредственно перед глазами пользователя, запуск должен происходить в контексте клиентского сеанса. Для этого платформа предоставляет механизм периодического выполнения процедур — метод ПодключитьОбработчикОжидания.
В режиме обычного приложения этот метод доступен в глобальном контексте, поэтому нам даже не требуется держать постоянно открытой отдельную служебную форму. Подключение таймера можно выполнить сразу при запуске сеанса пользователя.
Разберем по шагам, как настроить автоматический вывод отчета в модуле обычного приложения:
ПриНачалеРаботыСистемы подключаем периодический обработчик, который будет срабатывать, например, раз в 60 секунд.Посмотрим на пример реализации логики в модуле обычного приложения:
Перем ДатаПоследнегоЗапускаОтчета;
Процедура ПриНачалеРаботыСистемы()
// Подключаем опрос времени каждые 60 секунд
ПодключитьОбработчикОжидания("ПроверитьВремяВыводаОтчета", 60);
КонецПроцедуры
Процедура ПроверитьВремяВыводаОтчета() Экспорт
ТекущееВремя = ТекущаяДата();
// Задаем целевое время запуска (например, 17:30)
ЧасЗапуска = 17;
МинутаЗапуска = 30;
Если Час(ТекущееВремя) = ЧасЗапуска И Минута(ТекущееВремя) = МинутаЗапуска Тогда
// Проверяем, не открывали ли мы уже отчет сегодня
Если ДатаПоследнегоЗапускаОтчета = Неопределено
Или НачалоДня(ДатаПоследнегоЗапускаОтчета) <> НачалоДня(ТекущееВремя) Тогда
ДатаПоследнегоЗапускаОтчета = ТекущееВремя;
ОткрытьОтчетПользователя();
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Выясним, как программно передать параметры и открыть типовой отчет на СКД с фильтром по текущему пользователю. В конфигурации «Комплексная автоматизация 1.1» текущий пользователь определяется через ПараметрыСеанса.ТекущийПользователь.
Рассмотрим процедуру формирования и открытия отчета:
Процедура ОткрытьОтчетПользователя() Экспорт
Попытка
ТекущийПользователь = ПараметрыСеанса.ТекущийПользователь;
// Получаем объект отчета из метаданных
ИмяОтчета = "МойКонтрольныйОтчет";
ОтчетОбъект = Отчеты[ИмяОтчета].Создать();
// Настраиваем отбор в компоновщике настроек
НастройкиСКД = ОтчетОбъект.КомпоновщикНастроек.Настройки;
ПолеОтбора = Новый ПолеКомпоновкиДанных("Ответственный");
ЭлементОтбора = Неопределено;
// Ищем существующий отбор по полю или создаем новый
Для Каждого Элемент Из НастройкиСКД.Отбор.Элементы Цикл
Если Элемент.ЛевоеЗначение = ПолеОтбора Тогда
ЭлементОтбора = Элемент;
Прервать;
КонецЕсли;
КонецЦикла;
Если ЭлементОтбора = Неопределено Тогда
ЭлементОтбора = НастройкиСКД.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = ПолеОтбора;
КонецЕсли;
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = ТекущийПользователь;
ЭлементОтбора.Использование = Истина;
// Получаем и открываем форму отчета
ФормаОтчета = ОтчетОбъект.ПолучитьФорму();
ФормаОтчета.Открыть();
Исключение
// Перехватываем исключение на случай, если у пользователя открыто модальное окно
ЗаписьЖурналаРегистрации("АвтовыводОтчета", УровеньЖурналаРегистрации.Предупреждение,,,
ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
При использовании автоматического открытия окон на стороне клиента необходимо учитывать особенности интерфейса платформы «1С:Предприятие»:
Попытка ... Исключение.Если задача заключается в обязательном контроле показателей, помимо обработчика ожидания можно рассмотреть следующие варианты:
Задача на конкретного сотрудника. При появлении новой задачи типовой интерфейс конфигурации выдает встроенное оповещение на панели задач пользователя, не прерывая его текущую работу модальными окнами.ТабличныйДокумент и помещает его в специальный регистр. Клиентский обработчик в фоновом режиме проверяет регистр и моментально показывает уже готовый результат без ожидания длительного построения выборки.