Мы рассмотрим подробный подход к созданию эффективной системы учета задач в 1С:Предприятии, которая позволит сотрудникам ставить друг другу задачи, отслеживать их статус и оценивать продуктивность. Изначальная задача, сформулированная пользователем, включала в себя возможность создания задач с указанием ответственного, сроков и описания, а также отслеживание статуса исполнения и выделение задач с подходящим сроком завершения. Впоследствии требования расширились до анализа продуктивности сотрудников и создания специализированного интерфейса для руководителя. Разберем, как реализовать все эти функции, используя мощь платформы 1С.
Одним из первых и наиболее важных шагов при разработке системы учета задач является выбор подходящего объекта метаданных. От этого решения будет зависеть дальнейшая архитектура и сложность реализации функционала. В 1С мы имеем несколько вариантов: использование обычного Документа или Справочника, либо применение специализированного объекта метаданных Задача в связке с Бизнес-процессами.
Подход 1: Использование Документа или Справочника
Этот подход является наиболее простым и быстрым в реализации. Мы выбираем его, когда задачи не требуют сложной маршрутизации, строгих этапов выполнения или тесной интеграции с многоступенчатыми бизнес-процессами. По сути, каждая задача будет отдельной записью в системе.
Когда подходит: Для простых поручений, не требующих жесткой последовательности действий, или когда вы хотите максимально быстро получить базовый функционал.
Преимущества: Простота разработки, быстрое освоение, минимальный объем кода. Мы можем быстро добавить необходимые реквизиты и начать работу.
Недостатки: Отсутствие встроенных механизмов для сложной маршрутизации, делегирования и контроля выполнения, которые есть у Задач в связке с Бизнес-процессами.
Пример реквизитов:
Если мы выбираем Документ или Справочник для хранения задач, нам понадобятся следующие основные реквизиты:
ОписаниеЗадачи (Строка Неограниченной длины): Для детального описания сути задачи.Автор (СправочникСсылка.Пользователи или СправочникСсылка.Сотрудники): Кто поставил задачу.Ответственный (СправочникСсылка.Пользователи или СправочникСсылка.Сотрудники): Кому назначена задача.ДатаСоздания (Дата): Дата и время постановки задачи.ДатаЗавершенияПлан (Дата): Планируемая дата, до которой задача должна быть выполнена.ДатаЗавершенияФакт (Дата): Фактическая дата выполнения задачи.СтатусЗадачи (ПеречислениеСсылка.СтатусыЗадач): Например, "Новая", "В работе", "Исполнена", "Отменена", "Просрочена".Важность (ПеречислениеСсылка.ВажностьЗадачи): Например, "Низкая", "Обычная", "Высокая", "Критическая".Для создания статусов мы создадим новое Перечисление с необходимыми значениями.
Подход 2: Использование объекта метаданных "Задача" в связке с Бизнес-процессами
Этот подход является более мощным и гибким, но требует более глубокого понимания платформы и наличия Бизнес-процессов в конфигурации.
Когда подходит: Если наша система задач подразумевает сложную маршрутизацию, строгий контроль этапов, делегирование, создание цепочек задач или привязку задач к другим объектам системы (например, к документам поступления товаров или входящим письмам).
Преимущества:
В конфигурациях, таких как 1С:Документооборот, объект Задача используется для реализации всех видов поручений и взаимодействий. Вся информация о задаче (состояние, сроки, исполнители, дата создания, файлы) отображается в едином списке, а также доступна история выполнения задачи.
Недостатки: Более высокая сложность начальной разработки и настройки. Требует проектирования Бизнес-процессов, что может быть избыточным для очень простых задач.
В контексте поставленной задачи, где требуется не только учет, но и анализ продуктивности, а также возможности для руководителя, использование Документа или Справочника будет достаточным для базовой реализации, но при дальнейшем расширении функционала (особенно с учетом сложной логики) мы можем столкнуться с необходимостью пересмотра архитектуры в сторону Бизнес-процессов. Начнем с более простого подхода на основе Документа (например, Документ.ЗадачаСотруднику), так как он позволяет реализовать все исходные требования без усложнения.
Автоматизированное рабочее место (АРМ) — это единый, удобный интерфейс для работы пользователя с задачами. При старте программы у пользователя должно открываться именно такое АРМ, где он может выполнять все необходимые действия.
Создание формы АРМ
Для АРМ мы можем использовать либо ФормуСписка нашего документа (например, Документ.ЗадачаСотруднику), либо создать произвольную Форму (сообщение 17) и разместить на ней все необходимые элементы. В случае произвольной формы, мы получим большую гибкость в размещении элементов управления и информационных блоков. Рекомендуем начать с произвольной формы.
Нам понадобится разместить на форме следующие элементы:
Переключатели или кнопки: Для удобного выбора режима просмотра задач ("Задачи мне", "Задачи от меня", "Все задачи") (сообщение 13). Это позволит быстро переключаться между различными списками.
Динамический список: Основной элемент для отображения списка задач. Мы будем использовать один ДинамическийСписок, который будем динамически настраивать (менять отборы) в зависимости от выбранного режима просмотра.
Поля для отбора: Элементы управления (поля ввода) для установки дополнительных отборов по статусу, периоду назначения, периоду исполнения.
Кнопки действий: "Создать задачу", "Изменить статус", "Выполнить задачу" и т.д.
Настройка динамических списков и отборов
ДинамическийСписок — это мощный инструмент в 1С для отображения данных из различных источников, таких как документы, справочники, регистры. Он позволяет гибко настраивать отборы, сортировки и группировки (дополнительная информация).
Для реализации требований пользователя, нам необходимо настроить отборы таким образом, чтобы показывать:
Задачи, назначенные текущему пользователю ("Задачи мне"): Мы устанавливаем отбор по полю Ответственный (или Исполнитель, если используем метаданные Задача), сравнивая его с текущим пользователем системы.
Задачи, созданные текущим пользователем ("Задачи от меня"): Мы устанавливаем отбор по полю Автор, сравнивая его с текущим пользователем системы.
Эти отборы устанавливаются программно при создании формы на сервере (ПриСозданииНаСервере) или при изменении режима просмотра списка (например, по нажатию кнопок "Задачи мне", "Задачи от меня") (сообщение 7, 12).
Мы можем установить отбор в динамическом списке без написания сложного запроса, используя стандартные механизмы КомпоновкиДанных, на которых базируется ДинамическийСписок (сообщение 9, 11, 12).
Пример программного отбора для ДинамическогоСписка:
Допустим, у нас есть ДинамическийСписок с именем СписокЗадач. В обработчике события, например, при нажатии кнопки "Задачи мне" или при инициализации формы, мы можем настроить отбор следующим образом:
// В процедуре-обработчике события, например, ПриСозданииНаСервере или при переключении вида списка
// Предполагаем, что СписокЗадач - это имя элемента ДинамическийСписок на форме
// Очищаем существующие элементы отбора, чтобы не накапливались
Элементы.СписокЗадач.Отбор.Элементы.Очистить();
// Определяем текущий вид списка (например, через переменную формы ТекущийВидСписка)
Если ТекущийВидСписка = "Мне" Тогда
// Создаем новый элемент отбора для поля Ответственный
ЭлементОтбора = Элементы.СписокЗадач.Отбор.Элементы.Добавить(ВидСравнения.Равно);
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Ответственный"); // Имя поля в источнике данных
ЭлементОтбора.ПравоеЗначение = ПараметрыСеанса.ТекущийПользователь; // Текущий пользователь системы
ЭлементОтбора.Использование = Истина;
ИначеЕсли ТекущийВидСписка = "ОтМеня" Тогда
// Создаем новый элемент отбора для поля Автор
ЭлементОтбора = Элементы.СписокЗадач.Отбор.Элементы.Добавить(ВидСравнения.Равно);
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Автор"); // Имя поля в источнике данных
ЭлементОтбора.ПравоеЗначение = ПараметрыСеанса.ТекущийПользователь;
ЭлементОтбора.Использование = Истина;
ИначеЕсли ТекущийВидСписка = "Все" Тогда
// В этом случае отбор по пользователю не нужен, просто выводим все задачи
// Элементы.СписокЗадач.Отбор.Элементы.Очистить() уже было вызвано
КонецЕсли;
// Также можно добавить отборы по статусу, периоду назначения, периоду исполнения
// Для этого нам понадобятся соответствующие поля ввода на форме.
// Например, если есть поле ввода "СтатусЗадачиДляОтбора"
Если Не СтатусЗадачиДляОтбора.Пустая() Тогда
ЭлементОтбораСтатус = Элементы.СписокЗадач.Отбор.Элементы.Добавить(ВидСравнения.Равно);
ЭлементОтбораСтатус.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СтатусЗадачи");
ЭлементОтбораСтатус.ПравоеЗначение = СтатусЗадачиДляОтбора;
ЭлементОтбораСтатус.Использование = Истина;
КонецЕсли;
// Аналогично для периодов
Если НачалоПериодаОтбора.Истина() И КонецПериодаОтбора.Истина() Тогда
// Отбор по диапазону дат создания
ЭлементОтбораДатаСоздания = Элементы.СписокЗадач.Отбор.Элементы.Добавить(ВидСравнения.Между);
ЭлементОтбораДатаСоздания.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ДатаСоздания");
ЭлементОтбораДатаСоздания.ПравоеЗначение = НачалоПериодаОтбора;
ЭлементОтбораДатаСоздания.ВидСравнения = ВидСравнения.Между;
ЭлементОтбораДатаСоздания.ПравоеЗначение = КонецПериодаОтбора;
ЭлементОтбораДатаСоздания.Использование = Истина;
КонецЕсли;
После изменения отбора нам может потребоваться обновить список, вызвав метод Элементы.СписокЗадач.Обновить().
Для того чтобы пользователь мог быстро ориентироваться в списке задач и обращать внимание на наиболее важные или "горящие" из них, мы используем механизм условного оформления (дополнительная информация). С его помощью мы можем визуально выделять строки или поля в списках в зависимости от определенных условий, например, менять цвет текста, цвет фона или шрифт.
Цели условного оформления:
Выделение задач, срок которых подходит к концу (1 день): Это требование из первого сообщения. Такие задачи должны быть заметны, например, красным цветом.
Визуализация статуса исполнения: Мы можем использовать разные цвета или стили шрифта для задач в статусах "Новая", "В работе", "Исполнена" и "Просрочена".
Как настроить условное оформление:
Условное оформление можно настроить двумя способами (дополнительная информация):
Интерактивно: Через меню формы списка "Еще" – "Настроить список". Этот способ подходит для пользовательской настройки, но в рамках АРМ, где мы хотим обеспечить единообразие для всех пользователей, предпочтительнее программный подход.
Программно: В процедуре ПриСозданииНаСервере формы. Это позволяет нам жестко задать правила оформления, которые будут применяться для всех пользователей АРМ.
Пример программного условного оформления для выделения "горящих" задач:
Мы хотим, чтобы задачи, срок завершения которых истекает сегодня или завтра (т.е. ДатаЗавершенияПлан <= ТекущаяДата() + 1 день), выделялись, если они еще не выполнены.
// В процедуре ПриСозданииНаСервере формы АРМ
// Предполагаем, что СписокЗадач - это имя элемента ДинамическийСписок на форме
// 1. Создаем новый элемент условного оформления
ЭлементОформления = Элементы.СписокЗадач.УсловноеОформление.Элементы.Добавить();
// 2. Определяем условие оформления
// Задача должна быть не выполнена И (ДатаЗавершенияПлан <= Сегодня + 1 день)
// Условие 1: ДатаЗавершенияПлан <= ТекущаяДата() + 1 день
УсловиеСрока = ЭлементОформления.Условие.Элементы.Добавить(ВидСравненияКомпоновкиДанных.МеньшеИлиРавно);
УсловиеСрока.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ДатаЗавершенияПлан");
// ТекущаяДата() возвращает дату и время. Прибавим 24 часа для охвата "завтрашнего" дня.
// 86400 - это количество секунд в одном дне.
УсловиеСрока.ПравоеЗначение = ТекущаяДата() + 86400;
УсловиеСрока.Использование = Истина;
// Условие 2: СтатусЗадачи <> "Исполнена"
УсловиеСтатуса = ЭлементОформления.Условие.Элементы.Добавить(ВидСравненияКомпоновкиДанных.НеРавно);
УсловиеСтатуса.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СтатусЗадачи");
// Получаем значение перечисления "Исполнена"
УсловиеСтатуса.ПравоеЗначение = Перечисления.СтатусыЗадач.Исполнена;
УсловиеСтатуса.Использование = Истина;
// 3. Определяем оформление, которое будет применено при выполнении условий
// Мы хотим, чтобы фон строки был светло-красным, а шрифт жирным.
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветФона", Новый Цвет(255, 200, 200)); // R, G, B
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Шрифт", Новый Шрифт(,,Истина)); // Последний параметр - жирный шрифт
// 4. Активируем элемент условного оформления
ЭлементОформления.Использование = Истина;
// Мы можем добавить и другие правила. Например, для просроченных задач:
ЭлементОформленияПросрочка = Элементы.СписокЗадач.УсловноеОформление.Элементы.Добавить();
// Условие: ДатаЗавершенияПлан < ТекущаяДата() И СтатусЗадачи <> "Исполнена"
УсловиеСрокаПросрочка = ЭлементОформленияПросрочка.Условие.Элементы.Добавить(ВидСравненияКомпоновкиДанных.Меньше);
УсловиеСрокаПросрочка.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ДатаЗавершенияПлан");
УсловиеСрокаПросрочка.ПравоеЗначение = ТекущаяДата();
УсловиеСрокаПросрочка.Использование = Истина;
УсловиеСтатусаПросрочка = ЭлементОформленияПросрочка.Условие.Элементы.Добавить(ВидСравненияКомпоновкиДанных.НеРавно);
УсловиеСтатусаПросрочка.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СтатусЗадачи");
УсловиеСтатусаПросрочка.ПравоеЗначение = Перечисления.СтатусыЗадач.Исполнена;
УсловиеСтатусаПросрочка.Использование = Истина;
ЭлементОформленияПросрочка.Оформление.УстановитьЗначениеПараметра("ЦветФона", Новый Цвет(255, 150, 150)); // Более насыщенный красный
ЭлементОформленияПросрочка.Оформление.УстановитьЗначениеПараметра("Шрифт", Новый Шрифт(,,Истина)); // Жирный шрифт
ЭлементОформленияПросрочка.Использование = Истина;
Важно: Порядок добавления элементов условного оформления имеет значение. Правила применяются по порядку, и если несколько правил пересекаются, применяется последнее по порядку. Поэтому, например, правило для "просроченных" задач (красный цвет) должно идти после правила для "горящих" (светло-красный), чтобы просроченные задачи выделялись более явно.
Задача по учету продуктивности сотрудников и построению соответствующих отчетов значительно расширяет требования (сообщение 15). Для этого нам потребуется не только фиксировать факты выполнения задач, но и учитывать трудозатраты и проводить оценку.
Учет трудозатрат и "часов руководителя"
Для анализа продуктивности ключевым является учет времени, затраченного на выполнение задач. Мы добавим новые реквизиты в наш документ задачи, чтобы хранить эту информацию.
Добавление реквизитов в объект задачи:
ФактическоеВремя (Число, Точность: 2, Единица измерения: Часы): Фактическое время, затраченное сотрудником на выполнение задачи.ОценкаРуководителяЧасы (Число, Точность: 2, Единица измерения: Часы): Оценка времени, которое, по мнению руководителя, потребовалось бы для выполнения этой задачи. Этот показатель может служить для нормирования и оценки сложности задач.ДатаНачалаРаботы (Дата и время): Время, когда сотрудник фактически приступил к работе над задачей.ДатаОкончанияРаботы (Дата и время): Время, когда сотрудник фактически завершил работу над задачей.Методы ввода трудозатрат:
ДатаНачалаРаботы, а по завершении — ДатаОкончанияРаботы. ФактическоеВремя рассчитывается автоматически как разница.ФактическоеВремя после выполнения задачи.ОценкаРуководителяЧасы для задач, которые еще не были оценены.Мы можем реализовать напоминания сотрудникам о необходимости внести трудозатраты при изменении статуса задачи на "Исполнена" (дополнительная информация).
Интерфейс руководителя
Для руководителя нам понадобится отдельное АРМ или раздел в существующем, который будет максимально информативен и автоматизирован. Руководитель должен видеть все неоцененные задачи и иметь возможность быстро ввести "часы руководителя" по ним.
Создание формы АРМ руководителя: Это может быть отдельная форма, аналогичная АРМ сотрудника, но с другим набором функционала и отборов.
Список неоцененных задач: На форме мы размещаем ДинамическийСписок со всеми задачами, но с постоянным отбором по условию ОценкаРуководителяЧасы = NULL. Это позволит руководителю видеть только те задачи, которые требуют его оценки.
Механизм ввода оценки:
ОценкаРуководителяЧасы и кнопку "Сохранить оценку".Информационные виджеты: Дополнительно, мы можем разместить на АРМ руководителя виджеты, показывающие:
Эти виджеты могут быть реализованы на основе ДинамическихСписков или отчетов СКД.
Построение отчетов по продуктивности
Для создания отчетов мы будем использовать Систему Компоновки Данных (СКД), которая является стандартным и наиболее гибким инструментом 1С для построения отчетов любой сложности.
Отчеты позволят нам анализировать:
Количество просроченных задач: По сотрудникам, отделам, за период. Условие: ДатаЗавершенияФакт > ДатаЗавершенияПлан или ТекущаяДата() > ДатаЗавершенияПлан И СтатусЗадачи <> Перечисления.СтатусыЗадач.Исполнена.
Количество задач, выполненных раньше срока: Условие: ДатаЗавершенияФакт < ДатаЗавершенияПлан.
Общее время по задачам: Суммарное ФактическоеВремя и ОценкаРуководителяЧасы по каждому сотруднику или по всем задачам.
Коэффициент продуктивности: Это может быть отношение Сумма(ОценкаРуководителяЧасы) / Сумма(ФактическоеВремя). Значение больше 1 может указывать на то, что сотрудник тратит больше времени, чем предполагалось, а меньше 1 — на более эффективную работу или недооценку сложности задачи.
Отчеты об исполнительской дисциплине: Выявление сотрудников, регулярно нарушающих сроки выполнения задач.
Мы также можем включить в отчеты графики и диаграммы для наглядной визуализации данных, например, столбчатую диаграмму по количеству просроченных задач на каждого сотрудника за месяц.
Реализация системы учета задач в 1С — это многоэтапный процесс, требующий внимательного выбора базовых объектов, грамотного проектирования интерфейсов и продуманной логики отчетов. Используя Документы для хранения задач, ДинамическиеСписки для АРМ, УсловноеОформление для визуализации и СКД для отчетов, мы можем создать мощное и гибкое решение, которое удовлетворит все поставленные требования, включая анализ продуктивности сотрудников и автоматизированный интерфейс для руководителя. Платформа 1С предоставляет все необходимые инструменты для создания такого комплексного решения.