Мы рассмотрим подробный подход к созданию эффективной системы учета задач в 1С:Предприятии, которая позволит сотрудникам ставить друг другу задачи, отслеживать их статус и оценивать продуктивность. Изначальная задача, сформулированная пользователем, включала в себя возможность создания задач с указанием ответственного, сроков и описания, а также отслеживание статуса исполнения и выделение задач с подходящим сроком завершения. Впоследствии требования расширились до анализа продуктивности сотрудников и создания специализированного интерфейса для руководителя. Разберем, как реализовать все эти функции, используя мощь платформы 1С.
Одним из первых и наиболее важных шагов при разработке системы учета задач является выбор подходящего объекта метаданных. От этого решения будет зависеть дальнейшая архитектура и сложность реализации функционала. В 1С мы имеем несколько вариантов: использование обычного <сode>Документасode> или <сode>Справочникасode>, либо применение специализированного объекта метаданных <сode>Задачасode> в связке с <сode>Бизнес-процессамисode>.
Подход 1: Использование Документа или Справочника
Этот подход является наиболее простым и быстрым в реализации. Мы выбираем его, когда задачи не требуют сложной маршрутизации, строгих этапов выполнения или тесной интеграции с многоступенчатыми бизнес-процессами. По сути, каждая задача будет отдельной записью в системе.
Когда подходит: Для простых поручений, не требующих жесткой последовательности действий, или когда вы хотите максимально быстро получить базовый функционал.
Преимущества: Простота разработки, быстрое освоение, минимальный объем кода. Мы можем быстро добавить необходимые реквизиты и начать работу.
Недостатки: Отсутствие встроенных механизмов для сложной маршрутизации, делегирования и контроля выполнения, которые есть у <сode>Задачсode> в связке с <сode>Бизнес-процессамисode>.
Пример реквизитов:
Если мы выбираем <сode>Документсode> или <сode>Справочниксode> для хранения задач, нам понадобятся следующие основные реквизиты:
ОписаниеЗадачи (Строка Неограниченной длины): Для детального описания сути задачи.Автор (СправочникСсылка.Пользователи или СправочникСсылка.Сотрудники): Кто поставил задачу.Ответственный (СправочникСсылка.Пользователи или СправочникСсылка.Сотрудники): Кому назначена задача.ДатаСоздания (Дата): Дата и время постановки задачи.ДатаЗавершенияПлан (Дата): Планируемая дата, до которой задача должна быть выполнена.ДатаЗавершенияФакт (Дата): Фактическая дата выполнения задачи.СтатусЗадачи (ПеречислениеСсылка.СтатусыЗадач): Например, "Новая", "В работе", "Исполнена", "Отменена", "Просрочена".Важность (ПеречислениеСсылка.ВажностьЗадачи): Например, "Низкая", "Обычная", "Высокая", "Критическая".Для создания статусов мы создадим новое <сode>Перечислениесode> с необходимыми значениями.
Подход 2: Использование объекта метаданных "Задача" в связке с Бизнес-процессами
Этот подход является более мощным и гибким, но требует более глубокого понимания платформы и наличия <сode>Бизнес-процессовсode> в конфигурации.
Когда подходит: Если наша система задач подразумевает сложную маршрутизацию, строгий контроль этапов, делегирование, создание цепочек задач или привязку задач к другим объектам системы (например, к документам поступления товаров или входящим письмам).
Преимущества:
В конфигурациях, таких как 1С:Документооборот, объект <сode>Задачасode> используется для реализации всех видов поручений и взаимодействий. Вся информация о задаче (состояние, сроки, исполнители, дата создания, файлы) отображается в едином списке, а также доступна история выполнения задачи.
Недостатки: Более высокая сложность начальной разработки и настройки. Требует проектирования <сode>Бизнес-процессовсode>, что может быть избыточным для очень простых задач.
В контексте поставленной задачи, где требуется не только учет, но и анализ продуктивности, а также возможности для руководителя, использование <сode>Документасode> или <сode>Справочникасode> будет достаточным для базовой реализации, но при дальнейшем расширении функционала (особенно с учетом сложной логики) мы можем столкнуться с необходимостью пересмотра архитектуры в сторону <сode>Бизнес-процессовсode>. Начнем с более простого подхода на основе <сode>Документасode> (например, <сode>Документ.ЗадачаСотрудникусode>), так как он позволяет реализовать все исходные требования без усложнения.
Автоматизированное рабочее место (АРМ) — это единый, удобный интерфейс для работы пользователя с задачами. При старте программы у пользователя должно открываться именно такое АРМ, где он может выполнять все необходимые действия.
Создание формы АРМ
Для АРМ мы можем использовать либо <сode>ФормуСпискасode> нашего документа (например, <сode>Документ.ЗадачаСотрудникусode>), либо создать произвольную <сode>Формусode> (сообщение 17) и разместить на ней все необходимые элементы. В случае произвольной формы, мы получим большую гибкость в размещении элементов управления и информационных блоков. Рекомендуем начать с произвольной формы.
Нам понадобится разместить на форме следующие элементы:
Переключатели или кнопки: Для удобного выбора режима просмотра задач ("Задачи мне", "Задачи от меня", "Все задачи") (сообщение 13). Это позволит быстро переключаться между различными списками.
Динамический список: Основной элемент для отображения списка задач. Мы будем использовать один <сode>ДинамическийСписоксode>, который будем динамически настраивать (менять отборы) в зависимости от выбранного режима просмотра.
Поля для отбора: Элементы управления (поля ввода) для установки дополнительных отборов по статусу, периоду назначения, периоду исполнения.
Кнопки действий: "Создать задачу", "Изменить статус", "Выполнить задачу" и т.д.
Настройка динамических списков и отборов
<сode>ДинамическийСписоксode> — это мощный инструмент в 1С для отображения данных из различных источников, таких как документы, справочники, регистры. Он позволяет гибко настраивать отборы, сортировки и группировки (дополнительная информация).
Для реализации требований пользователя, нам необходимо настроить отборы таким образом, чтобы показывать:
Задачи, назначенные текущему пользователю ("Задачи мне"): Мы устанавливаем отбор по полю <сode>Ответственныйсode> (или <сode>Исполнительсode>, если используем метаданные <сode>Задачасode>), сравнивая его с текущим пользователем системы.
Задачи, созданные текущим пользователем ("Задачи от меня"): Мы устанавливаем отбор по полю <сode>Авторсode>, сравнивая его с текущим пользователем системы.
Эти отборы устанавливаются программно при создании формы на сервере (<сode>ПриСозданииНаСервересode>) или при изменении режима просмотра списка (например, по нажатию кнопок "Задачи мне", "Задачи от меня") (сообщение 7, 12).
Мы можем установить отбор в динамическом списке без написания сложного запроса, используя стандартные механизмы <сode>КомпоновкиДанныхсode>, на которых базируется <сode>ДинамическийСписоксode> (сообщение 9, 11, 12).
Пример программного отбора для ДинамическогоСписка:
Допустим, у нас есть <сode>ДинамическийСписоксode> с именем <сode>СписокЗадачсode>. В обработчике события, например, при нажатии кнопки "Задачи мне" или при инициализации формы, мы можем настроить отбор следующим образом:
// В процедуре-обработчике события, например, ПриСозданииНаСервере или при переключении вида списка
// Предполагаем, что СписокЗадач - это имя элемента ДинамическийСписок на форме
// Очищаем существующие элементы отбора, чтобы не накапливались
Элементы.СписокЗадач.Отбор.Элементы.Очистить();
// Определяем текущий вид списка (например, через переменную формы ТекущийВидСписка)
Если ТекущийВидСписка = "Мне" Тогда
// Создаем новый элемент отбора для поля Ответственный
ЭлементОтбора = Элементы.СписокЗадач.Отбор.Элементы.Добавить(ВидСравнения.Равно);
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Ответственный"); // Имя поля в источнике данных
ЭлементОтбора.ПравоеЗначение = ПараметрыСеанса.ТекущийПользователь; // Текущий пользователь системы
ЭлементОтбора.Использование = Истина;
ИначеЕсли ТекущийВидСписка = "ОтМеня" Тогда
// Создаем новый элемент отбора для поля Автор
ЭлементОтбора = Элементы.СписокЗадач.Отбор.Элементы.Добавить(ВидСравнения.Равно);
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Автор"); // Имя поля в источнике данных
ЭлементОтбора.ПравоеЗначение = ПараметрыСеанса.ТекущийПользователь;
ЭлементОтбора.Использование = Истина;
ИначеЕсли ТекущийВидСписка = "Все" Тогда
// В этом случае отбор по пользователю не нужен, просто выводим все задачи
// Элементы.СписокЗадач.Отбор.Элементы.Очистить() уже было вызвано
КонецЕсли;
// Также можно добавить отборы по статусу, периоду назначения, периоду исполнения
// Для этого нам понадобятся соответствующие поля ввода на форме.
// Например, если есть поле ввода "СтатусЗадачиДляОтбора"
Если Не СтатусЗадачиДляОтбора.Пустая() Тогда
ЭлементОтбораСтатус = Элементы.СписокЗадач.Отбор.Элементы.Добавить(ВидСравнения.Равно);
ЭлементОтбораСтатус.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СтатусЗадачи");
ЭлементОтбораСтатус.ПравоеЗначение = СтатусЗадачиДляОтбора;
ЭлементОтбораСтатус.Использование = Истина;
КонецЕсли;
// Аналогично для периодов
Если НачалоПериодаОтбора.Истина() И КонецПериодаОтбора.Истина() Тогда
// Отбор по диапазону дат создания
ЭлементОтбораДатаСоздания = Элементы.СписокЗадач.Отбор.Элементы.Добавить(ВидСравнения.Между);
ЭлементОтбораДатаСоздания.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ДатаСоздания");
ЭлементОтбораДатаСоздания.ПравоеЗначение = НачалоПериодаОтбора;
ЭлементОтбораДатаСоздания.ВидСравнения = ВидСравнения.Между;
ЭлементОтбораДатаСоздания.ПравоеЗначение = КонецПериодаОтбора;
ЭлементОтбораДатаСоздания.Использование = Истина;
КонецЕсли;
После изменения отбора нам может потребоваться обновить список, вызвав метод Элементы.СписокЗадач.Обновить().
Для того чтобы пользователь мог быстро ориентироваться в списке задач и обращать внимание на наиболее важные или "горящие" из них, мы используем механизм условного оформления (дополнительная информация). С его помощью мы можем визуально выделять строки или поля в списках в зависимости от определенных условий, например, менять цвет текста, цвет фона или шрифт.
Цели условного оформления:
Выделение задач, срок которых подходит к концу (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, Единица измерения: Часы): Оценка времени, которое, по мнению руководителя, потребовалось бы для выполнения этой задачи. Этот показатель может служить для нормирования и оценки сложности задач.ДатаНачалаРаботы (Дата и время): Время, когда сотрудник фактически приступил к работе над задачей.ДатаОкончанияРаботы (Дата и время): Время, когда сотрудник фактически завершил работу над задачей.Методы ввода трудозатрат:
Мы можем реализовать напоминания сотрудникам о необходимости внести трудозатраты при изменении статуса задачи на "Исполнена" (дополнительная информация).
Интерфейс руководителя
Для руководителя нам понадобится отдельное АРМ или раздел в существующем, который будет максимально информативен и автоматизирован. Руководитель должен видеть все неоцененные задачи и иметь возможность быстро ввести "часы руководителя" по ним.
Создание формы АРМ руководителя: Это может быть отдельная форма, аналогичная АРМ сотрудника, но с другим набором функционала и отборов.
Список неоцененных задач: На форме мы размещаем <сode>ДинамическийСписоксode> со всеми задачами, но с постоянным отбором по условию ОценкаРуководителяЧасы = NULL. Это позволит руководителю видеть только те задачи, которые требуют его оценки.
Механизм ввода оценки:
Информационные виджеты: Дополнительно, мы можем разместить на АРМ руководителя виджеты, показывающие:
Эти виджеты могут быть реализованы на основе <сode>ДинамическихСписковсode> или отчетов <сode>СКДсode>.
Построение отчетов по продуктивности
Для создания отчетов мы будем использовать <сode>Систему Компоновки Данных (СКД)сode>, которая является стандартным и наиболее гибким инструментом 1С для построения отчетов любой сложности.
Отчеты позволят нам анализировать:
Количество просроченных задач: По сотрудникам, отделам, за период. Условие: ДатаЗавершенияФакт > ДатаЗавершенияПлан или ТекущаяДата() > ДатаЗавершенияПлан И СтатусЗадачи <> Перечисления.СтатусыЗадач.Исполнена.
Количество задач, выполненных раньше срока: Условие: ДатаЗавершенияФакт < ДатаЗавершенияПлан.
Общее время по задачам: Суммарное <сode>ФактическоеВремясode> и <сode>ОценкаРуководителяЧасысode> по каждому сотруднику или по всем задачам.
Коэффициент продуктивности: Это может быть отношение Сумма(ОценкаРуководителяЧасы) / Сумма(ФактическоеВремя). Значение больше 1 может указывать на то, что сотрудник тратит больше времени, чем предполагалось, а меньше 1 — на более эффективную работу или недооценку сложности задачи.
Отчеты об исполнительской дисциплине: Выявление сотрудников, регулярно нарушающих сроки выполнения задач.
Мы также можем включить в отчеты графики и диаграммы для наглядной визуализации данных, например, столбчатую диаграмму по количеству просроченных задач на каждого сотрудника за месяц.
Реализация системы учета задач в 1С — это многоэтапный процесс, требующий внимательного выбора базовых объектов, грамотного проектирования интерфейсов и продуманной логики отчетов. Используя <сode>Документысode> для хранения задач, <сode>ДинамическиеСпискисode> для АРМ, <сode>УсловноеОформлениесode> для визуализации и <сode>СКДсode> для отчетов, мы можем создать мощное и гибкое решение, которое удовлетворит все поставленные требования, включая анализ продуктивности сотрудников и автоматизированный интерфейс для руководителя. Платформа 1С предоставляет все необходимые инструменты для создания такого комплексного решения.