В процессе работы с 1С:Документооборотом руководители часто сталкиваются с необходимостью быстрого принятия решений по входящим задачам. Типовой функционал позволяет видеть основную информацию, но для принятия решения по утверждению счета директору бывает важно увидеть резолюции предыдущих согласующих лиц, комментарии финансовых менеджеров или специфические реквизиты документа (например, статью ДДС или регион), не открывая карточку самого документа. В этой статье мы разберем, как программно кастомизировать область просмотра задачи в списке Задачи мне.
Для начала проанализируем, как система формирует содержимое области просмотра. Основная логика сосредоточена в общем модуле ОбзорЗадачВызовСервера. В частности, функция ПолучитьОбзорЗадачиДляСпискаЗадачиМне отвечает за сбор данных и формирование HTML-строки, которая затем отображается пользователю. Чтобы внести изменения правильно, рекомендуется использовать общий модуль ОбзорЗадачВызовСервераПереопределяемый или механизм расширений, чтобы не нарушать возможность типового обновления конфигурации.
Рассмотрим по шагам, как реализовать вывод дополнительных данных.
Чтобы вывести резолюции, нам необходимо обратиться к регистру сведений ИсторияВыполненияЗадач. В этом регистре система фиксирует все действия пользователей по бизнес-процессу. Мы можем использовать типовую функцию ИсторияПоБизнесПроцессу, но для более гибкой настройки (например, если нам нужно отфильтровать только определенные типы задач или вывести данные по иерархии комплексного процесса), лучше написать собственный запрос.
Посмотрим на пример функции, которая собирает историю выполнения для комплексного процесса:
Функция ИсторияПоБизнесПроцессу(БизнесПроцесс)
ИсторияВыполнения = "";
УстановитьПривилегированныйРежим(Истина);
// Запрос для поиска родительского процесса, если текущий является вложенным
ЗапросКомплексный = Новый Запрос;
ЗапросКомплексный.Текст =
"ВЫБРАТЬ
| ДочерниеБизнесПроцессы.РодительскийПроцесс
|ИЗ
| РегистрСведений.ДочерниеБизнесПроцессы КАК ДочерниеБизнесПроцессы
|ГДЕ
| ДочерниеБизнесПроцессы.ДочернийПроцесс = &ДочернийПроцесс";
ЗапросКомплексный.УстановитьПараметр("ДочернийПроцесс", БизнесПроцесс);
РезультатЗапроса = ЗапросКомплексный.Выполнить();
// Формируем запрос к регистру истории
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ИсторияВыполненияЗадач.Описание КАК Описание,
| ИсторияВыполненияЗадач.БизнесПроцесс.Наименование КАК Наименование
|ИЗ
| РегистрСведений.ИсторияВыполненияЗадач КАК ИсторияВыполненияЗадач
|ГДЕ
| ИсторияВыполненияЗадач.БизнесПроцесс = &БизнесПроцесс
|УПОРЯДОЧИТЬ ПО
| ИсторияВыполненияЗадач.БизнесПроцесс.ДатаНачала УБЫВ";
Запрос.УстановитьПараметр("БизнесПроцесс", БизнесПроцесс);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ИсторияВыполнения = ИсторияВыполнения + Символы.ПС + Выборка.Наименование + ": " + Выборка.Описание;
КонецЦикла;
Возврат ИсторияВыполнения;
КонецФункции
Теперь нам нужно внедрить полученные данные в HTML-разметку. Мы будем работать в функции ПолучитьОбзорЗадачиДляСпискаЗадачиМне. Нам важно проверить тип бизнес-процесса, чтобы не перегружать интерфейс лишней информацией в задачах, где это не требуется (например, в простых задачах ознакомления).
Проанализируем пример кода, который добавляет информацию о Статье ДДС и Резолюциях в обзор задачи:
// В общем модуле ОбзорЗадачВызовСервераПереопределяемый
Функция ПолучитьОбзорЗадачиДляСпискаЗадачиМне(РеквизитыЗадачи) Экспорт
// Ограничиваем работу кода только процессом Утверждения
Если ТипЗнч(РеквизитыЗадачи.БизнесПроцесс) <> Тип("БизнесПроцессСсылка.Утверждение") Тогда
Возврат "";
КонецЕсли;
ТекстHTML = ""; // Здесь формируется заголовок и стили HTML (можно скопировать из типовой функции)
// Добавляем статью ДДС, если она заполнена в документе-предмете
Если РеквизитыЗадачи.Свойство("СтатьяДвиженияДенежныхСредств") Тогда
ОбзорОбъектовКлиентСервер.ДобавитьРеквизит(ТекстHTML, НСтр("ru = 'Статья ДДС: '"), РеквизитыЗадачи.СтатьяДвиженияДенежныхСредств);
КонецЕсли;
// Цикл по резолюциям, если они были переданы в структуру реквизитов
Если РеквизитыЗадачи.Свойство("Резолюции") Тогда
Для Каждого Резолюция Из РеквизитыЗадачи.Резолюции Цикл
ТекстРезолюции = Резолюция.АвторРезолюции.Наименование + ": " + Резолюция.ТекстРезолюции;
ОбзорОбъектовКлиентСервер.ДобавитьРеквизит(ТекстHTML, НСтр("ru = 'Резолюция'"), ТекстРезолюции);
КонецЦикла;
КонецЕсли;
// Обработка переносов строк для корректного отображения в HTML
ПолноеОписание = СтрЗаменить(РеквизитыЗадачи.Описание, Символы.ПС, "<br>");
ТекстHTML = ТекстHTML + "<p>" + ПолноеОписание + "</p>";
Возврат ТекстHTML;
КонецФункции
Чтобы функция в общем модуле «увидела» наши новые поля (Резолюции, Статьи ДДС), их нужно предварительно подготовить на стороне формы. В форме списка задач (обычно это ЗадачиИсполнителя.Форма.ЗадачиМне) найдем серверную функцию ОбновитьДанныеЗадачи. Именно здесь заполняется структура РеквизитыЗадачи.
Рассмотрим, как дополнить структуру данных:
&НаСервереБезКонтекста
Функция ОбновитьДанныеЗадачи(Задача, ТекущийПользователь, ...)
// ... Типовой код получения реквизитов ...
Если РеквизитыЗадачи.ПредметДокумент <> Неопределено Тогда
// Читаем статьи ДДС через типовой регистр
СтатьиДДС = Новый ТаблицаЗначений;
РегистрыСведений.СтатьиДвиженияДенежныхСредствДокументов.ПрочитатьСтатьиДокумента(
РеквизитыЗадачи.ПредметДокумент, СтатьиДДС);
Если СтатьиДДС.Количество() > 0 Тогда
РеквизитыЗадачи.Вставить("СтатьяДвиженияДенежныхСредств", СтатьиДДС[0].СтатьяДвиженияДенежныхСредств);
КонецЕсли;
// Получаем резолюции через штатный механизм работы с резолюциями
Резолюции = РаботаСРезолюциями.ПолучитьРезолюции(РеквизитыЗадачи.ПредметДокумент);
РеквизитыЗадачи.Вставить("Резолюции", Резолюции);
КонецЕсли;
// ... Возврат заполненной структуры ...
КонецФункции
При реализации данного функционала важно учитывать не только технические, но и методологические аспекты настройки 1С:Документооборота:
Дополнительные реквизиты документа. При выполнении задачи данные из комментария можно программно записывать в эти реквизиты.ИсторияВыполненияЗадач при каждом обновлении превью может замедлить интерфейс. Рассмотрите возможность кэширования или вывода только самых важных (последних) резолюций.Символы.ПС на тег <br>. Типовой механизм ОбзорОбъектовКлиентСервер.ДобавитьРеквизит хорошо справляется с форматированием пар "Заголовок: Значение", используйте его для сохранения единого стиля интерфейса.Таким образом, комбинируя возможности расширения структуры задачи на форме и кастомизацию HTML-рендеринга в общем модуле, мы можем создать для руководителя максимально информативное рабочее пространство. Это позволяет утверждать документы «в один клик», обладая всей необходимой информацией о результатах предыдущих этапов проверки.