HelpF.pro

Создание событий и напоминаний пользователям используя Задачи

В процессе работы пользователей, зачастую возникает необходимость создать задачу другому пользователю ИБ и проконтролировать ее выполнение.

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

Если услуга по монтажу оборудования предусмотрена, то автоматически должно сформироваться два напоминания (события):
- Для ответственного менеджера на дату и время напоминания
- Для сотрудника ответственного за монтаж за сутки до напоминания ответственному менеджеру.

Когда срабатывает напоминание у ответственного менеджера, он должен видеть отработано ли напоминание сотрудника по монтажу оборудования.

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

Решим ее следующим способом:
Создаем три реквизита документа Заказ покупателя: М_Монтаж (булево), М_Монтажник (Справочник пользователи) и М_ДатаМонтажа. Размещаем их на форме. Для того что бы сами реквизиты и их надписи были не видимы добавим процедуру:
Код 1C v 8.х
 Процедура М_МонтажПриИзменении(Элемент)
ЭлементыФормы.М_Монтажник.Видимость = М_Монтаж;
ЭлементыФормы.М_ДатаМонтажа.Видимость = М_Монтаж;
ЭлементыФормы.НадписьМ_Монтажник.Видимость = М_Монтаж;
ЭлементыФормы.НадписьМ_ДатаМонтажа.Видимость = М_Монтаж;
КонецПроцедуры


При открытии формы документа тоже надо проверять можно ли отображать на форме новые реквизиты. Процедура УстановитьВидимость() вызывается из процедуры ПриОткрытии(). Именно здесь продублируем код процедуры М_МонтажПриИзменении(Элемент). Существуют, конечно, варианты. Например, можно управление видимостью организовать только в процедуре УстановитьВидимость() а в МонтажПриИзменении() обращаться к ней, или в процедуре УстановитьВидимость() вызывать МонтажПриИзменении(), однако, в первом варианте при каждом изменении значения реквизита «М_Монтаж» будет происходить установка видимости всех реквизитов в форме, что негативно скажется на производительности. Второй вариант не совсем корректен с точки зрения логики расположения программного кода, по этому сделаем наш код слегка избыточным, но зато логичным и не замедляющим работу программы.
При проведении документа следует создавать Задачу пользователя с взведенным флагом «Напоминание» и установленной датой напоминания. Лучше всего располагать создание задач после проверки на корректность заполнения всех полей документов (ведь документ может не провестись, а задачи создадутся)
Код 1C v 8.х
 // Движения по документу
Если Не Отказ Тогда
ДвиженияПоРегистрам(РежимПроведения, СтруктураШапкиДокумента, ТаблицаПоТоварам, ТаблицаПоУслугам, ТаблицаПоТаре, Отказ, Заголовок);
Если М_Монтаж тогда
РаботаСДиалогами.ПроверитьЗадачиПоОбъекту(Ссылка);
КонецЕсли;
КонецЕсли;


Создавать задачи лучше с помощью немного доработанной процедуры РаботаСДиалогами.ПроверитьЗадачиПоОбъекту(Ссылка);
Во-первых, она проверит, есть ли введенные на основании этого документа задачи, и если обнаружит их, выдаст диалоговое окно пользователю с предложением не создавать новые. Этим мы исключим вероятность создания большого числа напоминаний при перепроведении документа. В самой функции ПроверитьЗадачиПоОбъекту() напишем:
Код 1C v 8.х
 Процедура ПроверитьЗадачиПоОбъекту(ОбъектЗадачи) Экспорт

Запрос = Новый Запрос;
Запрос.Текст = "
|ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1
| *
|ИЗ
| Задача.ЗадачиПользователя.ЗадачиПоИсполнителю(
| &ТекПользователь,
| Выполнена = ЛОЖЬ И Объект = &ОбъектЗадачи)
|";
Запрос.УстановитьПараметр("ТекПользователь", ПараметрыСеанса.ТекущийПользователь);
Запрос.УстановитьПараметр("ОбъектЗадачи" , ОбъектЗадачи);
РезультатЗапроса = Запрос.Выполнить();
Если НЕ РезультатЗапроса.Пустой() Тогда
Выполнение = Вопрос("Обнаружены незавершенные задачи по заданному объекту!" + Символы.ПС + " Желаете просмотреть список этих задач вместо создания новой?", РежимДиалогаВопрос.ДаНет, 0);
Если Выполнение = КодВозвратаДиалога.Да Тогда
ОткрытьЗадачиТекущегоПользователя(ОбъектЗадачи);
Возврат;
КонецЕсли;
КонецЕсли;

// Сознание Задачи
НоваяЗадача = Задачи.ЗадачиПользователя.СоздатьЗадачу();
НоваяЗадача.Объект = ОбъектЗадачи;
НоваяЗадача.Оповещение = Истина;

Если ТипЗнч(ОбъектЗадачи) = Тип("ДокументСсылка.ЗаказПокупателя") тогда
Если ОбъектЗадачи.М_Монтаж тогда
НоваяЗадача.Наименование = "Напоминание менеджеру о сборке комплекта по: " + ОбъектЗадачи.Метаданные().Синоним;
НоваяЗадача.Дата = ТекущаяДата();
НоваяЗадача.СрокОповещения = ОбъектЗадачи.М_ДатаМонтажа;
НоваяЗадача.Инициатор = ОбъектЗадачи.Ответственный;
НоваяЗадача.Исполнитель = ОбъектЗадачи.Ответственный;
НоваяЗадача.Записать();

// Напоминание мастеру
НоваяЗадача = Задачи.ЗадачиПользователя.СоздатьЗадачу();
НоваяЗадача.Дата = ТекущаяДата();
НоваяЗадача.Объект = ОбъектЗадачи;
НоваяЗадача.Инициатор = ОбъектЗадачи.Ответственный;
НоваяЗадача.Оповещение = Истина;
НоваяЗадача.Исполнитель = ОбъектЗадачи.М_Монтажник;
НоваяЗадача.Наименование = "Напоминание мастеру о сборке комплекта по: " + ОбъектЗадачи.Метаданные().Синоним;
НоваяЗадача.СрокОповещения = ОбъектЗадачи.М_ДатаМонтажа - 24 * 60 * 60;
НоваяЗадача.Записать();
КонецЕСли;
Иначе
НоваяЗадача.Наименование = "Напоминание по объекту: " + ОбъектЗадачи.Метаданные().Синоним;
ФормаНовой = НоваяЗадача.ПолучитьФорму();
ФормаНовой.Открыть();
КонецЕсли;
КонецПроцедуры

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

Отчет в задании совсем не сложный, правда, могут возникнуть сомнения какой заказ считать закрытым. Как известно, заказ покупателя делает два движения. Одно по регистру «Заказы покупателя» где в разрезе номенклатуры, ведется учет по отгруженным товарам, второе по регистру «Расчеты с контрагентами» и здесь контролируется оплата по заказу. Думаю, что закрытым можно считать заказ, которого нет в остатках ни по одному, ни по второму регистру. Соединив их полным соединением, а так же присоединив таблицу Задач пользователя, получим отчет по незакрытым заказам пользователя.
Автор: Максим Нечистяк
Опубликовано на сайте: https://HelpF.pro
Прямая ссылка: https://HelpF.pro/faq8/view/876.html