Как автоматически открыть отчет пользователю в определенное время в 1С

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

При автоматизации бизнес-процессов нередко возникает задача принудительного показа отчета пользователю в заданный час рабочего дня (например, отчет по незаполненным документам перед закрытием смены). Разберем, с какими сложностями сталкиваются разработчики при попытке решить эту задачу через регламентные задания и как правильно реализовать автовывод на клиенте в обычном приложении на примере конфигурации «Комплексная автоматизация 1.1».

Почему регламентное задание не может вывести форму или отчет на экран

Первая мысль, которая возникает у многих разработчиков, — настроить стандартное РегламентноеЗадание по расписанию и прописать в его процедуре открытие нужной формы или показ сообщения. Однако в клиент-серверном варианте работы эта схема принципиально не работает.

Проанализируем причину такого поведения платформы «1С:Предприятие»:

  1. Разделение клиентского и серверного контекстов. Регламентные задания выполняются в фоновом потоке на сервере «1С:Предприятия». На сервере отсутствует графическая подсистема операционной системы, нет понятия визуального интерфейса и окон.
  2. Отсутствие клиентского сеанса. Процедура регламентного задания не привязана к конкретному рабочему столу или монитору пользователя. На сервере невозможно использовать методы открытия форм, показ диалоговых окон или методы вывода предупреждений — обращение к объектам интерфейса вызовет ошибку выполнения.
  3. Тестирование сообщений. Вызовы методов отображения сообщений в коде фонового задания либо игнорируются, либо вызывают исключения. Для отладки работы серверных фоновых процедур следует использовать запись в журнал регистрации через метод ЗаписьЖурналаРегистрации.

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

Решение: использование обработчика ожидания на клиенте

Чтобы форма или отчет открылись непосредственно перед глазами пользователя, запуск должен происходить в контексте клиентского сеанса. Для этого платформа предоставляет механизм периодического выполнения процедур — метод ПодключитьОбработчикОжидания.

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

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

  1. В процедуре ПриНачалеРаботыСистемы подключаем периодический обработчик, который будет срабатывать, например, раз в 60 секунд.
  2. В вызванной процедуре проверяем текущее системное время.
  3. Убеждаемся, что отчет еще не выводился за текущие сутки, чтобы избежать зацикленного открытия каждую минуту.
  4. Формируем и открываем отчет с отбором по текущему пользователю.

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


Перем ДатаПоследнегоЗапускаОтчета;

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

Процедура ПроверитьВремяВыводаОтчета() Экспорт
    ТекущееВремя = ТекущаяДата();
    
    // Задаем целевое время запуска (например, 17:30)
    ЧасЗапуска = 17;
    МинутаЗапуска = 30;
    
    Если Час(ТекущееВремя) = ЧасЗапуска И Минута(ТекущееВремя) = МинутаЗапуска Тогда
        // Проверяем, не открывали ли мы уже отчет сегодня
        Если ДатаПоследнегоЗапускаОтчета = Неопределено 
            Или НачалоДня(ДатаПоследнегоЗапускаОтчета) <> НачалоДня(ТекущееВремя) Тогда
            
            ДатаПоследнегоЗапускаОтчета = ТекущееВремя;
            ОткрытьОтчетПользователя();
            
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

Программное открытие отчета с отбором по текущему пользователю

Выясним, как программно передать параметры и открыть типовой отчет на СКД с фильтром по текущему пользователю. В конфигурации «Комплексная автоматизация 1.1» текущий пользователь определяется через ПараметрыСеанса.ТекущийПользователь.

Рассмотрим процедуру формирования и открытия отчета:


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

Подводные камни и важные особенности реализации

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

  1. Модальные диалоговые окна. Если в момент срабатывания обработчика у пользователя открыто модальное окно (предупреждение, подтверждение закрытия, запрос ввода данных), платформа заблокирует открытие новых окон и сгенерирует исключение. Обязательно оборачивайте логику открытия в блок Попытка ... Исключение.
  2. Срыв пользовательского ввода. Внезапное открытие тяжелой формы перехватывает фокус ввода. Если в этот момент оператор вводил данные сканером штрихкодов или печатал текст в табличной части, ввод будет сбит. Чтобы минимизировать неудобства, вместо распахивания формы отчета можно выводить небольшую панель оповещения или задачу, по клику на которую пользователь сам откроет готовый отчет.
  3. Пиковая нагрузка на серверную базу. Если время срабатывания жестко зафиксировано (например, строго в 18:00 у всех 50 сотрудников), СУБД получит единовременный шквал одинаковых тяжелых запросов. Добавьте к целевому времени случайную задержку (рандомизацию в пределах 1–5 минут) для равномерного распределения нагрузки.

Альтернативные варианты

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

  1. Использование механизма задач пользователя. Регламентное задание на сервере создает объект Задача на конкретного сотрудника. При появлении новой задачи типовой интерфейс конфигурации выдает встроенное оповещение на панели задач пользователя, не прерывая его текущую работу модальными окнами.
  2. Фоновое формирование и сохранение. Регламентное задание формирует отчет на сервере, сохраняет результат в ТабличныйДокумент и помещает его в специальный регистр. Клиентский обработчик в фоновом режиме проверяет регистр и моментально показывает уже готовый результат без ожидания длительного построения выборки.
  3. Рассылка отчетов. Если интерактивное нахождение в базе не требуется, оптимальным типовым решением остается фоновая рассылка сформированного отчета на корпоративную почту пользователя средствами подсистемы БСП.
← На главную