Не так давно мне досталась задачка по созданию собственных виджетов по отслеживанию невыполненных задач в виде кольцевой диаграммы и показателей в Документообороте 3.0. Поиск в интернете особо ничего выдал, только статью на ИТС и на Инфостарте, как это делается в Документообороте 2.1. Начал смотреть и разбираться, оказалось, что отличий очень много, поэтому и родилась идея написать данную статью, так как ДО 3.0 сейчас активно внедряется, а информации по ней мало. Итак, приступим.
Для начала опишу шаги, которые нам необходимо будет пройти, чтобы наш виджет заработал. Сперва нужно сделать некоторые манипуляции в 1С предприятии.
- Создать сам виджет.
- Создать групповой показатель. Он нужен для того, чтобы на самом виджете отображалось количество задач по нашим показателям.
- Создать и настроить показатели виджета
- Настроить сам виджет.
Далее переходим в конфигуратор и начинаем программировать работу виджета и показателей.
- Пишем функцию, которая будет обрабатывать и выводить количество задач для наших показателей на самом виджете
- Создаем команды для перехода, кликая по показателю на форму Задачи мне, но с нашими отборами, которые соответствуют названию показателя.
- Дописываем типовые процедуры и функции, где указываем, как формировать наши группировки задач, а если точнее, то отборы для динамического списка.
По итогу мы получим виджет, в котором будет оперативно меняться количество задач и возможность перейти, кликая по показателю на форму задачи с нашим отбором, который будет заложен в коде соответствующего показателя.
План нарисовали, можно приступать.
Еще немаловажный момент. Делалось все через расширение, так как заказчик попросил конфу не менять.
1. Создаем сам виджет
Делается это достаточно легко, открываем функции для технического специалиста и вбиваем поиск "Виджеты". Находится один справочник в него и переходим.
Нам открывается справочник, в котором есть только предопределенные значения. Особой необходимости как в ДО 2.1 делать предопределенным новый виджет нет, поэтому берем тот, что более-менее похож на наш, к примеру, "Задачи мне (диаграмма, по видам)" и копируем его. На текущем этапе достаточно только обозвать его так, как нам нужно. В моем случае это будет выглядеть вот так:
В итоге получаем виджет с нашим наименованием, но по сути это будет копия того, что мы сделали и если его вывести, то он ничем отличаться не будет.
2. Создаем групповой показатель
Групповой показатель, как писал ранее, нужен для вывода информации о количестве задач, которые будут по нашим показателям на виджете. По этому также открываем функции для технического специалиста и вбиваем поиск "Групповые Показатели". Нам открывается аналогичный Виджетам справочник, в котором есть опять же только предопределенные значения. Копируем аналогичный виджету групповой показатель, а именно "Итоги "Задачи мне" (по видам)", и начинаем его настраивать.
Пробежимся по реквизитам:
- В первую очередь наименование так как оно должно быть уникальным.
- Далее выражение. Это как раз та функция, которую нам придется в дальнейшем закодировать, чтобы по указанным свойствам, которые указаны ниже, передавать количество задач. В моем случае я ее назвал "ЗадачиМнеИтогиПоДокументам"
- Вкладка Свойства. На этой вкладке мы укажем ключи для наших показателей. Соответственно старые я удалил и вбил свои.
- Вкладку события не трогаем, там перечислены события, по которым данная функция будет дергаться для обновления показателей.
Записываем и закрываем, больше нам тут делать нечего. Идем дальше.
3. Создание и настройка показателей виджетов
Уже ставшим привычным действием открываем функции для технического специалиста и вбиваем поиск "Показатели виджетов". Открываем справочник, видим снова предопределенные значения и копируем, к примеру, виджет "Задачи мне: На рассмотрение", так как он у нас был в нашем первоначальном виджете, с которого мы копировали, ну и в групповом виджете он тоже участвовал.
Меняем значение реквизитов:
- Наименование в моем случае "Задачи мне: Договоры"
- Заголовок "Договоры". Так будет выглядеть наименование на самом виджете
- Подсказку по желанию
- Немаловажный реквизит - картинка. Без нее будет плохо, поверьте мне. Я потратил кучу времени на то, чтобы понять, почему из показателя получается абракадабра. Выбираем любой цвет из ЛегендаДиаграммы. Я выбрал такое значение "ЛегендаДиаграммыСиний".
- Цвет виджета серии по аналогии с картинкой берем "Синий"
- Далее у нас уже стоит Тип "Групповой"
- Групповой показатель выбираем тот, который создали ранее: "Итоги "Задачи мне" по документам"
- Свойство группового показателя - выбираем тот, который мы закладывали заранее для этого показателя "ЗадачиМнеДоговоры"
- Тип Значения уже стоит "Число", поэтому не трогаем.
- В разделе Действие пока ничего не трогаем, так как без Источника виджет будет ломаться, а команды для перехода мы сделаем только сильно позже.
- События оповещения нам не нужны.
Если все правильно сделали, то выглядеть будет вот так:
Записываем, закрываем и повторяем процедуру еще 3 раза, только указываем для каждого показателя свои значения.
Теперь настало время для настройки самого виджета.
4. Настройка виджета
Для того, чтобы нам удалось настроить виджет, необходима какая-нибудь обработка, которая позволит увидеть больше, чем то, что показывает нам сам документооборот. Я воспользовался 1С Admin. После открытия через данную обработку нашего виджета мы увидим, что у нас, оказывается, есть еще куча табличных частей, которые нам постеснялись показать.
Скрываем пустые ТЧ, удаляем все значения в ТЧ "Дополнительные показатели", "Основные показатели" и "Команды".
Добавляем в ТЧ "Основные показатели" наши показатели в том порядке, в каком вы хотите их видеть на виджете.
Записываем и закрываем. На текущем этапе в клиенте с работами пока все. Переходим в конфигуратор.
5. Функция для вывода значений показателей виджета на сам виджет.
Ранее в групповом показателе мы придумывали некую функцию. Так вот настало время ее создать. Идем в конфигурацию > Общиемодули > РаботаСЗадачиами
Для упрощения написания можно скопировать аналогичную функцию, к примеру, ту, что у нас была прописана в групповом показателе, с которого мы копировались. "ЗадачиМнеИтогиПоВидам"
Код этой функции:
Код функции
ЗадачиМнеИтогиПоДокументам
Функция ЗадачиМнеИтогиПоДокументам(Пользователь) Экспорт
ПараметрыОтбора = ПараметрыОтбораКоличестваДействийЗадачМне(Пользователь);
ЗадачиМнеИтогиРасширенные = Новый Структура(
"НаРассмотрение, НаСогласование, НаУтверждение, НаИсполнение,
|НаОзнакомление, НаРегистрацию, Другие");
ЗадачиМнеИтогиРасширенные.НаРассмотрение = 0;
ЗадачиМнеИтогиРасширенные.НаСогласование = 0;
ЗадачиМнеИтогиРасширенные.НаУтверждение = 0;
ЗадачиМнеИтогиРасширенные.НаИсполнение = 0;
ЗадачиМнеИтогиРасширенные.НаОзнакомление = 0;
ЗадачиМнеИтогиРасширенные.НаРегистрацию = 0;
ЗадачиМнеИтогиРасширенные.Другие = 0;
ЗадачиИсполнителейИтогиПоВидамДействий =
РегистрыНакопления.КоличествоДействийЗадач.ЗадачиИсполнителейИтогиПоВидамДействий(ПараметрыОтбора);
Для Каждого ИтогиПоВидуДействия Из ЗадачиИсполнителейИтогиПоВидамДействий Цикл
Если ИтогиПоВидуДействия.ВидДействия = Справочники.ВидыДействийЗадач.Рассмотреть Тогда
ЗадачиМнеИтогиРасширенные.НаРассмотрение =
ЗадачиМнеИтогиРасширенные.НаРассмотрение + ИтогиПоВидуДействия.ОжидающихВыполнения;
ИначеЕсли ИтогиПоВидуДействия.ВидДействия = Справочники.ВидыДействийЗадач.Согласовать Тогда
ЗадачиМнеИтогиРасширенные.НаСогласование =
ЗадачиМнеИтогиРасширенные.НаСогласование + ИтогиПоВидуДействия.ОжидающихВыполнения;
ИначеЕсли ИтогиПоВидуДействия.ВидДействия = Справочники.ВидыДействийЗадач.Утвердить Тогда
ЗадачиМнеИтогиРасширенные.НаУтверждение =
ЗадачиМнеИтогиРасширенные.НаУтверждение + ИтогиПоВидуДействия.ОжидающихВыполнения;
ИначеЕсли ИтогиПоВидуДействия.ВидДействия = Справочники.ВидыДействийЗадач.Исполнить Тогда
ЗадачиМнеИтогиРасширенные.НаИсполнение =
ЗадачиМнеИтогиРасширенные.НаИсполнение + ИтогиПоВидуДействия.ОжидающихВыполнения;
ИначеЕсли ИтогиПоВидуДействия.ВидДействия = Справочники.ВидыДействийЗадач.Ознакомиться Тогда
ЗадачиМнеИтогиРасширенные.НаОзнакомление =
ЗадачиМнеИтогиРасширенные.НаОзнакомление + ИтогиПоВидуДействия.ОжидающихВыполнения;
ИначеЕсли ИтогиПоВидуДействия.ВидДействия = Справочники.ВидыДействийЗадач.Зарегистрировать Тогда
ЗадачиМнеИтогиРасширенные.НаРегистрацию =
ЗадачиМнеИтогиРасширенные.НаРегистрацию + ИтогиПоВидуДействия.ОжидающихВыполнения;
Иначе
ЗадачиМнеИтогиРасширенные.Другие =
ЗадачиМнеИтогиРасширенные.Другие + ИтогиПоВидуДействия.ОжидающихВыполнения;
КонецЕсли;
КонецЦикла;
Возврат ЗадачиМнеИтогиРасширенные;
КонецФункции
Собственно, в ней мы получаем отбор в виде сотрудника, под пользователем которого мы сидим, далее задаем структуру из наших свойств, которые указаны в Групповом показателе, затем идем в функцию с запросом, где получаем результат в виде ТЧ, где указаны задачи по видам действий. Ну а после уже перебором мы в нашу структуру суммируем количество задач и возвращаем в то место, откуда нас позвали.
Теперь то, что нужно будет сделать нам для того, чтобы выводились нужные показатели.
В первую очередь нам не нужен отбор, а достаточно получить Сотрудника. Воспользуемся типовой функцией для этого:
Сотрудник = Сотрудники.ОсновнойСотрудникПользователя(Пользователь);
Далее меняем ненужные нам показатели на наши:
Создаем структуру с нашими показателями
ЗадачиМнеИтогиРасширенные = Новый Структура(
"ЗадачиМнеПроекты, ЗадачиМнеПротоколы, ЗадачиМнеПоручения, ЗадачиМнеРегулярныеЗадания");
ЗадачиМнеИтогиРасширенные.ЗадачиМнеПроекты = 0;
ЗадачиМнеИтогиРасширенные.ЗадачиМнеПротоколы = 0;
ЗадачиМнеИтогиРасширенные.ЗадачиМнеПоручения = 0;
ЗадачиМнеИтогиРасширенные.ЗадачиМнеРегулярныеЗадания = 0;
Пишем запрос, который удовлетворяет наши требования. Кстати, все значения получаются из регистра накопления "КоличествоДействийЗадач.Остатки"
Запрос для получения показателей
Запрос = Новый Запрос(
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
| КоличествоДействийЗадачОстатки.ВидПриложения.Родитель КАК ВидПриложенияРодитель,
| СУММА(КоличествоДействийЗадачОстатки.ОжидающихВыполненияОстаток) КАК ОжидающихВыполнения,
| КоличествоДействийЗадачОстатки.Проект.Папка.Наименование КАК ПроектПапкаНаименование,
| КоличествоДействийЗадачОстатки.ВидЗадачи КАК ВидЗадачи,
| КоличествоДействийЗадачОстатки.ВидПриложения КАК ВидПриложения
|ИЗ
| РегистрНакопления.КоличествоДействийЗадач.Остатки(, ) КАК КоличествоДействийЗадачОстатки
|ГДЕ
| КоличествоДействийЗадачОстатки.Исполнитель = &Исполнитель
|
|СГРУППИРОВАТЬ ПО
| КоличествоДействийЗадачОстатки.Проект.Папка.Наименование,
| КоличествоДействийЗадачОстатки.ВидПриложения.Родитель,
| КоличествоДействийЗадачОстатки.ВидЗадачи,
| КоличествоДействийЗадачОстатки.ВидПриложения");
Запрос.УстановитьПараметр("Исполнитель",Сотрудник);
ЗадачиИсполнителейИтогиПоВидамДействий = Запрос.Выполнить().Выгрузить();
Раз в типовом коде у нас получается ТЗ по результату выполнения запроса, почему бы и нам так же не сделать
Ну и, наконец, переписываем ту часть, где происходит заполнение нашей структуры с показателями
Заполнения структуры показателями
Для Каждого ИтогиПоВидуДействия Из ЗадачиИсполнителейИтогиПоВидамДействий Цикл
Если ИтогиПоВидуДействия.ВидЗадачи = Справочники.ВидыЗадач.Поручение Тогда
ЗадачиМнеИтогиРасширенные.ЗадачиМнеПоручения =
ЗадачиМнеИтогиРасширенные.ЗадачиМнеПоручения + ИтогиПоВидуДействия.ОжидающихВыполнения;
ИначеЕсли ИтогиПоВидуДействия.ВидПриложения = Неопределено и ЗначениеЗаполнено(ИтогиПоВидуДействия.ПроектПапкаНаименование) и
СтрНайти(ИтогиПоВидуДействия.ПроектПапкаНаименование,"Регулярные задачи") = 0 Тогда
ЗадачиМнеИтогиРасширенные.ЗадачиМнеПроекты =
ЗадачиМнеИтогиРасширенные.ЗадачиМнеПроекты + ИтогиПоВидуДействия.ОжидающихВыполнения;
ИначеЕсли ЗначениеЗаполнено(ИтогиПоВидуДействия.ВидПриложенияРодитель) и
(ИтогиПоВидуДействия.ВидПриложенияРодитель = Справочники.ВидыДокументов.НайтиПоНаименованию("Протоколы")
или ИтогиПоВидуДействия.ВидПриложенияРодитель.Родитель = Справочники.ВидыДокументов.НайтиПоНаименованию("Протоколы")) Тогда
ЗадачиМнеИтогиРасширенные.ЗадачиМнеПротоколы =
ЗадачиМнеИтогиРасширенные.ЗадачиМнеПротоколы + ИтогиПоВидуДействия.ОжидающихВыполнения;
ИначеЕсли ЗначениеЗаполнено(ИтогиПоВидуДействия.ПроектПапкаНаименование) и
НЕ СтрНайти(ИтогиПоВидуДействия.ПроектПапкаНаименование,"Регулярные задачи") = 0 Тогда
ЗадачиМнеИтогиРасширенные.ЗадачиМнеРегулярныеЗадания =
ЗадачиМнеИтогиРасширенные.ЗадачиМнеРегулярныеЗадания + ИтогиПоВидуДействия.ОжидающихВыполнения;
КонецЕсли;
КонецЦикла;
За поиск по наименованию не ругайте, так надо, ибо таков путь.
Переходим к командам для перехода по нашим показателям.
6. Создание команд перехода по показателям
Все команды, которые нам необходимы, будем создавать в документе "Задача", так как форма с "Задачи " принадлежит этому документу. Для удобства копируем команду, которая у нас была указана в наших показателях. "ЗадачиМнеНаСогласование"
Переименовываем ее в "ЗадачаМнеПоВидамДокументов "и пишем синоним "Задача мне по видам документов Договоры". Синоним это важно, так как далее в коде будет прописана ссылка на этот синоним, и в заголовке формы задачи мы увидим этот текст.
В самом модуле команды мы меняем только Ключ использования на "ФильтрПоДоговорам". Далее нам нужно будет протащить этот ключ по всему модулю формы, чтобы нигде не было ошибок при выполнении.
&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("КлючНазначенияИспользования", "ФильтрПоДоговорам");
ОткрытьФорму("Документ.Задача.Форма.Задачи",
ПараметрыФормы,
ПараметрыВыполненияКоманды.Источник,
ПараметрыФормы.КлючНазначенияИспользования + Строка(ПараметрыВыполненияКоманды.Уникальность),
ПараметрыВыполненияКоманды.Окно,
ПараметрыВыполненияКоманды.НавигационнаяСсылка);
КонецПроцедуры
Для всех наших показателей создаем по аналогии.
7. Настройка отборов для корректного открытия формы Задачи с нужным перечнем задач.
Поскольку мы переходим по команде в форму с собственным ключом, нужно этот ключ везде, где он используется, включить, иначе будет ошибка.
В первую очередь нам нужно завести эти команды на форму, так как в процедуре "ПриИзмененииВариантаГруппировки()" они используются как элементы формы. Поэтому "ПриСозданииНаСервере" обязательно в начале пишем:
Создаем на форме наши команды
//Добавляем команду для группировки по договорам
НоваяКоманда = Команды.Добавить("СгруппироватьПоДоговорам");
НоваяКоманда.Действие = "СгруппироватьПоДоговорам";
НоваяКнопка = Элементы.Вставить("ФормаСгруппироватьПоДоговорам", Тип("КнопкаФормы"),Элементы.ФормаГруппировки);
НоваяКнопка.ИмяКоманды = "СгруппироватьПоДоговорам";
НоваяКнопка.Вид = ВидКнопкиФормы.ОбычнаяКнопка;
//Добавляем команду для группировки по ОРД
НоваяКоманда = Команды.Добавить("СгруппироватьПоОРД");
НоваяКоманда.Действие = "СгруппироватьПоОРД";
НоваяКнопка = Элементы.Вставить("ФормаСгруппироватьПоОРД", Тип("КнопкаФормы"),Элементы.ФормаГруппировки);
НоваяКнопка.ИмяКоманды = "СгруппироватьПоОРД";
НоваяКнопка.Вид = ВидКнопкиФормы.ОбычнаяКнопка;
//Добавляем команду для группировки по Приказам
НоваяКоманда = Команды.Добавить("СгруппироватьПоПриказам");
НоваяКоманда.Действие = "СгруппироватьПоПриказам";
НоваяКнопка = Элементы.Вставить("ФормаСгруппироватьПоПриказам", Тип("КнопкаФормы"),Элементы.ФормаГруппировки);
НоваяКнопка.ИмяКоманды = "СгруппироватьПоПриказам";
НоваяКнопка.Вид = ВидКнопкиФормы.ОбычнаяКнопка;
//Добавляем команду для группировки по Распоряжениям
НоваяКоманда = Команды.Добавить("СгруппироватьПоРаспоряжениям");
НоваяКоманда.Действие = "СгруппироватьПоРаспоряжениям";
НоваяКнопка = Элементы.Вставить("ФормаСгруппироватьПоРаспоряжениям", Тип("КнопкаФормы"),Элементы.ФормаГруппировки);
НоваяКнопка.ИмяКоманды = "СгруппироватьПоРаспоряжениям";
НоваяКнопка.Вид = ВидКнопкиФормы.ОбычнаяКнопка;
Далее для каждой команды нужно завести процедуры, но предварительно в перечислении "ВариантыГруппировкиЗадач" нужно для каждой нашей команды создать перечисление, чтобы его можно было указать в нашей группировке.
Создаем процедуры для команд
&НаКлиенте
Процедура СгруппироватьПоДоговорам(Команда)
ТекущийВариантГруппировки = ПредопределенноеЗначение("Перечисление.ВариантыГруппировкиЗадач.ПоДоговорам");
ДополнительныйВариантГруппировки = ПредопределенноеЗначение("Перечисление.ВариантыГруппировкиЗадач.ПустаяСсылка");
СтарыеГруппировки = ТекущиеГруппировки();
ПриИзмененииВариантаГруппировки();
ВосстановитьСтрокуДереваГруппировок(СтарыеГруппировки);
КонецПроцедуры
С командами закончили, теперь нужно добавить в параметры быстрого поиска значения для наших команд. Делается это в процедуре "ОбновитьПараметрыБыстрогоПоиска". Для удобства вклиниваемся в конце перед "БыстрыйПоиск.Сортировать("Сортировка");" где заполняется переменная БыстрыйПоиск
Делаем по аналогии с тем, как заданы значения для других команд.
//для работы команды перехода из виджета по Договорам
НоваяСтрока = БыстрыйПоиск.Добавить();
НоваяСтрока.Параметр = "ФильтрПоДоговорам";
НоваяСтрока.ПредставлениеПараметра = НСтр("ru = 'Договора:'");
НоваяСтрока.Тип = "СправочникСсылка.ВидыДокументов";
НоваяСтрока.Значение = Справочники.ВидыДокументов.ПустаяСсылка();
НоваяСтрока.Сортировка = НоваяСтрока.ПредставлениеПараметра;
//для работы команды перехода из виджета по ОРД
НоваяСтрока = БыстрыйПоиск.Добавить();
НоваяСтрока.Параметр = "ФильтрПоОРД";
НоваяСтрока.ПредставлениеПараметра = НСтр("ru = 'ОРД:'");
НоваяСтрока.Тип = "СправочникСсылка.ВидыДокументов";
НоваяСтрока.Значение = Справочники.ВидыДокументов.ПустаяСсылка();
НоваяСтрока.Сортировка = НоваяСтрока.ПредставлениеПараметра;
//для работы команды перехода из виджета по Приказам
НоваяСтрока = БыстрыйПоиск.Добавить();
НоваяСтрока.Параметр = "ФильтрПоПриказам";
НоваяСтрока.ПредставлениеПараметра = НСтр("ru = 'Приказы:'");
НоваяСтрока.Тип = "СправочникСсылка.ВидыДокументов";
НоваяСтрока.Значение = Справочники.ВидыДокументов.ПустаяСсылка();
НоваяСтрока.Сортировка = НоваяСтрока.ПредставлениеПараметра;
//для работы команды перехода из виджета по Распоряжениям
НоваяСтрока = БыстрыйПоиск.Добавить();
НоваяСтрока.Параметр = "ФильтрПоРаспоряжениям";
НоваяСтрока.ПредставлениеПараметра = НСтр("ru = 'Распоряжения:'");
НоваяСтрока.Тип = "СправочникСсылка.ВидыДокументов";
НоваяСтрока.Значение = Справочники.ВидыДокументов.ПустаяСсылка();
НоваяСтрока.Сортировка = НоваяСтрока.ПредставлениеПараметра;
Теперь правим событие ПриИзмененииВариантаГруппировки
В месте, где заполняется соответствие КомандыВариантовГруппировки, вписываем свой код:
Редактируем ПриИзмененииВариантаГруппировки
// Новая группировка задач для виджета по договорам
КомандыВариантовГруппировки.Вставить(
Перечисления.ВариантыГруппировкиЗадач.ПоДоговорам,
Элементы.ФормаСгруппироватьПоДоговорам);
// Новая группировка задач для виджета по ОРД
КомандыВариантовГруппировки.Вставить(
Перечисления.ВариантыГруппировкиЗадач.ПоОРД,
Элементы.ФормаСгруппироватьПоОРД);
// Новая группировка задач для виджета по Приказам
КомандыВариантовГруппировки.Вставить(
Перечисления.ВариантыГруппировкиЗадач.ПоПриказам,
Элементы.ФормаСгруппироватьПоПриказам);
// Новая группировка задач для виджета по Распоряжениям
КомандыВариантовГруппировки.Вставить(
Перечисления.ВариантыГруппировкиЗадач.ПоРаспоряжениям,
Элементы.ФормаСгруппироватьПоРаспоряжениям);
Чтобы не получить ошибку "Неизвестный ключ назначения использования", дописываем код в процедуре ОбработатьКлючНазначенияИспользования. Встраиваемся сразу после проверки ключа "ЗадачиМнеДругие". На самом деле не обязательно именно в этом месте, но таков путь. Кстати, здесь как раз и прописывается ссылка на синоним для заголовка.
Редактируем процедуру ОбработатьКлючНазначенияИспользования
ИначеЕсли КлючНазначенияИспользования = "ФильтрПоДоговорам" Тогда
Заголовок = Метаданные.Документы.Задача.Команды.ЗадачаМнеПоВидамДокументов.Синоним;
ОбновлятьОперативно = Истина;
ИначеЕсли КлючНазначенияИспользования = "ФильтрПоОРД" Тогда
Заголовок = Метаданные.Документы.Задача.Команды.ЗадачаМнеПоВидамОРД.Синоним;
ОбновлятьОперативно = Истина;
ИначеЕсли КлючНазначенияИспользования = "ФильтрПоПриказам" Тогда
Заголовок = Метаданные.Документы.Задача.Команды.ЗадачаМнеПоВидамПриказов.Синоним;
ОбновлятьОперативно = Истина;
ИначеЕсли КлючНазначенияИспользования = "ФильтрПоРаспоряжениям" Тогда
Заголовок = Метаданные.Документы.Задача.Команды.ЗадачаМнеПоВидамРаспоряжениям.Синоним;
ОбновлятьОперативно = Истина;
По аналогии с процедурой ОбработатьКлючНазначенияИспользования, чтобы не получить такую же ошибку, дописываем код в процедуре "ОбновитьГруппировки". Вставлять текст после проверки на ключ "ЗадачиМне".
Редактируем процедуру ОбновитьГруппировки
ИначеЕсли СтрНачинаетсяС(КлючНазначенияИспользования, "ФильтрПоДоговорам") Тогда
Если РаботаСЗадачами.ДоступныЗадачиМне() Тогда
Если ТекущийВариантГруппировки = Перечисления.ВариантыГруппировкиЗадач.БезГруппировки Тогда
ТекущаяГруппировка = Справочники.ГруппировкиЗадач.ЗадачиМне;
УстановитьПараметрыГруппировкиНаСервере();
Если ЭтоМобильныйКлиент Тогда
НастроитьСписокДействияЗадачМК();
Элементы.ВариантГруппировкиВсеЗадачи.Пометка = Ложь;
Элементы.ВариантГруппировкиЗадачиМне.Пометка = Истина;
Элементы.ВариантГруппировкиЗадачиПодчиненных.Пометка = Ложь;
Элементы.ВариантГруппировкиЗадачиОтМеня.Пометка = Ложь;
КонецЕсли;
Иначе
ЗаполнитьГруппировкуЗадачиМне(ДанныеГруппировок);
КонецЕсли;
Иначе
УстановитьРежимНетДанных(НСтр("ru = 'Нет сотрудников, на имя которых вы можете получать задачи.'"));
КонецЕсли;
ИначеЕсли СтрНачинаетсяС(КлючНазначенияИспользования, "ФильтрПоОРД") Тогда
Если РаботаСЗадачами.ДоступныЗадачиМне() Тогда
Если ТекущийВариантГруппировки = Перечисления.ВариантыГруппировкиЗадач.БезГруппировки Тогда
ТекущаяГруппировка = Справочники.ГруппировкиЗадач.ЗадачиМне;
УстановитьПараметрыГруппировкиНаСервере();
Если ЭтоМобильныйКлиент Тогда
НастроитьСписокДействияЗадачМК();
Элементы.ВариантГруппировкиВсеЗадачи.Пометка = Ложь;
Элементы.ВариантГруппировкиЗадачиМне.Пометка = Истина;
Элементы.ВариантГруппировкиЗадачиПодчиненных.Пометка = Ложь;
Элементы.ВариантГруппировкиЗадачиОтМеня.Пометка = Ложь;
КонецЕсли;
Иначе
ЗаполнитьГруппировкуЗадачиМне(ДанныеГруппировок);
КонецЕсли;
Иначе
УстановитьРежимНетДанных(НСтр("ru = 'Нет сотрудников, на имя которых вы можете получать задачи.'"));
КонецЕсли;
ИначеЕсли СтрНачинаетсяС(КлючНазначенияИспользования, "ФильтрПоПриказам") Тогда
Если РаботаСЗадачами.ДоступныЗадачиМне() Тогда
Если ТекущийВариантГруппировки = Перечисления.ВариантыГруппировкиЗадач.БезГруппировки Тогда
ТекущаяГруппировка = Справочники.ГруппировкиЗадач.ЗадачиМне;
УстановитьПараметрыГруппировкиНаСервере();
Если ЭтоМобильныйКлиент Тогда
НастроитьСписокДействияЗадачМК();
Элементы.ВариантГруппировкиВсеЗадачи.Пометка = Ложь;
Элементы.ВариантГруппировкиЗадачиМне.Пометка = Истина;
Элементы.ВариантГруппировкиЗадачиПодчиненных.Пометка = Ложь;
Элементы.ВариантГруппировкиЗадачиОтМеня.Пометка = Ложь;
КонецЕсли;
Иначе
ЗаполнитьГруппировкуЗадачиМне(ДанныеГруппировок);
КонецЕсли;
Иначе
УстановитьРежимНетДанных(НСтр("ru = 'Нет сотрудников, на имя которых вы можете получать задачи.'"));
КонецЕсли;
ИначеЕсли СтрНачинаетсяС(КлючНазначенияИспользования, "ФильтрПоРаспоряжениям") Тогда
Если РаботаСЗадачами.ДоступныЗадачиМне() Тогда
Если ТекущийВариантГруппировки = Перечисления.ВариантыГруппировкиЗадач.БезГруппировки Тогда
ТекущаяГруппировка = Справочники.ГруппировкиЗадач.ЗадачиМне;
УстановитьПараметрыГруппировкиНаСервере();
Если ЭтоМобильныйКлиент Тогда
НастроитьСписокДействияЗадачМК();
Элементы.ВариантГруппировкиВсеЗадачи.Пометка = Ложь;
Элементы.ВариантГруппировкиЗадачиМне.Пометка = Истина;
Элементы.ВариантГруппировкиЗадачиПодчиненных.Пометка = Ложь;
Элементы.ВариантГруппировкиЗадачиОтМеня.Пометка = Ложь;
КонецЕсли;
Иначе
ЗаполнитьГруппировкуЗадачиМне(ДанныеГруппировок);
КонецЕсли;
Иначе
УстановитьРежимНетДанных(НСтр("ru = 'Нет сотрудников, на имя которых вы можете получать задачи.'"));
КонецЕсли;
Ну и чтобы не получить ошибку, если кто-то полезет в группировки и начнет нажимать команды, указанные там, редактируем процедуру "ЗаполнитьГруппировкуЗадачиМне". Вставляем код после проверки на вариант перечисления по Флагу. Опять же необязательно именно там.
Редактируем процедуру ЗаполнитьГруппировкуЗадачиМне
ИначеЕсли ТекущийВариантГруппировки = Перечисления.ВариантыГруппировкиЗадач.ПоДоговорам Тогда
ЗаполнитьГруппировкиПоФлагу(
ДанныеГруппировок,
КлючДляГруппировки,
Справочники.ГруппировкиЗадач.ЗадачиМне,
ПараметрыОтбора);
ИначеЕсли ТекущийВариантГруппировки = Перечисления.ВариантыГруппировкиЗадач.ПоОРД Тогда
ЗаполнитьГруппировкиПоФлагу(
ДанныеГруппировок,
КлючДляГруппировки,
Справочники.ГруппировкиЗадач.ЗадачиМне,
ПараметрыОтбора);
ИначеЕсли ТекущийВариантГруппировки = Перечисления.ВариантыГруппировкиЗадач.ПоПриказам Тогда
ЗаполнитьГруппировкиПоФлагу(
ДанныеГруппировок,
КлючДляГруппировки,
Справочники.ГруппировкиЗадач.ЗадачиМне,
ПараметрыОтбора);
ИначеЕсли ТекущийВариантГруппировки = Перечисления.ВариантыГруппировкиЗадач.ПоРаспоряжениям Тогда
ЗаполнитьГруппировкиПоФлагу(
ДанныеГруппировок,
КлючДляГруппировки,
Справочники.ГруппировкиЗадач.ЗадачиМне,
ПараметрыОтбора);
Ну и напоследок то, ради чего все это делалось, а именно отборы для динамического списка. Нас интересует процедура ПараметрыОтбора. В ней-то как раз и задаются значения в параметры отбора, которые нам нужны будут при открытии.
Все необходимые нам параметры уже заложены заранее, поэтому нам всего лишь в нужном месте нужно вклиниться и передать необходимые значения. Вклиниваться будем уже в самом конце перед Быстрым поиском. Как раз тут нам и понадобится наш ключ, который мы передаем в команде. По нему очень удобно отслеживать, какая команда выполняется.
Редактирование процедуры ПараметрыОтбора
Если КлючНазначенияИспользования = "ФильтрПоДоговорам" тогда
МассивДоговоров = ПолучитьМассивГдеРодительДоговор();
ПараметрыОтбора.ВидПриложения = МассивДоговоров;
КонецЕсли;
Если КлючНазначенияИспользования = "ФильтрПоОРД" тогда
МассивОРД = ПолучитьМассивГдеРодительОРД();
ПараметрыОтбора.ВидПриложения = МассивОРД;
КонецЕсли;
Если КлючНазначенияИспользования = "ФильтрПоПриказам" тогда
МассивПриказов = ПолучитьМассивГдеРодительПриказы();
ПараметрыОтбора.ВидПриложения = МассивПриказов;
КонецЕсли;
Если КлючНазначенияИспользования = "ФильтрПоРаспоряжениям" тогда
МассивРаспоряжений = ПолучитьМассивГдеРодительРаспоряжения();
ПараметрыОтбора.ВидПриложения = МассивРаспоряжений;
КонецЕсли;
Массивы со значениями я получал запросом в отдельной функции, которую дергал, если попадал в соответствующий вариант
Запрос для получения массива видов документов из папки Договоры
&НаСервере
Функция ПолучитьМассивГдеРодительДоговор()
РодительВидовДоговоров = Справочники.ВидыДокументов.НайтиПоНаименованию("Договоры");
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ВидыДокументов.Ссылка КАК Ссылка
|ИЗ
| Справочник.ВидыДокументов КАК ВидыДокументов
|ГДЕ
| ВидыДокументов.Родитель В Иерархии(&Родитель)";
Запрос.УстановитьПараметр("Родитель", РодительВидовДоговоров);
Выборка = Запрос.Выполнить().Выбрать();
Результат = Новый Массив;
Пока Выборка.следующий() Цикл
Результат.Добавить(Выборка.Ссылка);
КонецЦикла;
Возврат Результат
КонецФункции
С Конфигуратором теперь тоже закончили, и возвращаемся назад в клиент. Там нам нужно в наши показатели прописать в реквизит "Источник" наши команды, ну и вывести наш новый реквизит на рабочий стол.
Идем в Настройка > Персональные настройки > Рабочий стол. Поскольку наш Виджет занимает 2 клетки, нам нужно очистить нужное место от стандартных реквизитов и вставить наш. Жмем плюсик. Ждем, когда инициализируются все виджеты, и выбираем наш. В итоге получится вот так:
Ну и на рабочем столе у нас уже будут наши виджеты, и выглядят они таким образом:
Теперь немого пояснения к тому, что написано выше. Все, что касается отборов и ключей, это только для того, чтобы не было ошибок. Я особо не вникал, что там происходит в этот момент, ибо времени было очень мало на разработку виджетов. Сейчас уже неделю тестится и обкатку прошло нормально, весь код уже был допилен и ошибок не возникает. Наши группировки, которые на форме, собственно, куда мы добавляли команды не работают. Т.е. они возвращают либо весь список, если мы сидим в Задачи мне, либо уже тот список, который указан при переходе по виджету. В планах их просто скрыть, чтобы глаза не мозолили пользователям, которые любят жать на все кнопки подряд.
Далее, что касается параметров отбора. Данная процедура дергается из процедуры УстановитьПараметрыГруппировкиНаСервере()
Что интересно, в ней уже заранее заложены такие параметры, как ВидПриложения, хотя на форме нет возможности никак получить список задач по какому-то определенному виду документов. Возможно, со временем допилят, а пока текущая версия, на которой все манипуляции делались, это Документооборот КОРП, редакция 3.0 (3.0.7.28). На момент написания статьи это актуальный релиз для ДО 3.0.
Всем спасибо за прочтение данной статьи, надеюсь, она вам была полезной.