Как вывести персональный список невыполненных задач на начальную страницу в 1С 8.3?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

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

Способ 1. Программная установка отбора в динамическом списке формы

Проанализируем базовый подход. Если в конфигурации задачи назначаются непосредственно на конкретных пользователей через реквизит (например, Исполнитель), то ограничение списка можно реализовать в процедуре формы без необходимости создавать отдельный объект метаданных.

Чтобы обычный пользователь не мог снять этот отбор через стандартную панель или окно «Настройка списка», рекомендуется использовать коллекцию ФиксированныеНастройки. Настройки из этой коллекции применяются платформой поверх любых пользовательских фильтров и не могут быть отключены в пользовательском режиме.

Посмотрим на пример кода в модуле формы списка задач в обработчике ПриСозданииНаСервере:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Проверяем, нужно ли применять ограничения (например, проверяем роль или параметр открытия)
    Если Не РольДоступна("ПолныеПрава") Тогда
        
        // 1. Отбор по невыполненным задачам
        ЭлементОтбораСостояние = Список.ФиксированныеНастройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
        ЭлементОтбораСостояние.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Выполнена");
        ЭлементОтбораСостояние.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
        ЭлементОтбораСостояние.ПравоеЗначение = Ложь;
        ЭлементОтбораСостояние.Использование = Истина;
        
        // 2. Отбор по текущему пользователю
        ТекущийПользовательИБ = ПользователиИнформационнойБазы.ТекущийПользователь();
        // В зависимости от конфигурации получаем ссылку на справочник Пользователи
        СсылкаНаПользователя = Справочники.Пользователи.НайтиПоНаименованию(ТекущийПользовательИБ.Имя);
        
        ЭлементОтбораИсполнитель = Список.ФиксированныеНастройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
        ЭлементОтбораИсполнитель.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Исполнитель");
        ЭлементОтбораИсполнитель.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
        ЭлементОтбораИсполнитель.ПравоеЗначение = СсылкаНаПользователя;
        ЭлементОтбораИсполнитель.Использование = Истина;
        
    КонецЕсли;

КонецПроцедуры

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

Способ 2. Использование механизма ролевой адресации и виртуальной таблицы

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

Для корректной работы с механизмом адресации разработчики используют виртуальную таблицу Задача.[ИмяЗадачи].ЗадачиПоИсполнителю. Разберем по шагам, как настроить динамический список:

  1. В свойствах динамического списка формы включаем флаг Произвольный запрос.
  2. В тексте запроса обращаемся к виртуальной таблице задач по исполнителю, передавая в параметры текущего пользователя.
  3. Добавляем фильтрацию по признаку завершения задачи.

Посмотрим на пример текста запроса динамического списка:


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

В серверном обработчике формы ПриСозданииНаСервере передаем значение параметра в список с помощью метода Список.Параметры.УстановитьЗначениеПараметра():


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    ТекущийСотрудник = Справочники.Пользователи.НайтиПоНаименованию(ПользователиИнформационнойБазы.ТекущийПользователь().Имя);
    Список.Параметры.УстановитьЗначениеПараметра("ТекущийСотрудник", ТекущийСотрудник);
    
КонецПроцедуры

Способ 3. Ограничение на уровне записей (RLS)

Рассмотрим альтернативный вариант системной защиты данных. Если бизнес-логика предприятия строго запрещает сотрудникам видеть чужие задачи в любых списках, отчетах и при поиске, отборы формы не обеспечивают полной изоляции. В таких сценариях настраивается механизм RLS (Record Level Security) в ролях пользователей.

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

Организация обновления задач на начальной странице

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

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

Сочетание виртуальной таблицы адресации или фиксированного отбора с регулярным обновлением позволяет создать удобное, производительное и безопасное рабочее место пользователя на начальной странице 1С.

← На главную