Ресурсы: бизнес-логика¶
Обзор¶
Домен resources отвечает за планирование, учёт и контроль загрузки ресурсов, связанных с задачами.
Ключевая идея: для каждой задачи хранится план и факт использования ресурсов, а UI показывает матрицу загрузки по периоду и подкатегории.
Бизнес-объекты¶
- Ресурс задачи (
TaskResources). - Исполнители ресурса (
TaskResourcePerformers). - Плановые записи (
TaskResourcePlanEntries). - Фактические записи (
TaskResourceFactEntries). - Агрегаты факта (
TaskResourceFactAggregated). - Лог изменений (
TaskResourcesLog).
Типы ресурсов¶
В 1Форме все ресурсы делятся на два типа:
| Тип | Особенности |
|---|---|
| Трудовой (исполнители, оборудование) | Количество не меняется (исполнители не нанимаются и не увольняются под задачу). Доступность определяется календарным методом (выходные, ночь). Длительность работы напрямую связана с потребностью в ресурсе («исполнитель X в течение Y часов») |
| Затратный (материальные ценности, деньги) | Расходуется в процессе работы — оставшееся количество уменьшается. Доступность определяется наличием. Длительность работы не связана с количеством расходуемого ресурса |
В настоящее время реализована работа только с трудовыми ресурсами; затратные не поддерживаются.
Подтипы трудового ресурса¶
| Подтип | Назначение | Связь с исполнителями |
|---|---|---|
| Сотрудник | Работа одного или нескольких сотрудников компании. Соответствует роли «Исполнитель» в задачах | Многие-ко-многим через группы сотрудников |
| Внешний ресурс | Работа внешнего контрагента | Категория-справочник с ДП «Ответственный за ресурс» |
| Материальный объект | Устройство, оборудование, помещение, автомобиль и т.п. | Категория-справочник с ДП «Ответственный за ресурс» |
В системе обычно есть «Ресурс по умолчанию», который используется, когда исполнителю не назначен иной ресурс.
Примеры внешних/материальных ресурсов: - Ресурс «Автомобиль» → категория-справочник «Корпоративный автотранспорт» с диспетчером в поле «Ответственный за ресурс». - Ресурс «Переговорные» → категория-справочник «Переговорные комнаты» с секретарём-администратором.
Перечень доступных ресурсов хранится в системном справочнике (см. resources/admin.md). Справочник пополняется ответственными сотрудниками и администраторами.
Блок «Ресурсы» в карточке задачи¶
Блок предназначен для управления плановыми и фактическими трудозатратами сотрудников, использованием внешних (трудозатраты подрядчиков) и материальных ресурсов (корпоративный транспорт, переговорные).
- Плановые трудозатраты обычно вносит заказчик или ответственный заранее.
- Фактические трудозатраты регистрируют исполнители после выполнения работ.
По умолчанию блок свёрнут; система запоминает текущее состояние per-пользователь и per-категория. Например, если пользователь раскрыл блок в одной задаче категории, в следующей задаче этой категории он также откроется раскрытым.
Внесение плановых трудозатрат¶
При добавлении исполнителя в задачу система автоматически добавляет его в блок ресурсов: вид ресурса определяется по системному справочнику, процент занятости рассчитывается автоматически. Клик по названию ресурса открывает соответствующую задачу из справочника.
Записи в блок можно добавлять и вручную — для конкретного сотрудника или для вида ресурса в целом. Если вид ресурса не определён, выбирается «Ресурс по умолчанию».
Планирование с указанием исполнителей¶
В поле «Ресурс» — выбор вида; ниже отображается список сотрудников этого ресурса с недельным графиком занятости по другим задачам:
| Цвет | Занятость на день |
|---|---|
| Зелёный | До 50% (≤ 4 ч при 8-часовом дне) |
| Оранжевый | 50–100% (4–8 ч) |
| Красный | 100% и более (≥ 8 ч) |
Отметить нужных исполнителей → указать общий объём (часы/дни/месяцы) → «Добавить». Если выбрано несколько исполнителей — общий объём распределяется между ними.
Если сотрудники, для которых внесены трудозатраты, не являются исполнителями задачи, система предложит добавить их. Отказ оставит трудозатраты запланированными без добавления в исполнители.
Планирование без исполнителя¶
Если в поле «Ресурс» выбрать вид и нажать «Добавить» без выбора исполнителей, создаётся запись на вид ресурса в целом — без сотрудника.
Планировать трудозатраты для ресурсов можно только при наличии соответствующих прав.
Распределение по дням¶
При указании общего объёма по задаче система автоматически распределяет трудозатраты равномерно с даты начала работы до срока. Если срок не задан, распределение по дням не выполняется.
Общий план можно редактировать кликом по нему — поле перейдёт в режим ввода.
Посуточный план¶
Открывается из блока ресурсов кнопкой посуточного календаря. Календарь показывает трудозатраты одного сотрудника, а не вида ресурса. С правами можно планировать не только себе, но и другим.
Порции для ввода: 5 мин, 15 мин, 30 мин, 1 час, 1 день. Полный круг = 1 час, половина = 30 мин и т.д. Максимум на день — лимит производственного календаря (например, 8 полных кругов при 8-часовом дне).
Внесение: выбрать порцию → кликнуть по дате нужное число раз. Удалить — иконкой × в правом верхнем углу ячейки.
Цвета: - Текущая дата — серая подсветка. - Бледно-голубой — план, рассчитанный автоматически из общего объёма. - Ярко-голубой — план, введённый вручную. - Фиолетовый — плановые трудозатраты ресурса по другим задачам.
Соотношение с общим планом: - Если сумма ручных трудозатрат больше общего плана — общий план автоматически увеличивается. - Если меньше — разница распределяется равномерно с последнего ручного дня до срока задачи. - При досрочном завершении/отклонении задачи трудозатраты на будущие дни (после закрытия) удаляются.
Быстрое внесение своего плана¶
Кнопка «Внести план» в блоке «Ресурсы» открывает посуточный календарь. После сохранения, если записи пользователя в блоке ещё не было, она создаётся автоматически.
Режимы планирования: Фиксированная длительность vs Фиксированные трудозатраты¶
Когда плановые трудозатраты превышают время до срока задачи, поведение определяется режимом задачи:
| Режим | Поведение при превышении |
|---|---|
| Фиксированная длительность | Срок остаётся прежним; превышающий план не сохраняется (предупреждение). Кастомная настройка NoValidateFixLengthPlan разрешает изменять план, когда фактические списания уже превысили плановые |
| Фиксированные трудозатраты | Срок задачи автоматически сдвигается, чтобы план поместился |
Алгоритм расчёта нового срока (Фиксированные трудозатраты):
- Рассчитывается последний день суточного плана:
Дата начала + (План / % загрузки по ресурсу). - Берётся максимальная дата плановых часов в задаче.
- Из шагов 1 и 2 — максимум.
- Срок обновляется, если новый расчётный срок больше текущего.
Если время начала задачи не задано — для расчёта берётся время создания. Перенос срока выполняется только в исполняемом статусе (не новой, не отклонённой, не завершённой) и если новый срок не в прошлом.
Внесение фактических трудозатрат¶
Фактические трудозатраты фиксируются исполнителями в ходе работы или по её завершении.
Особенности: - Поддерживается только посуточное внесение; общей суммой ввести нельзя. - Открывается посуточный календарь по клику на числовое значение в колонке «Факт». - Дискретность та же: 5/15/30 мин, 1 ч, 1 день. - Зелёные круги факта по возможности замещают голубые круги плана. - При превышении факта над планом за день — отметка превышения. - При вводе доступен комментарий к дню (для плановых — недоступно). После сохранения — иконка комментария в правом верхнем углу ячейки.
Горячие клавиши: Ctrl+Alt+1 (5 мин), Ctrl+Alt+2 (10 мин), Ctrl+Alt+3 (15 мин).
Кто может вносить факт: - Заказчик/исполнитель с правом «Редактировать исполнителей». - Член группы, указанной в справочнике ресурсов в поле «Группы, обладающие правом фиксировать трудозатраты ресурса». - Администратор задач в категории. - Администратор системы.
Внесение факта за будущие даты по умолчанию запрещено. В отдельных категориях администратор может снять ограничение (например, для отчётов за период обучения).
При внесении факта оставшееся количество запланированных трудозатрат для исполнителя уменьшается.
Быстрое внесение своего факта: через «быструю ссылку» в блоке «Ресурсы», даже если записи пользователя в блоке ещё нет — она создастся автоматически после сохранения.
Процент занятости сотрудника¶
Рассчитывается автоматически как отношение общего планового значения занятости к общему количеству рабочих часов до срока завершения. Пример: задача со сроком через 2 дня (16 рабочих часов) и план 4 часа → занятость 25%.
Основные сценарии¶
1. Открытие блока ресурсов задачи¶
Пользователь видит текущий план/факт и связанных исполнителей по задаче.
2. Планирование загрузки¶
По подкатегории и периоду строится матрица распределения ресурсов.
3. Корректировка плана и факта¶
Изменения в плане/факте фиксируются в доменных таблицах и должны быть воспроизводимы в отчётах и UI.
4. Настройка ресурсной модели подкатегории¶
Админ определяет доступные ресурсы и связи подкатегории с ресурсными справочниками.
Бизнес-правила¶
- План и факт разделены и обновляются разными операциями.
- Изменение загрузки должно сохранять аудируемость (лог действий).
- Ресурс должен быть доступен в подкатегории, иначе назначение недопустимо.
- UI всегда работает с актуальным snapshot после перезагрузки данных.
Зависимости¶
tasks— задача как контейнер ресурсного плана.categories— конфигурация ресурсности подкатегорий.users-and-groups— исполнители/оргструктура.calendar— период и нерабочие дни.
Операционные риски¶
- Расхождение плана/факта между UI и БД.
- Некорректная настройка доступности ресурса в подкатегории.
- Частичные обновления при пакетных операциях.
Что проверять при инцидентах¶
TaskResourcePlanEntriesиTaskResourceFactEntriesдля проблемной задачи/периода.- Наличие записи в
TaskResourcesLog. - Связку подкатегории с ресурсным справочником.
- Ответы API на reload матрицы после изменения.
Представление категории «Ресурсы»¶
Доступно с версии 2.262.
В представлении категории Ресурсы слева отображается таблица ресурсов категории, справа — временные шкалы задач, в которых задействованы ресурсы. Начало и окончание шкалы соответствуют рабочему дню по производственному календарю.
Основные правила¶
- Клик по временной шкале открывает карточку задачи в модальном окне.
- При наведении на задачу показывается подсказка с названием задачи и периодом (календарные дни, рабочие дни/часы).
- Рабочие дни, выпавшие на субботу/воскресенье, и предпраздничные дни отображаются как рабочие (белым). Выходные и праздники — серым.
- Для категорий типа «Ресурсы» доступно перетаскивание карточки по горизонтали (смена времени).
- Для категорий типа «Экземпляры ресурсов» доступно также перетаскивание по вертикали (смена исполнителя/ресурса).
- Представление обновляется онлайн при добавлении и изменении задач — без перезагрузки страницы.
Расчёт периода в подсказке¶
Период отображается с правилами форматирования: - Даты в одном месяце и году — месяц указан один раз: «11–12 декабря 2024 г.»; - Даты в одном году, разные месяцы — месяц у обеих дат: «11 ноября – 2 декабря 2024 г.»; - Разные годы — месяц и год у каждой даты.
Длительность считается в рабочих днях (выходные и праздники исключаются). Полные дни — 5 дн., неполные — рабочими часами с округлением до сотых: 4.25 ч.. При 100% загрузке за день засчитывается 1 рабочий день, даже если выделено больше нормы (24 часа при 8-часовом дне). Если остаток превышает дневную норму — округляется до +1 дня.
Часовые пояса¶
Все события и производственный календарь отображаются в часовом поясе текущего пользователя, при этом сами данные привязаны к исходному поясу. Например, рабочий день, запланированный с 10:00 по UTC+3, для пользователя UTC+13 показывается с 22:00. При создании события через клик в интерфейсе система автоматически интерпретирует намерение и устанавливает время в рабочем поясе пользователя.
План / Факт¶
Пользователь может переключаться между режимами «План» и «Факт». При ручном внесении трудозатрат система автоматически определяет дату начала аллокации: от начала рабочего дня с учётом уже внесённых за день трудозатрат. Если время превышает остаток дня — запись сдвигается так, чтобы завершаться в 24:00.
Добавление часов¶
Кнопка «+» в пустой ячейке открывает окно добавления трудозатрат или карточку создания задачи (зависит от настроек администратора).
- Для масштаба «Расписание» реализован механизм контроля занятости (овербукинг): нельзя создать аллокацию, если рабочий день ресурса уже полностью занят ранее запланированной нагрузкой.
- Доступность кнопки «+» зависит от права на создание задач в категории.
Масштабы¶
| Масштаб | Описание |
|---|---|
| Годы | По годам с разбивкой по кварталам |
| Месяцы | По месяцам |
| Месяцы/недели | По месяцам с разбивкой по первому дню недели |
| Недели | По неделям |
| Неделя | По дням (по умолчанию) |
| День | По дням с возможностью установки на часы |
| Расписание | По календарным неделям |
Администратор может предопределить доступные масштабы и масштаб по умолчанию.
Фильтрация и отборы¶
- По статусам основного маршрута: все, активные, закрытые, отклонённые.
- По преднастроенным отборам категории.
- По роли пользователя: исполнитель, заказчик, акцептант, «в параметрах».
- Фильтрация по значениям дополнительных параметров через чипы.
- Флаг «Ресурсы только с аллокациями» — скрывает ресурсы без назначений в отфильтрованных задачах (не работает в масштабах «День» и «Расписание»).
Контекстное меню ресурса¶
| Действие | Описание |
|---|---|
| Редактировать событие | Окно редактирования события |
| Копировать / Вырезать / Удалить событие | Операции с аллокацией через буфер обмена |
| Прервать событие | Прерывание аллокации |
Поиск¶
Кнопка лупы в панели инструментов раскрывает поле поиска. Поиск ведётся: - по полям карточки ресурса в правой части представления; - по типу ресурса (название типа или исполнитель) — в левой табличной части.
Чтобы значение ДП попадало в поиск, в настройках параметра категории должна быть включена опция «Участвует в поиске». В процессе поиска фильтруются только результаты в правой части — табличная часть не меняется.
Меню действий и контекстное меню колонки¶
Кнопка меню в панели инструментов:
| Действие | Описание |
|---|---|
| Вид по умолчанию | Сброс персональных настроек таблицы (сортировка, группировка, порядок колонок) к настройкам категории |
| Расширенное добавление | Добавляет дополнительное пространство в строку — кнопка «+» доступна даже при наличии назначенного ресурса в слоте |
| Ресурсы только с аллокациями | Скрывает ресурсы без назначений в задачах, попавших в текущие фильтры. Не работает в масштабах «День» и «Расписание» |
Правая кнопка мыши по заголовку колонки таблицы ресурсов:
| Действие | Описание |
|---|---|
| Колонки | Список основных и дополнительных параметров; отметка управляет видимостью колонки |
| Спрятать колонку | Временно скрывает выбранную колонку (восстановление — через «Колонки») |
| Группа по возрастанию / убыванию | Группировка данных по выбранной колонке |
| Убрать группу | Сброс группировки |
Табель трудозатрат (пользовательский)¶
Сводный личный табель трудозатрат пользователя — интерактивная матрица «задача × день» за неделю/день. Доступен из профиля пользователя (вкладка «Ресурсы» или через навигацию).
Состав табеля¶
По умолчанию в табель попадают: - задачи, по которым для пользователя запланированы трудозатраты на выбранную неделю (верхняя часть); - задачи с приближающимся сроком, где пользователь — исполнитель (нижняя часть).
Опция «Все активные задачи» — показывает все активные задачи, где пользователь является исполнителем.
Если у пользователя нет доступа к задаче, трудозатраты по ней видны, но вместо текста — «(Текст задачи скрыт)».
Режимы отображения¶
| Режим | Что показывается |
|---|---|
| Фактические трудозатраты | И план, и факт |
| Плановые трудозатраты | Только план |
Цветовая кодировка ячеек: - 🔵 Голубой — плановые трудозатраты - 🟢 Зелёный — фактические в рамках плана - 🔴 Красный — фактические, превышающие план на день
Полный круг ≈ 1 ч., половина ≈ 30 мин.
Навигация и периоды¶
- Переключение периода — стрелки назад/вперёд.
- Дискретность: Неделя, Рабочая неделя (5 дней), День.
Ввод трудозатрат¶
Клик по ячейке на пересечении задачи и даты — открывает окно ввода (тот же интерфейс, что и в посуточном календаре блока «Ресурсы» в карточке задачи). Логика автоопределения времени начала — см. раздел «Добавление часов» выше.
| Кнопка | Действие |
|---|---|
| Добавить задачу (+) | Добавить активную задачу-исполнителя в табель |
| Сохранить | Сохранить все изменения (активна при наличии несохранённых данных) |
| Отменить | Откатить несохранённые изменения |
| Обновить | Перезагрузить табель |