Напомнить, все!

15 17

Когда пользователь создает задачи, он как минимум надеется на то, что они будут выполнены, и как максимум -  это будет сделано в срок. И DIRECTUM вроде бы предоставляет все возможности для контроля исполнительской дисциплины. Так ли это?

Как вы знаете, в системе DIRECTUM есть множество инструментов в помощь пользователям, чтобы не было просроченных заданий и незавершенных задач. Есть соответствующие напоминания, поиски («Мои входящие незавершенные задания», «Мои исходящие незавершенные задачи»), отчеты («Просроченные задания», «Сводная таблица по выполнению заданий» и др. в компоненте Отчеты «DIRECTUM».), оповещения о новых заданиях приходит по электронной почте.

Несмотря на такой мощный арсенал средств оповещений и напоминаний, пользователям все-таки «удается» забыть о каких то своих заданиях, знаю из своего опыта. И вот почему:

  1. Не все пользователи держат проводник DIRECTUM открытым, особенно когда количество пользователей системы больше числа лицензий. Соответственно напоминаний системы они не увидят.
  2. Сотрудники, на которых настроено замещение в системе DIRECTUM могут не знать или забыть о заданиях, сотрудников, которых они замещают (далее, «замещаемых»):
  • для них не показываются напоминания о заданиях замещаемых;
  • если в Outlook не настроена переадресация входящих писем (это может быть по разным причинам), они не узнают о новых заданиях замещаемых.

Именно по этим причинам, для одной компании «N» я доработала сценарий «Агент рассылки входящих заданий» и написала новый сценарий «Агент рассылки уведомлений об истечении сроков заданий».

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

Сценарий «Агент рассылки уведомлений об истечении сроков заданий», ищет задания, срок которых истекает на следующий рабочий день (по требованию заказчика) и отправляет уведомления об этом исполнителям.

Как работает сценарий:

  1. Ищет для каждого пользователя системы задания, срок выполнения которых истекает на следующий рабочий день.
  2. Проверяет, настроено ли замещение для текущего пользователя (учитывается только полное замещение, сроки начала и окончания). Если да, то уведомление вместо исполнителя задания получит его заместитель (Рис. 2).
  3. В теме уведомления указывается ФИО исполнителя задания; во вложении будут размещены ссылки на задания (Рис. 1, Рис. 2).
  4. Рассылает созданные уведомления. После отработки сценария «Агент рассылки входящих заданий» нужные сотрудники получат письма по электронной почте Outlook.

Если в организации используется такой сценарий, то при настройке замещения, пользователь непременно получит напоминание о невыполненных заданиях замещаемого сотрудника.

Этот же сценарий можно доработать для просроченных заданий.

           Рис. 1. Уведомление для исполнителя заданий.

Рис. 2. Уведомление для заместителя.

 

Агент рассылки уведомлений об истечении сроков заданий.rar (6,43 Кб)

Ирина Исаченко

Добрый день.

Подскажите, пожалуйста, что нужно дописать, что бы происходил поиск заданий, срок исполнения которых истекает не только завтра, но и просроченных. 

То есть, как я понял, нужно немножко изменить 39-ую строку кода, добавив критерий поиска "ПО завтрешний день". Но вот это самое "ПО" никак не могу добавить...

И подскажите, пожалуйста, новичку, что означает vtEqual, а то никак не могу разобраться.

Заранее спасибо. 

Ирина Исаченко

Разобрался, что именно vtEqual и нужно заменить. Подскажите на какой параметр?

Ирина Исаченко

Разобрался. Параметр vtLessOrEqual

Шынар Джелеунова

как сделать, чтобы по определенному маршруту пришло напоминание, просто только один отдел изъявил желание о своих заданиях. Если завести новую переменную, то в ней значение будет строковое или код ТМ. Возможно ли так сделать по определенному маршруту?

Шынар Джелеунова

поменяла на vtLessOrEqual полезла ошибка:

Кто-нибудь подскажите плиз почему так?

Шынар Джелеунова
что-то рисунок с ошибкой не ставится, напечатаю: List index out of bounds (0), Функция "GetWorkerByUserID": ошибка в сроке 11. Сценарий "АгентРассылкиУведомленийОбИстеченииСроков..." ошибка в строке 46.
Ирина Исаченко
 //Получить список параметров для сценария из соответствующей записи справочника "Параметры запуска компонент" 

 ListParams = GetComponentLaunchParams()
 if ListParams.IndexOfName("DayCount") <> -1
    DayCount = ListParams.ValueByName("DayCount")
    if VarIsNull(DayCount)
       DayCount = 0
    endif
 else  
    DayCount = СценарийПарам("DayCount")
 endif
 if DayCount == ""
    DayCount = 0
 endif
  
 DataPrevExecute = КонстЗнач("ДатаСрокИсЗ")
 DayCount = -1
 
 //Если выполняем первый раз, то ничего не делаем 
 if DataPrevExecute <<>> ""  
    Users = CreateReference('ПОЛ')
    Users.Open()
    Users.First
    // Пройтись по пользователям, записи которых действующие
    While Not Users.EOF
       if Users.Состояние == "Действующая"
          Perfomer = Users.Код
          //Определить срок выполнения заданий
          
          FinalDate = ChangeDate("D";Today();DayCount) //ChangeDateCalendar(Today();DayCount)
          // Достать все задания текущего пользователя, по которым срок исполнения истекает FinalDate (то есть через DayCount-дней)
          Search = Searches.CreateNew(ckJob)
          Criteria = Search.SearchCriteria
          CriterionPerformer = Criteria.Add('Performer')
          CriterionPerformer.Add(Perfomer)       
          CriterionFinalDate = Criteria.Add('JobState')
          CriterionFinalDate.Add('В работе')
          CriterionFinalDate = Criteria.Add('FinalDate')
          CriterionFinalDate.AddSingleValue(FinalDate;vtLessOrEqual)   
          SearchResult = Searches.Execute(Search)
          //Создать список, в котором будут храниться ссылки на задания
          if SearchResult.count > 0
             Task = Tasks.CreateNew()
             User = ServiceFactory.GetUserByCode(Perfomer)
             Adresat = User
             UserFIO = GetWorkerByUserID(User.ID;)
             if UserFIO ==""
                UserFIO = User.FullName
             endif
             Subject = Format("Для: " & UserFIO & ". У вас есть задания, срок исполнения которых уже прошёл! Всего:%s";SearchResult.count)

             ЗМЩ = CreateReference("ЗМЩ")
             ЗМЩ.open()
             ЗМЩ.first()
             if ЗМЩ.Locate('ISBReplaceableUser';Perfomer) 
                if ЗМЩ.requisites('ISBSubstituteType').value == "Полное"
                   and ЗМЩ.requisites('ISBSubstituteStart').value <<>> ""
                   and ЗМЩ.requisites('ISBSubstituteFinish').value <<>> ""
                   and Today() >= ЗМЩ.requisites('ISBSubstituteStart').value  
                   and Today() <= ЗМЩ.requisites('ISBSubstituteFinish').value 
                   Adresat = ServiceFactory.GetUserByCode(ЗМЩ.requisites('ISBSubstitutingUser').value) 
                   Subject = Format("У сотрудника " & UserFIO & ", которого вы замещаете, есть задания, срок выполнения которых истекает завтра. Всего:%s";SearchResult.count)
                endif
             endif
             ЗМЩ.close()  
             Task.Subject = Subject 
             Task.CheckedTask = "Нет"
             RouteStep = Tasks.CreateRouteStep(1; Adresat; jkNotice; ''; ""; "")          
             Task.Route.Add(RouteStep)
             AttachList = Task.GetAttachments(False)  
             // Пройтись по найденым заданиям
             SearchResult.Reset
             while not SearchResult.Eof
                JobInfo = SearchResult.Value
                INFO = JobInfo
                //Создать задание-уведомление текущему пользователю, что срок исполнения задания истекает
                AttachList.Add(INFO)        
                SearchResult.Next   
             endwhile    
             Task.Start()
          endif                               
          //Удалить ссылки на созданные объекты 
          SearchResult = NIL
          CriterionPerformer = NIL
          CriterionFinalDate = NIL
          Criteria = NIL
          Search = NIL
       endif 
       Users.Next() 
    endwhile   
 endif      
 Конст("ДатаСрокИсЗ"; ServerdateTime())   
   
      
Шынар Джелеунова

Я так поняла, что ChangeDateCalendar(Today();DayCount) может изменять даты только вперед.

Еще хотела спросить: можно ли сделать так, чтобы по определенному маршруту пришло напоминание, просто только один отдел изъявил желание о своих заданиях. Если завести новую переменную, то в ней значение будет строковое или код ТМ. Возможно ли так сделать по определенному маршруту?

Шынар Джелеунова

я нашла как это можно сделать

CriterionRout = Criteria.Add('StandardRoute')
CriterionRout.Add('RRCAssPE') // код типового маршрута

Но тогда как можно сделать, чтобы не один маршрут а несколько? достаточно ли у казать в методе Add('RRCAssPE', '6') через запятую?

Андрей Литвинов

Но тогда как можно сделать, чтобы не один маршрут а несколько?

CriterionRout.ValuesBuildType = btOr

CriterionRout.Add('RRCAssPE1') //код типового маршрута №1

CriterionRout.Add('RRCAssPE2') //код типового маршрута №2

CriterionRout.Add('RRCAssPE3') //код типового маршрута №3

 

Шынар Джелеунова

Спасибо большое!)

Александр Слотов

Для версии Директум 4.9 данный сценарий не работает:(

Такая же ошибка как уже освещалась в форуме

List index out of bounds (0), Функция "GetWorkerByUserID": ошибка в сроке 11. Сценарий "АгентРассылкиУведомленийОбИстеченииСроков..." ошибка в строке 46.

Петр Федотов
List index out of bounds (0), Функция "GetWorkerByUserID": ошибка в сроке 11.

Эта ошибка означает, что для пользователя с таким ID не существует работника

Шикарная статья! Татьяна, спасибо огромное!

Илья Зацарный

При запуске агента выдает ошибку: "константа ДатаСрокИсЗ не найдена", я ее добавил вручную, но агент не заработал, какие параметры должны быть у данной константы?

Елена Питомцева

Есенай, зарегистрируйтесь на сайте DIRECTUM Club http://club.directum.ru/register.aspx и задайте ваш вопрос в разделе "Вопросы и ответы".

Максим Евсеев

Всем здравствуйте, для работы сценария на версии 5.6, заменил ID ф функции на UserID! Без ошибок! Но! По-моему не работает отправка по замещению. Найду решение, отпишу!

Авторизуйтесь, чтобы написать комментарий