Как вывести текст резолюций и дополнительные данные в список «Задачи мне» в 1С:Документообороте

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

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

Анализ механизмов формирования области просмотра

Для начала проанализируем, как система формирует содержимое области просмотра. Основная логика сосредоточена в общем модуле ОбзорЗадачВызовСервера. В частности, функция ПолучитьОбзорЗадачиДляСпискаЗадачиМне отвечает за сбор данных и формирование HTML-строки, которая затем отображается пользователю. Чтобы внести изменения правильно, рекомендуется использовать общий модуль ОбзорЗадачВызовСервераПереопределяемый или механизм расширений, чтобы не нарушать возможность типового обновления конфигурации.

Рассмотрим по шагам, как реализовать вывод дополнительных данных.

Шаг 1: Получение данных из истории выполнения задач

Чтобы вывести резолюции, нам необходимо обратиться к регистру сведений ИсторияВыполненияЗадач. В этом регистре система фиксирует все действия пользователей по бизнес-процессу. Мы можем использовать типовую функцию ИсторияПоБизнесПроцессу, но для более гибкой настройки (например, если нам нужно отфильтровать только определенные типы задач или вывести данные по иерархии комплексного процесса), лучше написать собственный запрос.

Посмотрим на пример функции, которая собирает историю выполнения для комплексного процесса:


Функция ИсторияПоБизнесПроцессу(БизнесПроцесс)
    ИсторияВыполнения = "";
    УстановитьПривилегированныйРежим(Истина);
    
    // Запрос для поиска родительского процесса, если текущий является вложенным
    ЗапросКомплексный = Новый Запрос;
    ЗапросКомплексный.Текст = 
        "ВЫБРАТЬ
        |   ДочерниеБизнесПроцессы.РодительскийПроцесс
        |ИЗ
        |   РегистрСведений.ДочерниеБизнесПроцессы КАК ДочерниеБизнесПроцессы
        |ГДЕ
        |   ДочерниеБизнесПроцессы.ДочернийПроцесс = &ДочернийПроцесс";
    ЗапросКомплексный.УстановитьПараметр("ДочернийПроцесс", БизнесПроцесс);
    РезультатЗапроса = ЗапросКомплексный.Выполнить();

    // Формируем запрос к регистру истории
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   ИсторияВыполненияЗадач.Описание КАК Описание,
        |   ИсторияВыполненияЗадач.БизнесПроцесс.Наименование КАК Наименование
        |ИЗ
        |   РегистрСведений.ИсторияВыполненияЗадач КАК ИсторияВыполненияЗадач
        |ГДЕ
        |   ИсторияВыполненияЗадач.БизнесПроцесс = &БизнесПроцесс
        |УПОРЯДОЧИТЬ ПО
        |   ИсторияВыполненияЗадач.БизнесПроцесс.ДатаНачала УБЫВ";
    
    Запрос.УстановитьПараметр("БизнесПроцесс", БизнесПроцесс);
    
    Выборка = Запрос.Выполнить().Выбрать();
    Пока Выборка.Следующий() Цикл
        ИсторияВыполнения = ИсторияВыполнения + Символы.ПС + Выборка.Наименование + ": " + Выборка.Описание;
    КонецЦикла;
    
    Возврат ИсторияВыполнения;
КонецФункции

Шаг 2: Модификация вывода HTML в области просмотра

Теперь нам нужно внедрить полученные данные в HTML-разметку. Мы будем работать в функции ПолучитьОбзорЗадачиДляСпискаЗадачиМне. Нам важно проверить тип бизнес-процесса, чтобы не перегружать интерфейс лишней информацией в задачах, где это не требуется (например, в простых задачах ознакомления).

Проанализируем пример кода, который добавляет информацию о Статье ДДС и Резолюциях в обзор задачи:


// В общем модуле ОбзорЗадачВызовСервераПереопределяемый
Функция ПолучитьОбзорЗадачиДляСпискаЗадачиМне(РеквизитыЗадачи) Экспорт
    
    // Ограничиваем работу кода только процессом Утверждения
    Если ТипЗнч(РеквизитыЗадачи.БизнесПроцесс) <> Тип("БизнесПроцессСсылка.Утверждение") Тогда
        Возврат ""; 
    КонецЕсли;

    ТекстHTML = ""; // Здесь формируется заголовок и стили HTML (можно скопировать из типовой функции)

    // Добавляем статью ДДС, если она заполнена в документе-предмете
    Если РеквизитыЗадачи.Свойство("СтатьяДвиженияДенежныхСредств") Тогда
        ОбзорОбъектовКлиентСервер.ДобавитьРеквизит(ТекстHTML, НСтр("ru = 'Статья ДДС: '"), РеквизитыЗадачи.СтатьяДвиженияДенежныхСредств);
    КонецЕсли;

    // Цикл по резолюциям, если они были переданы в структуру реквизитов
    Если РеквизитыЗадачи.Свойство("Резолюции") Тогда
        Для Каждого Резолюция Из РеквизитыЗадачи.Резолюции Цикл
            ТекстРезолюции = Резолюция.АвторРезолюции.Наименование + ": " + Резолюция.ТекстРезолюции;
            ОбзорОбъектовКлиентСервер.ДобавитьРеквизит(ТекстHTML, НСтр("ru = 'Резолюция'"), ТекстРезолюции);
        КонецЦикла;
    КонецЕсли;

    // Обработка переносов строк для корректного отображения в HTML
    ПолноеОписание = СтрЗаменить(РеквизитыЗадачи.Описание, Символы.ПС, "<br>");
    ТекстHTML = ТекстHTML + "<p>" + ПолноеОписание + "</p>";

    Возврат ТекстHTML;
КонецФункции

Шаг 3: Передача данных из формы в функцию обзора

Чтобы функция в общем модуле «увидела» наши новые поля (Резолюции, Статьи ДДС), их нужно предварительно подготовить на стороне формы. В форме списка задач (обычно это ЗадачиИсполнителя.Форма.ЗадачиМне) найдем серверную функцию ОбновитьДанныеЗадачи. Именно здесь заполняется структура РеквизитыЗадачи.

Рассмотрим, как дополнить структуру данных:


&НаСервереБезКонтекста
Функция ОбновитьДанныеЗадачи(Задача, ТекущийПользователь, ...)
    // ... Типовой код получения реквизитов ...
    
    Если РеквизитыЗадачи.ПредметДокумент <> Неопределено Тогда
        // Читаем статьи ДДС через типовой регистр
        СтатьиДДС = Новый ТаблицаЗначений;
        РегистрыСведений.СтатьиДвиженияДенежныхСредствДокументов.ПрочитатьСтатьиДокумента(
            РеквизитыЗадачи.ПредметДокумент, СтатьиДДС);
        
        Если СтатьиДДС.Количество() > 0 Тогда
            РеквизитыЗадачи.Вставить("СтатьяДвиженияДенежныхСредств", СтатьиДДС[0].СтатьяДвиженияДенежныхСредств);
        КонецЕсли;

        // Получаем резолюции через штатный механизм работы с резолюциями
        Резолюции = РаботаСРезолюциями.ПолучитьРезолюции(РеквизитыЗадачи.ПредметДокумент);
        РеквизитыЗадачи.Вставить("Резолюции", Резолюции);
    КонецЕсли;
    
    // ... Возврат заполненной структуры ...
КонецФункции

Методологические нюансы и рекомендации

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

  1. Выбор процесса: Согласование против Ознакомления. Как выяснилось в обсуждении, использование процесса «Ознакомление» для проверки данных финансовыми менеджерами — не лучшая практика. В «Ознакомлении» автор процесса не получает автоматического фидбека. Рекомендуется использовать процесс Согласование. В этом случае все комментарии согласующих лиц будут автоматически собираться в «Листе согласования», который гораздо проще выводить в область обзора.
  2. Использование дополнительных реквизитов. Если менеджеры должны заполнять статью ДДС или регион в процессе обработки документа, эти поля должны быть настроены как Дополнительные реквизиты документа. При выполнении задачи данные из комментария можно программно записывать в эти реквизиты.
  3. Производительность. Вывод истории по бизнес-процессу в динамический список — ресурсоемкая операция. Если в системе одновременно работают сотни пользователей и база данных велика, прямой запрос к регистру ИсторияВыполненияЗадач при каждом обновлении превью может замедлить интерфейс. Рассмотрите возможность кэширования или вывода только самых важных (последних) резолюций.
  4. Оформление HTML. Для того чтобы строки переносились корректно, обязательно заменяйте Символы.ПС на тег <br>. Типовой механизм ОбзорОбъектовКлиентСервер.ДобавитьРеквизит хорошо справляется с форматированием пар "Заголовок: Значение", используйте его для сохранения единого стиля интерфейса.

Таким образом, комбинируя возможности расширения структуры задачи на форме и кастомизацию HTML-рендеринга в общем модуле, мы можем создать для руководителя максимально информативное рабочее пространство. Это позволяет утверждать документы «в один клик», обладая всей необходимой информацией о результатах предыдущих этапов проверки.

← На главную