Календарь: бизнес-логика¶
Обзор¶
Календарный домен управляет событиями, встречами, повесткой и рабочими днями организации.
Домен поддерживает несколько провайдеров (OForma, Exchange, CalDav) и объединяет их в единый пользовательский сценарий.
Бизнес-объекты¶
- Календарное событие/встреча.
- Агенда (выборка событий по периоду).
- Непрочитанные сообщения календаря.
- Производственный календарь (рабочие/нерабочие дни).
Основные сценарии¶
1. CRUD и action по встрече¶
Создание, изменение, удаление и действия (accept/decline и т.п.) по событию через единый API-контур.
1a. Постановка встречи в чужой календарь (с 2.267.396)¶
Пользователь может создать встречу, находясь в чужом календаре (например, открыв календарь коллеги). Правила:
- Организатор встречи — всегда
currentUser(текущий пользователь), проверка прав на организацию не производится. - Владелец просматриваемого календаря автоматически добавляется в
requiredAttendees. - Текущий пользователь также добавляется в
requiredAttendees. - В планировщике (scheduling assistant) участники корректно отображаются с учётом обоих.
Не требует Exchange-имперсонализации — работает как пользовательская функция внутри 1Формы.
2. Загрузка календарной сетки¶
Пользователь получает события диапазона и overlay нерабочих дней для планирования.
3. Работа со счётчиком непрочитанных¶
Счётчик пересчитывается по API и push-сигналам при изменениях в сообщениях встреч.
4. Управление производственным календарём¶
Админ обновляет рабочие/праздничные дни; изменения используются в расчётах и отображении.
5. Календарное представление категории¶
В календарном представлении категории задачи и события отображаются в виде календаря с масштабом день, неделя или месяц. Каждая задача — активная ссылка на карточку. Клик по свободному слоту открывает карточку создания задачи.
Масштабы¶
| Масштаб | Описание |
|---|---|
| Месяц | Задачи на месяц, список |
| Месяц (Карточка) | Задачи на месяц, карточки |
| Неделя | Задачи на неделю, список |
| Расписание | Задачи на неделю, карточки |
| Рабочая неделя | Задачи на неделю без выходных, список |
| День | Задачи на день, список |
Администратор может предопределить доступные масштабы и масштаб по умолчанию. Выбор пользователя сохраняется между сессиями.
Фильтрация¶
| Параметр фильтра | Описание |
|---|---|
| Срок | Активные задачи со сроком, независимо от исполнителя |
| Срок (Исполнитель) | Активные задачи, где пользователь — исполнитель |
| Срок (Ответственный) | Активные задачи, где пользователь — ответственный |
| Срок (Завершённые) | Завершённые/отклонённые задачи, где пользователь — исполнитель |
| Дата завершения | Завершённые/отклонённые задачи по дате завершения |
| Встречи | Только для категорий типа «Календарь» — по диапазону дат в параметрах «С» и «По» |
| Напоминания | Напоминания по задаче |
| Подписи | Запрошенные подписи, акцептант — текущий пользователь |
| Начало работы | Задачи по дате начала работы |
| Создание | Задачи по дате создания |
Дополнительно доступны фильтры по статусу (активные / закрытые / все), по роли (исполнитель, ответственный, организатор, наблюдатель, автор) и по дополнительным параметрам категории (ДП). Все фильтры работают по логическому AND; множественный выбор внутри одного ДП — по OR. Настройки сохраняются отдельно для каждой категории.
Экспорт в CSV¶
По кнопке «В CSV» выгружаются события за месяц в соответствии с текущими фильтрами:
| Колонка | Обозначение |
|---|---|
| Start | Дата начала события или срок задачи |
| End | Дата окончания или срок задачи |
| Title | Текст задачи или название события |
| Type | CalendarEvent — событие, Task — задача |
| Organizer | Организатор события или исполнитель задачи |
| TaskId | Номер задачи (для типа Task) |
6. Персональный календарь (SPA)¶
Открывается из иконки «Календарь» в панели навигации. Под индикатором — счётчик непрочитанных событий.
Внешний вид: - Серым показываются выходные и праздники; рабочие дни на субботу/воскресенье и предпраздничные — белым (как рабочие). - Текущая дата выделена цветом, текущее время — красная черта.
Периоды: Месяц / Неделя / Рабочая неделя / День / Список. По умолчанию — Рабочая неделя (без выходных, праздничные дни видны). Кнопка «Сегодня» возвращает к текущей дате; стрелки ←/→ — на период вперёд/назад. Из представлений Месяц / Неделя / Рабочая неделя клик по дате переключает на День.
Добавление чужих календарей. Кнопка «Добавить календарь» позволяет видеть события до 5 пользователей одновременно. Каждый получает свой цвет; чтобы убрать — крестик в бейдже.
Кнопка «События» открывает страницу с табличным представлением почтовых календарных событий за последние две недели (организатор, название, дата встречи) — это все изменения по встречам, отображающиеся в почтовом ящике пользователя. Новые события выделяются жирным; кнопка «Прочитать все» помечает прочитанными все видимые на странице. Прочтение синхронизируется с почтовым ящиком пользователя. Клик по строке открывает карточку события; кнопка обновления — рядом. Счётчик непрочитанных рядом с иконкой календаря в панели навигации.
Фильтр¶
| Параметр | Что показывает |
|---|---|
| Срок (Исполнитель) | Активные задачи с пользователем-исполнителем по дате срока |
| Срок (Ответственный) | Активные задачи с пользователем-ответственным по дате срока |
| Срок (Завершённые) | Завершённые/отклонённые задачи по дате срока |
| Дата завершения | Завершённые/отклонённые по дате фактического завершения |
| Встречи | Встречи, в которых пользователь участвует |
| Напоминания | Напоминания по задачам |
| Подписи | Запрошенные подписи (пользователь — акцептант) — по дате срока подписи |
| Начало работы | По дате начала работы над задачей |
| Создание | По дате создания задачи |
При просмотре собственного календаря — задачи текущего пользователя; при просмотре чужого — задачи целевого пользователя, видимые текущему по правам.
Выгрузка в CSV¶
Кнопка «В CSV» скачивает события за весь месяц с учётом текущих фильтров (даже если открыт период Неделя или День). Колонки: Start, End, Title, Type (CalendarEvent/Task), Organizer, TaskId.
Отображение событий¶
Событие — активная ссылка на карточку. Длительность отражается растягиванием ячейки от даты/времени начала до конца.
Контекстное меню (ПКМ): - Не-владелец — пункты «Принять», «Под вопросом», «Отклонить». - Владелец — «Отменить встречу».
Выбор отражается в поле «Статус» карточки встречи и в виде вертикальной полосы слева:
| Полоса | Статус |
|---|---|
| Зелёная | Свободен |
| Синяя | Занят |
| Жёлтая | Под вопросом |
| Серая | Нет на месте |
Полоса соответствует значению поля «Показывать как» в карточке события. Иконки в правом нижнем углу — повторяющаяся встреча и наличие вложений.
Просмотр календарей других пользователей¶
В профиле пользователя — вкладка «Календарь» (полный) и блок встреч на текущую неделю на вкладке «Профиль». Кнопка раскрытия на полный экран — в правом верхнем углу.
При ограничении доступа администратором события чужих сотрудников отображаются как некликабельные синие слоты «Занят» без деталей. В профиле и краткой карточке отображается только статус (Занят / Под вопросом / Нет на месте / Свободен) и время.
Оповещения о встречах¶
За 15 минут до начала события в правом верхнем углу под панелью навигации появляется баннер: время, название встречи, активная ссылка из поля «Место встречи» (открывается в новой вкладке).
| Действие | Эффект |
|---|---|
| Отложить на 5 / 10 минут / до начала | Скрыть баннер на выбранное время |
| Закрыть (крестик) | Отложить на 2 минуты |
Независимо от выбранного отложенного времени, баннер всегда показывается за 1 минуту до начала. Если встреча отменена — оповещение не показывается.
Цвет баннера — противоположный теме приложения (тёмный в светлой, светлый в тёмной).
При свёрнутом или неактивном окне — приходят уведомления рабочего стола, клик по уведомлению переключает на 1Форму.
Оповещения отключаются в персональных настройках уведомлений: пункт «Напоминания о встречах».
7. Карточка календарного события¶
Способы создания¶
| Способ | Поведение |
|---|---|
| Кнопка «Создать встречу» в календаре | Открывает пустую карточку |
| Кнопка «Создать» в panel navigation → «Встречу» | Открывает пустую карточку |
| Клик по свободной ячейке календаря | Подтягиваются дата и время начала/окончания (по умолчанию +30 мин). Растягивание мыши без отпускания задаёт более длинный интервал |
| Меню «Запланировать» в шапке задачи | Подписчики задачи автоматически добавляются в участники |
Поля карточки¶
| Поле | Поведение |
|---|---|
| Организатор | Не редактируется. По умолчанию — создатель события. При создании из чужого календаря: если у текущего пользователя есть право на редактирование чужого календаря в Exchange — организатором подставляется владелец этого календаря; иначе — текущий пользователь, а владелец становится участником |
| Название * | Обязательное |
| Участники | Пользователи системы и внешние email (формат pochta@mail.ru; иначе значение удаляется). Кнопка «Помощник по планированию» открывает подбор времени |
| Длительность | 5 / 10 / 15 / 30 / 45 мин, 1 / 1,5 / 2 ч. После выбора пересчитывает время окончания |
| Дата и время | При включении «Весь день» обе границы — 00:00. Если время не выбрано вручную, начало автозаполняется округлением до ближайшего часа вперёд (16:00, 16:34 или 16:55 → 17:00). При сдвиге окончания раньше начала система автоматически сдвигает начало, чтобы сохранить положительную продолжительность |
| Повторять | Никогда / Ежедневно / Еженедельно / Ежемесячно в тот же день / Ежемесячно на той же неделе / Ежегодно в тот же день / Ежегодно на той же неделе. Недоступно в Exchange-режимах «Синхронизация» и «Выключено» |
| Место встречи | Адрес или ссылка. Кнопка «Ссылка на встречу» автоматически добавляет ссылку на личную ВКС в это поле и подпись со ссылкой в «Описание». Если у комнаты установлен пароль — в описание добавляется строка «Код доступа: XXXX» (можно удалить вручную). Иконка справа копирует ссылку |
| Показывать как | Тип отсутствия: Отпуск / Встреча / Удалённая работа / Прочее. Тип определяет цвет имени пользователя в системе во время события. Список настраивается администратором |
| Связано с | Номер связанной задачи. После создания — в задачу публикуется автоматический служебный комментарий участникам от имени организатора |
| Статус (для участника) | Принять / Под вопросом / Отклонить. До выбора — «Неизвестно». Кнопки блокируются на время выполнения перехода |
| Описание | Текст |
| Файлы | Вложения |
Поведение для отсутствий¶
При создании отсутствия в поле Участники автоматически указывается сотрудник, для которого регистрируется отсутствие (можно регистрировать для других при наличии прав, например HR за заболевшего). При создании из профиля пользователя в поле Уведомить автоматически добавляется его непосредственный руководитель и прямые подчинённые.
Изменение события¶
- Список участников может менять только организатор.
- Организатор и каждый участник имеют отдельную карточку события в своём календаре.
- Изменения организатора синхронизируются с задачами всех участников.
- Изменения участника действуют только в его карточке (не у остальных). При сдвиге времени участником организатор получает уведомление.
- При синхронизации с EWS у участника доступна кнопка «Предложить новое время» с двумя вариантами:
- Принять под вопросом и предложить другое время — при отказе организатора статус меняется на «Под вопросом».
- Отклонить и предложить другое время — при отказе статус «Отклонено» и удаление из участников.
- Кнопка «Ссылка на встречу» в режиме редактирования отображается, если поле «Место встречи» пустое.
- Drag-and-drop: перетаскивание карточки в календаре меняет дату и время.
Отменённые встречи¶
Отображаются серыми блоками с перечёркнутым названием. Карточка открывается только для чтения; в ней доступна кнопка «Удалить из календаря» (также через ПКМ по событию). В календарях других пользователей кнопка не отображается.
Вложения в карточке¶
Файлы — в блоке «Вложения». Если у пользователя нет права на редактирование и вложений нет — блок скрыт. При наведении справа: «Скачать всё одним архивом» и «Вложить файл». ПКМ по файлу — Скачать / Открыть в новой вкладке / Скопировать ссылку / Удалить. Офисные файлы открываются для просмотра в R7 / OnlyOffice.
Учёт трудозатрат¶
При назначении встречи участникам автоматически фиксируются плановые трудозатраты по времени встречи. По окончании встречи у тех, кто принял участие (статус «Принять»), фиксируются фактические трудозатраты.
8. Синхронизация с Outlook / Exchange¶
При включённой синхронизации события из 1Формы появляются в Outlook (и наоборот) в течение одной минуты. Изменения параметров встречи в одной системе отражаются в другой. Цвет встречи в Outlook соответствует значению поля «Показывать как» в карточке события.
Технические подробности EWS-провайдера — provider-ews.md.
Повторяющиеся события: правила синхронизации¶
| Действие в системе-источнике | Эффект в системе-приёмнике |
|---|---|
| Снятие признака повтора в 1Форме | В Exchange признак повтора не снимается (событие остаётся повторяющимся) |
| Установка/изменение повтора в 1Форме | Новые созданные встречи в Exchange не синхронизируются |
| Снятие или изменение повтора в Outlook | В 1Форме соответствующие встречи отклоняются |
| Удаление ряда повторяющихся встреч в 1Форме | В Exchange они отклоняются |
| Установка повтора в Outlook | В 1Форме создаётся соответствующее повторение и связанные задачи |
При повторяющейся задаче с количеством повторов «Без ограничений» изначально создаётся фиксированное число повторов (по умолчанию 50, настраивается в общих настройках), затем встречи досоздаются ежедневно.
В ленту пользователю отправляется уведомление только при создании первого повторяющегося события — для последующих повторов сообщений не приходит.
При увольнении участника встречи (организатора или участника) встреча создаётся от имени служебного пользователя «Диспетчер задач»; в полях «Участники встречи» / «Организатор» указывается этот пользователь. Для уволенного встречи не создаются; уже созданные до увольнения остаются как есть.
Внешние пользователи¶
«Внешние» — те, кто не зарегистрирован в 1Форме, но имеет доступ к календарям Exchange.
Если встреча создаётся в Exchange: - Организатор-внешний сотрудник → в 1Форме встреча ставится от служебного пользователя; в поле «Участники» — email внешнего; задача организатора не создаётся. - Организатор — пользователь 1Формы с выключенной синхронизацией Exchange → организатором становится он, но задача организатора не создаётся. - Участник-внешний сотрудник → в поле «Участники» указывается его email. - Участник — пользователь 1Формы с выключенной синхронизацией → попадает в «Участники», но задача ему не ставится.
Если встреча создаётся в 1Форме: - Внешний сотрудник не может быть организатором. - Организатор с выключенной синхронизацией Exchange → встреча не создаётся в Exchange. - Участник-внешний сотрудник → задача в 1Форме ему не ставится; при включённой синхронизации у организатора — встреча ставится только в Exchange. - Участник 1Формы с выключенной синхронизацией → задача ставится в 1Форме; при включённой синхронизации у организатора — также ставится встреча в Exchange.
9. Помощник по планированию (Scheduling Assistant)¶
Позволяет подобрать время встречи, удобное для всех приглашённых участников.
Как открыть: кнопка «Помощник по планированию» в карточке создания встречи (категория типа «Календарь»).
Что отображается:
- Временная сетка с занятыми и свободными слотами каждого участника.
- При наведении на занятый слот — всплывающая подсказка с названием встречи из календаря пользователя.
- Участники из requiredAttendees отображаются с учётом провайдера (OForma / Exchange).
Позволяет выбрать временной слот, в котором все участники свободны, и сразу использовать его для встречи.
Бизнес-правила¶
- Для каждой операции используется активный и доступный пользователю провайдер календаря.
- Изменения событий должны быть отражены как в источнике провайдера, так и в пользовательском интерфейсе.
- Производственный календарь является единой опорной моделью для нерабочих дней.
- Ошибки провайдера не должны оставлять UI в «тихо неактуальном» состоянии.
- Фильтрация календаря категории:
- Все фильтры применяются по принципу логического AND
- Множественный выбор внутри одного ДП работает по принципу OR
- Настройки фильтров изолированы по категориям и пользователям
- В фильтрацию по ДП попадают только те параметры, на которые у пользователя есть права просмотра
- Экспорт в CSV учитывает все активные фильтры
Зависимости¶
tasks— встречи/события вOForma-ветке.integrations— внешние провайдеры (Exchange/CalDav).notifications— сигналы и счётчики.
Операционные риски¶
- Расхождение данных между внешним провайдером и локальной выборкой.
- Ошибки таймзоны/границ периода.
- Неинвалидированный cache unread-счётчиков.
Что проверять при инцидентах¶
- Ответы CRUD/agenda API и параметры диапазона.
- Источник данных провайдера и записи в
vCalendarTasksDenormalized. - Состояние unread cache.
- Данные
ProductionCalendar*для периодов с отклонением.