Как реализовать учет задач в 1С:Предприятии с использованием автоматизированного рабочего места?

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

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

Выбор базового объекта метаданных для задач: Документ или Задача?

Одним из первых и наиболее важных шагов при разработке системы учета задач является выбор подходящего объекта метаданных. От этого решения будет зависеть дальнейшая архитектура и сложность реализации функционала. В 1С мы имеем несколько вариантов: использование обычного <сode>Документа или <сode>Справочника, либо применение специализированного объекта метаданных <сode>Задача в связке с <сode>Бизнес-процессами.

Подход 1: Использование Документа или Справочника

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

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

  2. Преимущества: Простота разработки, быстрое освоение, минимальный объем кода. Мы можем быстро добавить необходимые реквизиты и начать работу.

  3. Недостатки: Отсутствие встроенных механизмов для сложной маршрутизации, делегирования и контроля выполнения, которые есть у <сode>Задач в связке с <сode>Бизнес-процессами.

  4. Пример реквизитов:

    Если мы выбираем <сode>Документ или <сode>Справочник для хранения задач, нам понадобятся следующие основные реквизиты:

    • ОписаниеЗадачи (Строка Неограниченной длины): Для детального описания сути задачи.
    • Автор (СправочникСсылка.Пользователи или СправочникСсылка.Сотрудники): Кто поставил задачу.
    • Ответственный (СправочникСсылка.Пользователи или СправочникСсылка.Сотрудники): Кому назначена задача.
    • ДатаСоздания (Дата): Дата и время постановки задачи.
    • ДатаЗавершенияПлан (Дата): Планируемая дата, до которой задача должна быть выполнена.
    • ДатаЗавершенияФакт (Дата): Фактическая дата выполнения задачи.
    • СтатусЗадачи (ПеречислениеСсылка.СтатусыЗадач): Например, "Новая", "В работе", "Исполнена", "Отменена", "Просрочена".
    • Важность (ПеречислениеСсылка.ВажностьЗадачи): Например, "Низкая", "Обычная", "Высокая", "Критическая".

    Для создания статусов мы создадим новое <сode>Перечисление с необходимыми значениями.

Подход 2: Использование объекта метаданных "Задача" в связке с Бизнес-процессами

Этот подход является более мощным и гибким, но требует более глубокого понимания платформы и наличия <сode>Бизнес-процессов в конфигурации.

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

  2. Преимущества:

    • Встроенный функционал: Платформа 1С предоставляет готовые механизмы для работы с задачами, их адресацией, контролем исполнения, историей выполнения.
    • Гибкость: Мы можем описывать сложные бизнес-процессы, в рамках которых будут формироваться задачи для различных исполнителей.
    • Трассируемость: Все действия по задаче (кому назначена, когда выполнена, кем принята) фиксируются автоматически.
    • Интеграция: Задачи могут быть созданы как вручную, так и на основании других объектов системы (документов, писем, мероприятий).

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

  3. Недостатки: Более высокая сложность начальной разработки и настройки. Требует проектирования <сode>Бизнес-процессов, что может быть избыточным для очень простых задач.

В контексте поставленной задачи, где требуется не только учет, но и анализ продуктивности, а также возможности для руководителя, использование <сode>Документа или <сode>Справочника будет достаточным для базовой реализации, но при дальнейшем расширении функционала (особенно с учетом сложной логики) мы можем столкнуться с необходимостью пересмотра архитектуры в сторону <сode>Бизнес-процессов. Начнем с более простого подхода на основе <сode>Документа (например, <сode>Документ.ЗадачаСотруднику), так как он позволяет реализовать все исходные требования без усложнения.

Реализация автоматизированного рабочего места (АРМ) пользователя

Автоматизированное рабочее место (АРМ) — это единый, удобный интерфейс для работы пользователя с задачами. При старте программы у пользователя должно открываться именно такое АРМ, где он может выполнять все необходимые действия.

Создание формы АРМ

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

Нам понадобится разместить на форме следующие элементы:

  1. Переключатели или кнопки: Для удобного выбора режима просмотра задач ("Задачи мне", "Задачи от меня", "Все задачи") (сообщение 13). Это позволит быстро переключаться между различными списками.

  2. Динамический список: Основной элемент для отображения списка задач. Мы будем использовать один <сode>ДинамическийСписок, который будем динамически настраивать (менять отборы) в зависимости от выбранного режима просмотра.

  3. Поля для отбора: Элементы управления (поля ввода) для установки дополнительных отборов по статусу, периоду назначения, периоду исполнения.

  4. Кнопки действий: "Создать задачу", "Изменить статус", "Выполнить задачу" и т.д.

Настройка динамических списков и отборов

<сode>ДинамическийСписок — это мощный инструмент в 1С для отображения данных из различных источников, таких как документы, справочники, регистры. Он позволяет гибко настраивать отборы, сортировки и группировки (дополнительная информация).

Для реализации требований пользователя, нам необходимо настроить отборы таким образом, чтобы показывать:

  1. Задачи, назначенные текущему пользователю ("Задачи мне"): Мы устанавливаем отбор по полю <сode>Ответственный (или <сode>Исполнитель, если используем метаданные <сode>Задача), сравнивая его с текущим пользователем системы.

  2. Задачи, созданные текущим пользователем ("Задачи от меня"): Мы устанавливаем отбор по полю <сode>Автор, сравнивая его с текущим пользователем системы.

Эти отборы устанавливаются программно при создании формы на сервере (<сode>ПриСозданииНаСервере) или при изменении режима просмотра списка (например, по нажатию кнопок "Задачи мне", "Задачи от меня") (сообщение 7, 12).

Мы можем установить отбор в динамическом списке без написания сложного запроса, используя стандартные механизмы <сode>КомпоновкиДанных, на которых базируется <сode>ДинамическийСписок (сообщение 9, 11, 12).

Пример программного отбора для ДинамическогоСписка:

Допустим, у нас есть <сode>ДинамическийСписок с именем <сode>СписокЗадач. В обработчике события, например, при нажатии кнопки "Задачи мне" или при инициализации формы, мы можем настроить отбор следующим образом:


// В процедуре-обработчике события, например, ПриСозданииНаСервере или при переключении вида списка
// Предполагаем, что СписокЗадач - это имя элемента ДинамическийСписок на форме

// Очищаем существующие элементы отбора, чтобы не накапливались
Элементы.СписокЗадач.Отбор.Элементы.Очистить();

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

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

// Аналогично для периодов
Если НачалоПериодаОтбора.Истина() И КонецПериодаОтбора.Истина() Тогда
    // Отбор по диапазону дат создания
    ЭлементОтбораДатаСоздания = Элементы.СписокЗадач.Отбор.Элементы.Добавить(ВидСравнения.Между);
    ЭлементОтбораДатаСоздания.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ДатаСоздания");
    ЭлементОтбораДатаСоздания.ПравоеЗначение = НачалоПериодаОтбора;
    ЭлементОтбораДатаСоздания.ВидСравнения = ВидСравнения.Между;
    ЭлементОтбораДатаСоздания.ПравоеЗначение = КонецПериодаОтбора;
    ЭлементОтбораДатаСоздания.Использование = Истина;
КонецЕсли;

После изменения отбора нам может потребоваться обновить список, вызвав метод Элементы.СписокЗадач.Обновить().

Визуальное выделение задач: Условное оформление

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

Цели условного оформления:

  1. Выделение задач, срок которых подходит к концу (1 день): Это требование из первого сообщения. Такие задачи должны быть заметны, например, красным цветом.

  2. Визуализация статуса исполнения: Мы можем использовать разные цвета или стили шрифта для задач в статусах "Новая", "В работе", "Исполнена" и "Просрочена".

Как настроить условное оформление:

Условное оформление можно настроить двумя способами (дополнительная информация):

  1. Интерактивно: Через меню формы списка "Еще" – "Настроить список". Этот способ подходит для пользовательской настройки, но в рамках АРМ, где мы хотим обеспечить единообразие для всех пользователей, предпочтительнее программный подход.

  2. Программно: В процедуре ПриСозданииНаСервере формы. Это позволяет нам жестко задать правила оформления, которые будут применяться для всех пользователей АРМ.

Пример программного условного оформления для выделения "горящих" задач:

Мы хотим, чтобы задачи, срок завершения которых истекает сегодня или завтра (т.е. ДатаЗавершенияПлан <= ТекущаяДата() + 1 день), выделялись, если они еще не выполнены.


// В процедуре ПриСозданииНаСервере формы АРМ
// Предполагаем, что СписокЗадач - это имя элемента ДинамическийСписок на форме

// 1. Создаем новый элемент условного оформления
ЭлементОформления = Элементы.СписокЗадач.УсловноеОформление.Элементы.Добавить();

// 2. Определяем условие оформления
// Задача должна быть не выполнена И (ДатаЗавершенияПлан <= Сегодня + 1 день)

// Условие 1: ДатаЗавершенияПлан <= ТекущаяДата() + 1 день
УсловиеСрока = ЭлементОформления.Условие.Элементы.Добавить(ВидСравненияКомпоновкиДанных.МеньшеИлиРавно);
УсловиеСрока.ЛевоеЗначение  = Новый ПолеКомпоновкиДанных("ДатаЗавершенияПлан");
// ТекущаяДата() возвращает дату и время. Прибавим 24 часа для охвата "завтрашнего" дня.
// 86400 - это количество секунд в одном дне.
УсловиеСрока.ПравоеЗначение = ТекущаяДата() + 86400; 
УсловиеСрока.Использование   = Истина;

// Условие 2: СтатусЗадачи <> "Исполнена"
УсловиеСтатуса = ЭлементОформления.Условие.Элементы.Добавить(ВидСравненияКомпоновкиДанных.НеРавно);
УсловиеСтатуса.ЛевоеЗначение  = Новый ПолеКомпоновкиДанных("СтатусЗадачи");
// Получаем значение перечисления "Исполнена"
УсловиеСтатуса.ПравоеЗначение = Перечисления.СтатусыЗадач.Исполнена; 
УсловиеСтатуса.Использование   = Истина;

// 3. Определяем оформление, которое будет применено при выполнении условий
// Мы хотим, чтобы фон строки был светло-красным, а шрифт жирным.
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветФона", Новый Цвет(255, 200, 200)); // R, G, B
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Шрифт", Новый Шрифт(,,Истина)); // Последний параметр - жирный шрифт

// 4. Активируем элемент условного оформления
ЭлементОформления.Использование = Истина;

// Мы можем добавить и другие правила. Например, для просроченных задач:
ЭлементОформленияПросрочка = Элементы.СписокЗадач.УсловноеОформление.Элементы.Добавить();

// Условие: ДатаЗавершенияПлан < ТекущаяДата() И СтатусЗадачи <> "Исполнена"
УсловиеСрокаПросрочка = ЭлементОформленияПросрочка.Условие.Элементы.Добавить(ВидСравненияКомпоновкиДанных.Меньше);
УсловиеСрокаПросрочка.ЛевоеЗначение  = Новый ПолеКомпоновкиДанных("ДатаЗавершенияПлан");
УсловиеСрокаПросрочка.ПравоеЗначение = ТекущаяДата(); 
УсловиеСрокаПросрочка.Использование   = Истина;

УсловиеСтатусаПросрочка = ЭлементОформленияПросрочка.Условие.Элементы.Добавить(ВидСравненияКомпоновкиДанных.НеРавно);
УсловиеСтатусаПросрочка.ЛевоеЗначение  = Новый ПолеКомпоновкиДанных("СтатусЗадачи");
УсловиеСтатусаПросрочка.ПравоеЗначение = Перечисления.СтатусыЗадач.Исполнена; 
УсловиеСтатусаПросрочка.Использование   = Истина;

ЭлементОформленияПросрочка.Оформление.УстановитьЗначениеПараметра("ЦветФона", Новый Цвет(255, 150, 150)); // Более насыщенный красный
ЭлементОформленияПросрочка.Оформление.УстановитьЗначениеПараметра("Шрифт", Новый Шрифт(,,Истина)); // Жирный шрифт
ЭлементОформленияПросрочка.Использование = Истина;

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

Расширение функционала: Анализ продуктивности и отчеты руководителя

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

Учет трудозатрат и "часов руководителя"

Для анализа продуктивности ключевым является учет времени, затраченного на выполнение задач. Мы добавим новые реквизиты в наш документ задачи, чтобы хранить эту информацию.

  1. Добавление реквизитов в объект задачи:

    • ФактическоеВремя (Число, Точность: 2, Единица измерения: Часы): Фактическое время, затраченное сотрудником на выполнение задачи.
    • ОценкаРуководителяЧасы (Число, Точность: 2, Единица измерения: Часы): Оценка времени, которое, по мнению руководителя, потребовалось бы для выполнения этой задачи. Этот показатель может служить для нормирования и оценки сложности задач.
    • ДатаНачалаРаботы (Дата и время): Время, когда сотрудник фактически приступил к работе над задачей.
    • ДатаОкончанияРаботы (Дата и время): Время, когда сотрудник фактически завершил работу над задачей.

  2. Методы ввода трудозатрат:

    • Хронометраж: Сотрудник при начале работы над задачей фиксирует <сode>ДатаНачалаРаботы, а по завершении — <сode>ДатаОкончанияРаботы. <сode>ФактическоеВремя рассчитывается автоматически как разница.
    • Постфактум: Сотрудник вручную указывает <сode>ФактическоеВремя после выполнения задачи.
    • Оценка руководителя: Руководитель вводит значение в поле <сode>ОценкаРуководителяЧасы для задач, которые еще не были оценены.

    Мы можем реализовать напоминания сотрудникам о необходимости внести трудозатраты при изменении статуса задачи на "Исполнена" (дополнительная информация).

Интерфейс руководителя

Для руководителя нам понадобится отдельное АРМ или раздел в существующем, который будет максимально информативен и автоматизирован. Руководитель должен видеть все неоцененные задачи и иметь возможность быстро ввести "часы руководителя" по ним.

  1. Создание формы АРМ руководителя: Это может быть отдельная форма, аналогичная АРМ сотрудника, но с другим набором функционала и отборов.

  2. Список неоцененных задач: На форме мы размещаем <сode>ДинамическийСписок со всеми задачами, но с постоянным отбором по условию ОценкаРуководителяЧасы = NULL. Это позволит руководителю видеть только те задачи, которые требуют его оценки.

  3. Механизм ввода оценки:

    • Рядом с каждой задачей в списке или в отдельной области формы при выборе задачи, мы размещаем поле ввода для <сode>ОценкаРуководителяЧасы и кнопку "Сохранить оценку".
    • При сохранении оценки, мы записываем ее в соответствующий реквизит документа задачи.

  4. Информационные виджеты: Дополнительно, мы можем разместить на АРМ руководителя виджеты, показывающие:

    • Общее количество просроченных задач.
    • Список сотрудников с наибольшим количеством просрочек.
    • Общую загрузку отдела.

    Эти виджеты могут быть реализованы на основе <сode>ДинамическихСписков или отчетов <сode>СКД.

Построение отчетов по продуктивности

Для создания отчетов мы будем использовать <сode>Систему Компоновки Данных (СКД), которая является стандартным и наиболее гибким инструментом 1С для построения отчетов любой сложности.

Отчеты позволят нам анализировать:

  1. Количество просроченных задач: По сотрудникам, отделам, за период. Условие: ДатаЗавершенияФакт > ДатаЗавершенияПлан или ТекущаяДата() > ДатаЗавершенияПлан И СтатусЗадачи <> Перечисления.СтатусыЗадач.Исполнена.

  2. Количество задач, выполненных раньше срока: Условие: ДатаЗавершенияФакт < ДатаЗавершенияПлан.

  3. Общее время по задачам: Суммарное <сode>ФактическоеВремя и <сode>ОценкаРуководителяЧасы по каждому сотруднику или по всем задачам.

  4. Коэффициент продуктивности: Это может быть отношение Сумма(ОценкаРуководителяЧасы) / Сумма(ФактическоеВремя). Значение больше 1 может указывать на то, что сотрудник тратит больше времени, чем предполагалось, а меньше 1 — на более эффективную работу или недооценку сложности задачи.

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

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

Заключение

Реализация системы учета задач в 1С — это многоэтапный процесс, требующий внимательного выбора базовых объектов, грамотного проектирования интерфейсов и продуманной логики отчетов. Используя <сode>Документы для хранения задач, <сode>ДинамическиеСписки для АРМ, <сode>УсловноеОформление для визуализации и <сode>СКД для отчетов, мы можем создать мощное и гибкое решение, которое удовлетворит все поставленные требования, включая анализ продуктивности сотрудников и автоматизированный интерфейс для руководителя. Платформа 1С предоставляет все необходимые инструменты для создания такого комплексного решения.

← На главную