Перейти к содержанию

Календарь: бизнес-логика

Обзор

Календарный домен управляет событиями, встречами, повесткой и рабочими днями организации.

Домен поддерживает несколько провайдеров (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).

Позволяет выбрать временной слот, в котором все участники свободны, и сразу использовать его для встречи.

Бизнес-правила

  1. Для каждой операции используется активный и доступный пользователю провайдер календаря.
  2. Изменения событий должны быть отражены как в источнике провайдера, так и в пользовательском интерфейсе.
  3. Производственный календарь является единой опорной моделью для нерабочих дней.
  4. Ошибки провайдера не должны оставлять UI в «тихо неактуальном» состоянии.
  5. Фильтрация календаря категории:
  6. Все фильтры применяются по принципу логического AND
  7. Множественный выбор внутри одного ДП работает по принципу OR
  8. Настройки фильтров изолированы по категориям и пользователям
  9. В фильтрацию по ДП попадают только те параметры, на которые у пользователя есть права просмотра
  10. Экспорт в CSV учитывает все активные фильтры

Зависимости

  • tasks — встречи/события в OForma-ветке.
  • integrations — внешние провайдеры (Exchange/CalDav).
  • notifications — сигналы и счётчики.

Операционные риски

  • Расхождение данных между внешним провайдером и локальной выборкой.
  • Ошибки таймзоны/границ периода.
  • Неинвалидированный cache unread-счётчиков.

Что проверять при инцидентах

  1. Ответы CRUD/agenda API и параметры диапазона.
  2. Источник данных провайдера и записи в vCalendarTasksDenormalized.
  3. Состояние unread cache.
  4. Данные ProductionCalendar* для периодов с отклонением.