# Календарь

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

Он работает поверх нескольких источников — встроенного календаря 1Формы, Exchange и CalDav — и объединяет их в единый пользовательский сценарий.

## Бизнес-объекты

Календарь оперирует несколькими видами данных:

- Календарное событие/встреча.
- Агенда (выборка событий по периоду).
- Непрочитанные сообщения календаря.
- Производственный календарь (рабочие/нерабочие дни).

## Основные сценарии

Календарь охватывает несколько ключевых сценариев — от создания и согласования встречи до загрузки сетки и синхронизации с Outlook.

### 1. Действия со встречей

Создание, изменение, удаление и действия по событию (принять, отклонить и т.п.).

### 1a. Постановка встречи в чужой календарь

Пользователь может создать встречу, находясь в чужом календаре (например, открыв календарь коллеги). Правила:

- **Организатором** может быть текущий пользователь или владелец просматриваемого календаря. Если право создавать встречи в этом календаре есть, поле «Организатор» доступно для выбора из этих двух, по умолчанию подставляется владелец. Права нет — организатором становится текущий пользователь, а поле недоступно. В своём календаре поле тоже недоступно: организатор — сам пользователь.
- **Владелец** просматриваемого календаря, если он не стал организатором, автоматически добавляется в обязательные участники.
- **Текущий пользователь** также добавляется в участники.
- В помощнике по планированию оба участника отображаются корректно.
- Организатор закрепляется за встречей при создании: при последующем изменении он берётся из сохранённой встречи. Пользователь, не являющийся организатором, может изменить только статус занятости — тема, место, описание, участники, повторяемость, вложения и время восстанавливаются из сохранённых значений, ICS-письмо в этом случае не рассылается.
- Занятость такого пользователя записывается в его собственную копию встречи, а не в копию владельца просматриваемого календаря. Прежде чем записать, система убеждается, что найденная копия относится к той же встрече — по организатору и по времени; если подтвердить связь не удалось, занятость не сохраняется и система отвечает отказом. Организатор и системный робот, как и прежде, пишут занятость владельцу просматриваемого календаря.
- Удалить встречу может организатор, даже если она находится в чужом календаре. Обратное тоже верно: чужую встречу нельзя удалить и из собственного календаря — право на удаление определяет организатор встречи, а не владелец календаря, в котором она видна. Отмена подчиняется тому же правилу: отменить встречу может её организатор, а не владелец календаря, — организатор может отменить свою встречу и в чужом календаре.

**Как определяется режим формы.** Право создавать встречу в чужом календаре уточняется у сервера при каждом создании встречи из календаря, поэтому форма открывается уже с готовым режимом: право есть — организатором подставляется владелец просматриваемого календаря, а поле «Организатор» доступно; права нет — организатором остаётся текущий пользователь, а поле недоступно. После открытия режим не пересчитывается: пока форма открыта, право заново не спрашивается, поэтому организатор и состав участников не меняются на глазах у пользователя.

**Пока идёт проверка права.** Форма открывается не сразу: сначала пользователь ждёт ответа сервера и только потом видит карточку встречи. В это время повторные нажатия «Создать встречу» игнорируются — откроется ровно одна форма. Если за время ожидания пользователь перешёл в календарь другого сотрудника или ушёл со страницы, форма не откроется вовсе — нажатие придётся повторить. Если проверка права завершилась ошибкой, форма открывается в режиме «прав нет». В своём календаре проверка не выполняется — форма открывается сразу.

Права на удаление и отмену сверяются по роли в встрече. Во встроенном календаре 1Формы и во встречах-приглашениях это работает так:

| Кто выполняет действие | Удалить встречу | Отменить встречу |
|---|---|---|
| Организатор встречи | можно, в том числе в чужом календаре | можно, в том числе в чужом календаре |
| Владелец просматриваемого календаря, если он не организатор | можно | нельзя, система отвечает отказом |
| Участник, который не организатор | нельзя, система отвечает отказом | нельзя, система отвечает отказом |

Системный робот выполняет оба действия независимо от того, чей календарь открыт. Если перехода в отклонённое состояние в категории встреч нет, удаление и отмена отклоняются одинаково — сообщением «В категории не существует перехода в отклонённое состояние».

**Кто может создавать и править.** Во встроенном календаре 1Формы и во встречах-приглашениях создать встречу в чужом календаре может только владелец этого календаря или системный робот — права на просмотр событий для этого недостаточно. В Exchange возможность определяется правами почтовой папки владельца: создание — правом на создание элементов, а редактирование и удаление — только полным доступом к элементам папки; ролей уровня «свои элементы» для этого мало. Ни в одном источнике нельзя создавать, редактировать и удалять события в календаре, недоступном для просмотра, а возможность создавать не означает возможности удалять.

В CalDAV возможность создавать, изменять и удалять встречи в чужом календаре определяется правами, которые выданы пользователю на календарь коллеги на самом CalDAV-сервере — это делегирование календаря. Если право выдано, пользователь может создать встречу в календаре коллеги, а также изменить и удалить чужую встречу. Организатором такой встречи становится владелец календаря, а создавший или изменивший её пользователь указывается как действующий от его имени: получатели приглашения видят организатором владельца календаря. Делегирование поддерживает только сервер Kerio; у Яндекса, CommuniGate и стандартного CalDAV-провайдера такой возможности нет — попытка создать встречу в чужом календаре отклоняется, не доходя до сервера.

Кнопка «Создать встречу» в шапке календаря показывается всегда, наличие права она не проверяет: право проверяется при сохранении. Если его нет или оно отозвано, пока форма была открыта, сохранение отклоняется с сообщением «Нет прав на создание встречи в календаре {владелец}», форма остаётся открытой с введёнными данными и переключается в режим без права — организатором становится текущий пользователь, выбор организатора недоступен.

### 2. Загрузка календарной сетки

Первый переход на месяц, который ещё не загружался, укладывается в пару обращений к серверу: страницы списка задач грузятся параллельно, а повестка дня и цвета шаблонов — одновременно с ним. На больших месяцах сетка отрисовывается без заметных задержек, потому что события и задачи раскладываются по дням заранее, а не перебираются заново для каждого дня.



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

**Переиспользование загруженного диапазона.** Уже загруженные периоды запоминаются в браузере. Навигация по датам и переключение масштаба — месяц, неделя, день — внутри загруженного диапазона не порождают обращений к серверу; при открытии соседнего периода дозапрашивается только его недостающая часть. Запомненное разделено по действующему пользователю и режиму перевоплощения, владельцу отображаемого календаря, категории, применённому фильтру, часовому поясу отображения и источнику данных — события разных пользователей, категорий и фильтров между собой не смешиваются. Сигнал об изменении данных сбрасывает запомненное для текущей области, и видимый диапазон перечитывается.

**Точечное обновление сетки.** При обновлении данных сетка не перерисовывается целиком: система сравнивает показанный набор событий с новым и добавляет, обновляет или убирает только изменившиеся. Смена даты или названия события не приводит к перерисовке соседних событий и «миганию» сетки.

**Устаревшие ответы.** Если во время загрузки пользователь переключился на другой период или сменил фильтры, запоздавший ответ прерванной загрузки в сетку не попадает — показаны данные того периода, который открыт сейчас.

### 3. Работа со счётчиком непрочитанных

Счётчик автоматически пересчитывается при изменениях в сообщениях встреч.

### 4. Управление производственным календарём

Администратор обновляет рабочие и праздничные дни; изменения используются в расчётах сроков и в отображении календаря.

### 5. Календарное представление категории

В календарном представлении категории задачи и события отображаются в виде календаря с масштабом день, неделя или месяц. Каждая задача — активная ссылка на карточку. Клик по свободному слоту открывает карточку создания задачи.

![Календарное представление категории: задачи по датам (масштаб «Месяц»)](https://help.1forma.ru/help-images/calendar/calendar_subcat-1.png)

#### Масштабы

Доступно несколько масштабов отображения:

| Масштаб | Описание |
|---|---|
| Месяц | Задачи на месяц, список |
| Месяц (Карточка) | Задачи на месяц, карточки |
| Неделя | Задачи на неделю, список |
| Расписание | Задачи на неделю, карточки |
| Рабочая неделя | Задачи на неделю без выходных, список |
| День | Задачи на день, список |

В масштабе «Месяц» ячейка дня показывает не больше четырёх событий; остальные сворачиваются в ссылку «+ ещё N», которая раскрывает полный список дня во всплывающем окне. В масштабе «Месяц (Карточка)» ограничения нет — выводятся все события дня.

Администратор может предопределить доступные масштабы и масштаб по умолчанию. Выбор пользователя сохраняется между сессиями.

**Подсказка при наведении на задачу.** В масштабах со списком («Месяц», «Неделя», «Рабочая неделя», «День») наведение на задачу или отметку показывает подсказку со сведениями о событии. В масштабах с карточками — «Расписание» и «Месяц (Карточка)» — задача уже выведена карточкой со всеми ключевыми реквизитами, поэтому подсказка при наведении на карточку не показывается: ни всплывающая подсказка приложения, ни подсказка браузера. Для нерабочих дней и интервалов подсказка сохраняется во всех масштабах.

#### Вертикальный масштаб сетки

В видах «День», «Неделя» и «Рабочая неделя» над сеткой доступны кнопки масштаба: «лупа−», текущий процент, «лупа+». Масштаб меняет высоту слота (строки часа), а не шаг сетки: дробность остаётся прежней, меняется только высота часа.

Доступные значения: 50 %, 75 %, 100 %, 125 %, 150 %, 200 %. На 100 % сетка выглядит как раньше. На границах диапазона соответствующие кнопки недоступны.

Выбранный масштаб сохраняется для пользователя и применяется при следующем открытии календаря — на экране календаря, в своём профиле и в профиле коллеги. В видах «Месяц», «Месяц (Карточка)», «Расписание» и в списке кнопки не показываются.

**Карточка в масштабе «Расписание».** В этом масштабе задача выводится карточкой, собранной тем же конструктором, что и карточка представления «Канбан»: шапка, тело и подвал с выбранными полями и дополнительными параметрами. Шаблон берётся по категории самой задачи, поэтому в представлении с задачами нескольких категорий карточки могут выглядеть по-разному. Если у категории шаблон не задан, задача показывается прежней карточкой календаря: название, статус, срок и теги, ниже — исполнитель.

#### Фильтрация

События в календаре можно отобрать по дате и роли пользователя (кнопка на панели инструментов и заголовок диалога называются «Отбор»):

| Параметр фильтра | Описание |
|---|---|
| Срок | Активные задачи со сроком, независимо от исполнителя |
| Срок (Исполнитель) | Активные задачи, где пользователь — исполнитель |
| Срок (Ответственный) | Активные задачи, где пользователь — ответственный |
| Срок (Завершённые) | Завершённые/отклонённые задачи, где пользователь — исполнитель |
| Дата завершения | Завершённые/отклонённые задачи по дате завершения |
| Встречи | Только для категорий типа «Календарь» — по диапазону дат в параметрах «С» и «По» |
| Напоминания | Напоминания по задаче |
| Подписи | Запрошенные подписи, акцептант — текущий пользователь |
| Начало работы | Задачи по дате начала работы |
| Создание | Задачи по дате создания |

Дополнительно доступны фильтры по статусу (активные / закрытые / все), по роли (исполнитель, ответственный, организатор, наблюдатель, автор) и по дополнительным параметрам категории (ДП). Все фильтры объединяются по «И»; множественный выбор внутри одного ДП — по «ИЛИ». Настройки сохраняются отдельно для каждой категории. В персональном календаре выбранный «Отбор» хранится в браузере отдельно для своего календаря и для календарей коллег: для всех чужих календарей действует один общий набор, и он не меняет отбор своего. Список полей и преобразование выбранного значения в запрос общие для календаря, канбана, ресурсов и табличного представления — см. «Общее меню фильтров по дополнительным параметрам» в [справочнике по фильтрации](https://help.1forma.ru/domains/grids/filters-reference.md).
Одно и то же условие отбора по дополнительному параметру в канбане, календаре и ресурсах даёт одинаковую выборку. Сохранённые фильтры календаря продолжают работать после обновления страницы.

Одно и то же условие отбора по дополнительному параметру в канбане, календаре и ресурсах даёт одинаковую выборку. Сохранённые фильтры календаря продолжают работать после обновления страницы.

События по сроку и по дате завершения одной задачи показываются раздельно — это две отметки, а не одна. У отметки «Дата завершения» в контекстном меню есть только «Открыть в новой вкладке»: перенести срок и сменить статус из неё нельзя, потому что она показывает уже зафиксированную дату завершения, а не срок.

**Поддерживаемые типы ДП для фильтрации.** Список ДП формируется автоматически из параметров, настроенных администратором для категории; в фильтры попадают только те ДП, на которые у пользователя есть права просмотра.

| Тип ДП | Как работает фильтр |
|---|---|
| Список (выбор из значений) | Выпадающий список с выбором одного или нескольких значений |
| Да/Нет (чекбокс) | Чекбокс для фильтрации по значению «Да» / «Нет» |
| Текст | Поле для ввода текста (поиск по вхождению) |
| Число | Диапазон значений (от и до) |
| Дата | Выбор диапазона дат |
| Связь с другой категорией | Выпадающий список связанных объектов |
| Пользователь | Выбор пользователя из справочника |
| Lookup / выбор из списка | Выбор одного значения из выпадающего списка |
| MultiLookup | Выбор одного или нескольких значений |

Чтобы ДП появился в фильтрах календаря, помимо его создания и наличия у пользователя прав на просмотр, администратор должен включить ДП в настройку «Настройка вида календарь» в прочих настройках категории (правый клик по категории → Настройки → Прочее → Настройка вида календарь).

> Количество одновременно применяемых фильтров по ДП не ограничено. Первая загрузка большого диапазона с фильтрами на категории с десятками тысяч задач идёт на сервер и может занять заметное время; последующие переходы по датам и смена масштаба внутри уже загруженного диапазона выполняются без обращения к серверу — см. «Загрузка календарной сетки».

#### Экспорт в CSV

По кнопке «В CSV» выгружаются события за месяц в соответствии с текущими фильтрами:

| Колонка | Обозначение |
|---|---|
| Start | Дата начала события или срок задачи |
| End | Дата окончания или срок задачи |
| Title | Текст задачи или название события |
| Type | `CalendarEvent` — событие, `Task` — задача |
| Organizer | Организатор события или исполнитель задачи |
| TaskId | Номер задачи (для типа Task) |

### 6. Персональный календарь

**Повестка дня другого сотрудника.** Те же уровни доступа действуют и для повестки: при полном уровне видно всё — задачи, события, напоминания, подписи и встречи из внешних календарей; при уровне «тема и место» остаются только встречи внешних календарей с темой и местом; при уровне «только занятость» — только время и состояние занятости без темы и места. Если доступа к календарю сотрудника нет, повестка по нему не отдаётся вовсе — вместо данных приходит отказ. Своя повестка показывается полностью в любом случае.



Открывается из иконки «Календарь» в панели навигации. Под индикатором — счётчик непрочитанных событий.

**Внешний вид:**

- Серым показываются выходные и праздники; рабочие дни на субботу/воскресенье и предпраздничные — белым (как рабочие).
- В видах «Неделя» и «День» серым также заливается нерабочее время суток — до начала и после конца рабочего дня по заданному графику работы (по умолчанию с 09:00 до 18:00); при границах 00:00 или 24:00 заливки нет. Те же границы рабочего дня — из настроек рабочего времени пользователя — использует виджет «Календарь New» в большом размере: по ним считается конец адаптивного окна дня, производственный календарь для этого не применяется.
- Текущая дата выделена цветом, текущее время — красная черта.

При открытии календаря прокрутка сетки ставится на первую встречу дня; если встреч в дне нет — на начало рабочего времени по графику работы. Стрелки перехода на соседний период и кнопка «Сегодня» выставляют прокрутку заново.

**Периоды:** Месяц / Неделя / Рабочая неделя / День / Список. По умолчанию — Рабочая неделя (без выходных, праздничные дни видны). Кнопка «Сегодня» возвращает к текущей дате; стрелки `←/→` — на период вперёд/назад. Из представлений Месяц / Неделя / Рабочая неделя клик по дате переключает на День.

Ранее загруженные периоды переиспользуются: переход стрелками вперёд и назад и смена масштаба внутри загруженного диапазона не приводят к повторному обращению к серверу — см. «Загрузка календарной сетки».

![Персональный календарь пользователя в режиме «Рабочая неделя»](https://help.1forma.ru/help-images/calendar/calendar_user_new-01.png)

**Добавление чужих календарей.** Кнопка «Добавить календарь» позволяет видеть события **до 5 пользователей** одновременно. Каждый получает свой цвет; чтобы убрать — крестик в бейдже.

**Выделение одного календаря.** Когда добавлен хотя бы один чужой календарь, над сеткой появляется строка тегов. Первым всегда идёт тег владельца открытого календаря — на своём календаре это своё имя, на чужом — имя того, чей календарь открыт; у этого тега нет крестика, убрать его нельзя. Остальные теги — добавленные сотрудники, каждый своим цветом и с крестиком.

Клик по тегу выделяет этот календарь: его подпись становится полужирной, остальные теги и события невыделенных календарей уходят в прозрачность. Повторный клик по тому же тегу снимает выделение, клик по другому — переносит его; одновременно выделен только один календарь. Выделение держится, пока тег есть в строке: после удаления тега или добавления календаря оно пересчитывается, и если выделенного тега больше нет, выделение снимается.

**Кнопка «События»** открывает страницу с табличным представлением почтовых календарных событий за последние **две недели** (организатор, название, дата встречи) — это все изменения по встречам, отображающиеся в почтовом ящике пользователя. Новые события выделяются жирным; кнопка «Прочитать все» помечает прочитанными все видимые на странице. Прочтение синхронизируется с почтовым ящиком пользователя. Клик по строке открывает карточку события; кнопка обновления — рядом. Счётчик непрочитанных рядом с иконкой календаря в панели навигации.

#### Фильтр

В персональном календаре кнопка на панели инструментов и её диалог называются «Отбор». В них доступны фильтры по дате задачи и роли пользователя:

| Параметр | Что показывает |
|---|---|
| Срок (Исполнитель) | Активные задачи с пользователем-исполнителем по дате срока |
| Срок (Ответственный) | Активные задачи с пользователем-ответственным по дате срока |
| Срок (Завершённые) | Завершённые/отклонённые задачи по дате срока |
| Дата завершения | Завершённые/отклонённые по дате фактического завершения |
| Встречи | Встречи, в которых пользователь участвует |
| Напоминания | Напоминания по задачам |
| Подписи | Запрошенные подписи (пользователь — акцептант) — по дате срока подписи |
| Начало работы | По дате начала работы над задачей |
| Создание | По дате создания задачи |

**Когда тип «Задачи» доступен.** Тип «Задачи» в «Отборе» показывается, только если в рабочем пространстве пользователя заданы «Категории для работы в календаре»; без них тип не выводится, и в календаре категории его тоже нет. Пока тип не включён, задачи в календаре не запрашиваются.

**Если дерево категорий не загрузилось.** Календарь подписан на общее дерево категорий и при сбое загрузки не отписывается от него: он остаётся на последнем загруженном дереве, один раз на серию сбоев показывает сообщение об ошибке и продолжает ждать следующего обновления. Когда источник восстанавливается, дерево обновляется без перезагрузки страницы — перезапускать календарь или проверять его повторно не нужно. Ограничения рабочего места по категориям на холодном старте применяются сразу, не дожидаясь ответа сервера.

**Поток «Задачи» и группа «Моё участие».** В «Отборе» отмечаются типы событий — в том числе «Задачи». Поток «Задачи» показывает задачи выбранных категорий по датам начала работы, срока и создания, а группа «Моё участие» задаёт роль владельца календаря в задаче:

| Значение «Моё участие» | Что показывает |
|---|---|
| Все | Задачи, где владелец календаря — заказчик, исполнитель или подписчик (объединение трёх наборов) |
| Заказчик | Задачи, где владелец календаря — заказчик |
| Исполнитель | Задачи, где владелец календаря — исполнитель |
| Подписчик | Задачи, где владелец календаря — подписчик |

«Все» — значение по умолчанию. Каждая задача попадает на сетку один раз, даже если владелец календаря участвует в ней сразу в нескольких ролях. Задачи тех же категорий, где владелец не участвует ни в одной из трёх ролей, не показываются.

«Категории задач» сужает поток до выбранных категорий; если не отмечено ничего, берутся все категории, доступные владельцу для работы в календаре, — это не все категории системы. «Статус задачи» («Активные» / «Закрытые» / «Все») применяется к потоку «Задачи» вместе с ролью.

Роль берётся у владельца открытого календаря, а не у того, кто смотрит: в календаре коллеги «Все» показывает задачи, в которых участвует он.

**Отбор встреч по повторениям.** В блоке «По повторениям» выбирается одно значение: «Не выбрано» — повторения не учитываются, «Только повторяющиеся» — показываются только встречи из повторяющихся серий, «Только встречи без повторений» — только одиночные встречи. Выбор хранится в браузере и действует и на сетку календаря, и на выгрузку в CSV. В календаре категории, в календаре без встреч и в виджете с заданными типами событий блок не показывается.

В «Только повторяющиеся» попадает вся серия: и сама повторяющаяся встреча, и её вхождения, включая те, которые отредактировали отдельно от серии. В «Только встречи без повторений» остаются одиночные встречи, а серии и их вхождения скрываются.

**Отбор встреч по связи с задачей.** В блоке «Связь с задачей» выбирается «Не выбрано», «Да» или «Нет»: «Да» оставляет только встречи, связанные с задачей, «Нет» — только встречи без такой связи, «Не выбрано» связь не учитывает. Выбор так же хранится в браузере, действует на сетку и на выгрузку в CSV и скрыт в тех же календарях, что и блок «По повторениям».

Отбор по связи с задачей опирается на связь, которую отдаёт провайдер календаря. У встреч 1Формы это сохранённая связь встречи с задачей, у Exchange — служебное свойство события, которое проставляется при создании встречи из задачи. Встречи Exchange, созданные в календаре 1Формы, такого свойства не получают: ссылка на задачу у них живёт только в тексте события и показывается на карточке, поэтому по отбору «Связь с задачей = Да» такие встречи не находятся.

**Отбор «Скрыть дубли».** Чекбокс «Скрыть дубли» убирает с сетки календаря дублирующие события, когда встреча календаря повторяет задачу — например, встречу-активность, созданную в CRM.

Отбор доступен только тогда, когда в календаре одновременно включено отображение встреч и задач по времени «С/ПО». Если выбраны только встречи или только задачи, отбор заблокирован.

При включённом отборе встреча скрывается с сетки, а задача остаётся видимой, если выполнены все условия:

- встреча связана с задачей — создана из неё вручную или правилом автоматизации;
- задача отображается в календаре в тот же день по дополнительным параметрам диапазона времени «С/ПО» своей категории;
- в этот день у задачи ровно одна связанная встреча: если встреч несколько, ни одна из них не скрывается;
- время начала и время окончания встречи отличаются от времени задачи не больше чем на час (начало и окончание проверяются отдельно).

Если хотя бы одно условие не выполнено — встреча сдвинута больше чем на час или у задачи несколько связанных встреч в этот день, — встреча остаётся на сетке рядом с задачей. При выключенном отборе показываются все встречи и задачи.

**Отбор отменённых встреч.** В блоке «Показать отменённые встречи» выбирается «Не выбрано», «Да» или «Нет»: при «Нет» отменённые встречи в календаре не показываются, при «Да» и «Не выбрано» показываются вместе с остальными. Выбор так же хранится в браузере, действует на сетку и на выгрузку в CSV и скрыт в тех же календарях, что и блок «По повторениям».

**Отбор встреч по занятости.** В блоке «Занятость (Exchange)» можно отметить одно или несколько состояний — «Свободен», «Занят», «Под вопросом», «Нет на месте», «Работаю в другом месте»: тогда в календаре остаются только встречи с отмеченными состояниями занятости. Если не отмечено ни одно, отбор по занятости не применяется. Выбор так же хранится в браузере, действует на сетку и на выгрузку в CSV и скрыт в тех же календарях, что и блок «По повторениям».

**Отбор встреч по статусу ответа.** В блоке «Статус ответа» доступен множественный выбор из шести вариантов: «Принял», «Под вопросом», «Отказался», «Не ответил», «Организатор» и «Не указан». По умолчанию выбраны все пункты, поэтому видны все встречи, включая организованные самим пользователем; снятие отдельных флажков исключает из сетки встречи с этим статусом участия. Выбор хранится в браузере отдельно для своего и чужих календарей, распространяется на экспорт в CSV и не показывается в календарях категорий.

В блоке перечислены только эти пять состояний. Занятость, которую провайдер не сообщил, отдельным пунктом не отбирается: у встреч-задач с нераспознанным состоянием и у встреч из CalDAV без свойства занятости занятость считается неопределённой. Если событие CalDAV несёт признак отсутствия, оно показывается как «Нет на месте».

**Отбор встреч по организатору.** В блоке «Организатор» выбирается один сотрудник: поле устроено как поле выбора получателей в письме, имя подставляется из справочника с поиском. Пока выбор не сделан, отбор по организатору не применяется; сделанный выбор сужает календарь до встреч, организатором которых выступает выбранный сотрудник. Выбор так же хранится в браузере, действует на сетку и на выгрузку в CSV и скрыт в тех же календарях, что и блок «По повторениям».

**Отбор встреч «Мои встречи».** В блоке «Мои встречи» выбирается «Не выбрано», «Да» или «Нет»: «Да» оставляет только встречи, организатором которых выступает владелец календаря; «Нет» — встречи, организованные другим сотрудником; «Не выбрано» (вариант по умолчанию) не учитывает авторство встречи и показывает все встречи.

Признак «Мои» считается относительно владельца открытого календаря, а не смотрящего: в календаре коллеги выбор «Да» покажет встречи, организованные этим коллегой, а не текущим пользователем.

Выбор хранится в браузере, действует на сетку календаря и выгрузку в CSV. В календаре категории или раздела, в календаре без встреч и в виджете с фиксированными типами событий блок «Мои встречи» не показывается и в запрос не передаётся.

Отбор идёт по организатору встречи, а не по её участникам: сотрудник, приглашённый на встречу, но не являющийся её организатором, по этому отбору встречу не увидит. Адрес внешнего получателя, у которого нет учётной записи в 1Форме, в отбор не попадает и выборку не сужает.

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

**Интервал задачи на сетке.** Когда задача попадает на сетку календаря, её начало и конец берутся по настройкам её категории: если в категории указаны дополнительные параметры даты начала и окончания, интервал строится по ним, иначе — по системным полям задачи, дате начала работы и сроку. Правило действует и когда в календаре показаны задачи сразу нескольких категорий: каждая категория отбирается по своим настройкам, поэтому задача с интервалом в дополнительных параметрах попадает в видимое окно независимо от того, одна категория выбрана или несколько. Задачи в персональном календаре берутся из «Категорий для работы в календаре» (см. «Поток «Задачи» и группа «Моё участие»» выше); по тому же правилу каждая задача попадает в видимое окно сетки.

#### Выгрузка в CSV

Кнопка «В CSV» скачивает события за весь месяц с учётом текущих фильтров (даже если открыт период `Неделя` или `День`). Колонки: `Start`, `End`, `Title`, `Type` (`CalendarEvent`/`Task`), `Organizer`, `TaskId`.

#### Отображение событий

Событие — активная ссылка на карточку. Длительность отражается растягиванием ячейки от даты/времени начала до конца.

**Контекстное меню (ПКМ)** — набор пунктов зависит от того, кем в этой встрече является текущий пользователь:

- Вы организатор — «Отменить встречу».
- Вы участник — «Принять», «Под вопросом», «Отклонить».

Отменить встречу может только её организатор: право на отмену определяет организатор, а не владелец календаря, в котором встреча видна. Ответить на приглашение за другого участника нельзя — попытку изменить чужой ответ система отклонит. Набор доступных пунктов приходит с сервера и зависит от источника календаря.

Пункты контекстного меню повторяют действия из карточки встречи: те же ответы на приглашение и та же отмена. У обычной встречи в меню есть также «Открыть в новой вкладке» и «Изменить» — изменение открывает карточку сразу в режиме редактирования. Если доступных действий у встречи нет, пустое меню не открывается: остаётся стандартное меню браузера.

**Действия над всем рядом.** У повторяющейся встречи, где вы участник и можете принять приглашение, в контекстном меню кроме действий над одним повторением появляются пункты над всем рядом — «Принять ряд» и «Отклонить ряд». Они делают то же, что кнопка «Принять ряд» в карточке встречи, и меняют ответ сразу на всех повторениях серии, а не на одном выбранном: после обновления календаря все повторения показаны с новым ответом. У неповторяющейся встречи и у встречи, где вы организатор, этих пунктов в меню нет, а действия над одним повторением работают как раньше и меняют только это повторение.

<img src="https://help.1forma.ru/help-images/calendar/calendar_task_act-01.png" alt="Контекстное меню события: Принять / Под вопросом / Отклонить" width="360">

Выбор отражается в поле «Статус» карточки встречи и в виде вертикальной полосы слева:

| Полоса | Статус |
|---|---|
| Зелёная | Свободен |
| Синяя | Занят |
| Жёлтая | Под вопросом |
| Серая | Нет на месте |

Полоса соответствует значению поля «Показывать как» в карточке события. Иконки в правом нижнем углу — повторяющаяся встреча и наличие вложений.

**Подсказка при наведении.** Наведение на событие в сетке показывает подсказку: название, тип события, период, место проведения, статус занятости и участников. Если в месте проведения указана ссылка, она открывается прямо из подсказки; для ссылки на ВКС вместо адреса выводится «Присоединиться». Подсказка появляется и у остальных отметок календаря — сроков, начала работы, создания и завершения задач, подписей и напоминаний: в ней показывается тип отметки, задача и её дата.

**Состав подсказки.** Подсказка собрана по единому образцу для всех типов отметок. В шапке — заголовок, а справа от него цветная точка, если событие относится к чужому календарю. Ниже одной строкой идут отметки: слева значок типа и подпись, за ним дата, а у правого края — аватары участников, которые слегка перекрывают друг друга; имён рядом нет, и показываются не более трёх человек. Кого видно, зависит от роли: исполнитель задачи видит заказчика, заказчик — исполнителей. Цвет подписи типа различает срок и подпись, остальные типы выводятся обычным цветом. У напоминания справа выводится аватар его владельца, у подписи аватаров нет.



**Ответ на приглашение прямо из подсказки.** Если вы участник встречи и ещё не ответили, в подсказке выводятся кнопки **«Принять»**, **«Под вопросом»**, **«Отклонить»** и **«Предложить другое время»**. Кнопка делает то же, что одноимённая кнопка в карточке встречи, и подсказка сразу показывает новый ответ. У организатора встречи вместо них одна кнопка **«Отменить»**. Когда ответ уже дан — принято, под вопросом или отклонено, — вместо кнопок показывается текст ответа с иконкой; у отменённой встречи кнопок нет, а название перечёркнуто. Подсказка остаётся открытой, пока курсор находится на ней, поэтому по кнопкам можно навести и нажать, не потеряв подсказку.

**Отметки «Подпись» и «Напоминание».** Эти отметки появляются на сетке, только когда в «Отборе» включены соответствующие типы: событие-подпись встаёт на дату срока подписи, событие-напоминание — на дату напоминания. Пока тип выключен, отметок нет: события этого типа у сервера не запрашиваются.

При наведении на такую отметку открывается подробная подсказка: у напоминания в заголовке выводится текст напоминания, ниже — бейдж «Напоминания» с иконкой, дата напоминания и фотографии людей по роли — заказчика или исполнителя задачи; у подписи — заголовок, бейдж «Подпись» с иконкой и срок подписи.

Подсказка закрывается, когда курсор уходит с отметки. Клик по отметке открывает задачу так же, как у отметок по сроку и дате завершения.

**Перенос задачи мышью по сетке календаря.** Если задача отображается в календаре по дате начала работ и сроку (системным датам), период её выполнения можно изменить перетаскиванием карточки на новые даты:

- при переносе открывается диалог причины переноса, если для категории настроена её обязательность; причина запрашивается один раз и применяется сразу к обеим датам;
- обе даты записываются одной операцией — ситуации, когда изменилась только одна из них, не бывает;
- если сохранение отклонено сервером (нет прав на изменение срока или даты начала, срок заблокирован, нарушены ограничения маршрута или проверки дат), карточка на сетке возвращается на прежнее место, ни одна из дат на сервере не меняется, а пользователю показывается причина отказа;
- если задача отображается только по одной дате — только по сроку или только по дате начала, — переносится эта дата.
- если задача показана по дополнительным параметрам времени начала и окончания («С/ПО») своей категории, перенос записывает эти дополнительные параметры, а не системные даты;
- если задача показана и по сроку, и по дате начала работ, причина смены срока запрашивается до первой записи: отмена диалога не оставляет на сервере частичных изменений;
- дата создания и дата завершения задачи переносом не меняются;
- длительность задачи растягиванием карточки на сетке не меняется: переносится только весь интервал задачи.

#### Просмотр календарей других пользователей

В профиле пользователя — вкладка «Календарь» (полный) и блок встреч на текущую неделю на вкладке «Профиль». Кнопка раскрытия на полный экран — в правом верхнем углу.

Календарь другого сотрудника показывается по его местному времени: часы на сетке, полосы нерабочего времени и линия текущего момента расставлены по часовому поясу владельца календаря, а не зрителя. Задача, время которой близко к полуночи, показывается в клетке того дня, к которому относится по времени владельца календаря, независимо от часового пояса браузера. **Перенос встречи в чужом календаре.** Время в клетке сетки календаря коллеги показано по его часовому поясу — по тому же поясу система показывает день и время и в диалоге, который открывается при переносе встречи. Подпись целевого периода совпадает с клеткой, куда встречу переносят, даже если часы на компьютере пользователя настроены на другой пояс. При совпадающих поясах подпись выглядит как раньше.

Когда пояса различаются, рядом с заголовком периода выводится метка смещения владельца от UTC (например, «UTC+3») — она показывает, что время на сетке не совпадает с собственным временем зрителя. Встреча, созданная из такого календаря, открывается с тем же временем, что на сетке, — см. «Часовой пояс при создании встречи» в разделе «Карточка календарного события».

При ограничении доступа администратором события чужих сотрудников отображаются как некликабельные синие слоты «Занят» без деталей. В профиле и краткой карточке отображается только статус (Занят / Под вопросом / Нет на месте / Свободен) и время.

Тот же уровень определяет и сетку календаря коллеги. Без доступа события этого календаря в сетку не приходят вовсе; при уровне «только занятость» остаются синие слоты «Занят» — без названия встречи, без номера связанной задачи и без возможности открыть событие; полные сведения доступны владельцу календаря и коллеге при взаимном праве группы «Просматривать календарные события членов группы». Свой календарь и общие календари работают как прежде.

Тот же уровень доступа действует в блоке встреч на вкладке «Профиль» и в статусах коллег в списке сотрудников. Что именно видно, зависит от уровня:

| Уровень | Чужие встречи в профиле | Чужие отсутствия в статусах коллег |
|---|---|---|
| Нет доступа | встреча не показывается | запись об отсутствии не показывается |
| Только занятость | имя занятости, место не выводится, ссылки нет | время и имя занятости; если имя пустое — «Занят» |
| Тема и место | тема и место встречи, ссылки нет | как при «только занятости»: у отсутствия нет темы и места |
| Полные сведения | тема, место и ссылка на встречу | полный текст отсутствия |

Свои встречи и свои отсутствия всегда показываются полностью.

#### Оповещения о встречах

За **15 минут** до начала события в правом верхнем углу под панелью навигации появляется баннер: время, название встречи, активная ссылка из поля «Место встречи» (открывается в новой вкладке).

| Действие | Эффект |
|---|---|
| Отложить на 5 / 10 минут / до начала | Скрыть баннер на выбранное время |
| Закрыть (крестик) | Скрыть напоминание до конца встречи |

Независимо от выбранного отложенного времени, баннер всегда показывается за **1 минуту** до начала. Если встреча отменена — оповещение не показывается.

Пока встреча идёт, в баннере выводится отметка «Сейчас»; после её окончания — «Просрочено» и в скобках время начала. Просроченное напоминание автоматически скрывается через 30 минут после окончания встречи. Отложенное напоминание не скрывается автоматически: оно остаётся на экране и во время встречи, и после неё, пока пользователь не закроет его или не перейдёт по ссылке подключения.

Цвет баннера — противоположный теме приложения (тёмный в светлой, светлый в тёмной).

При свёрнутом или неактивном окне — приходят **уведомления рабочего стола**, клик по уведомлению переключает на 1Форму.

> Оповещения отключаются в [персональных настройках уведомлений](https://help.1forma.ru/domains/notifications/business.md): пункт «Напоминания о встречах».

### 7. Карточка календарного события

#### Способы создания

Создать встречу можно из нескольких мест интерфейса:

| Способ | Поведение |
|---|---|
| Кнопка «Создать» в календаре | Основное нажатие открывает то, что задано настройкой рабочего места, — форму создания задачи в категории или пустую карточку встречи; стрелка рядом открывает меню (см. ниже) |
| Кнопка «Создать» в панели навигации → «Встречу» | Открывает пустую карточку |
| Клик по свободной ячейке календаря | Подтягиваются дата и время начала/окончания (по умолчанию +30 мин). Растягивание мыши без отпускания задаёт более длинный интервал |
| Меню «Запланировать» в шапке задачи | Подписчики задачи автоматически добавляются в участники |

#### Кнопка «Создать» и создание задачи из календаря

В персональном календаре кнопка «Создать» ведёт себя по настройкам рабочего пространства пользователя:

- **Категории для работы в календаре.** Если они заданы, в «Отборе» появляется тип «Задачи», а в меню кнопки «Создать» перечисляются категории рабочего места, куда можно создать задачу, отдельным пунктом — «Выбор категории».
- **Категория основного нажатия.** Если она задана, основное нажатие «Создать» открывает форму создания задачи в этой категории; иначе открывается пустая карточка встречи.
- **Скрытие создания события.** Настройка может убрать из меню пункт создания события в календаре — тогда кнопка «Создать» не делится на нажатие и стрелку, а сразу открывает меню.
- **Нет доступных календарных категорий.** Если пользователю не доступна ни одна категория, кнопка сразу открывает выбор категории, в которую поставить задачу.
- **Выбор категории.** Пункт «Выбор категории» открывает окно выбора категории, после выбора открывается форма создания задачи в выбранной категории.

**Дата и время места клика.** Если пользователь выделяет интервал на сетке или кликает по свободному слоту и создаёт задачу, дата и время места клика подставляются в форму создания задачи. Значение попадает в первое подходящее поле по приоритету: дополнительный параметр времени начала задачи выбранной категории → «Срок» → «Дата начала работ». Если подходящее поле для категории не настроено или недоступно для заполнения, форма открывается без подставленной даты — это не ошибка.

Вид календаря категории и работа со встречами Exchange не меняются: в календаре категории кнопка остаётся прежней «Создать встречу».

#### Поля карточки

Карточка события состоит из следующих полей:

| Поле | Поведение |
|---|---|
| Организатор | По умолчанию — создатель события. При создании из чужого календаря поле доступно для выбора, если есть право создавать встречи в этом календаре: выбрать можно владельца календаря (подставляется по умолчанию) или себя. Права нет — организатором становится текущий пользователь, поле недоступно. Переключение организатора пересобирает обязательных участников: тот из двоих, кто не стал организатором, добавляется в участники; уже добавленные вручную участники сохраняются. При изменении встречи организатор берётся из сохранённых значений и не меняется. В CalDAV при выданном на сервере праве (делегировании) организатором создаваемой в чужом календаре встречи всегда становится владелец календаря, а от его имени действует текущий пользователь — приглашения участникам уходят с организатором-владельцем. Активное поле выглядит как соседние редактируемые поля формы — с обводкой и подсветкой при наведении; заблокированное поле рамки не имеет и выглядит как обычный текст. |
| Название * | Обязательное |
| Участники | Пользователи системы и **внешние email** (формат `pochta@mail.ru`; иначе значение удаляется). Кнопка «Помощник по планированию» открывает [подбор времени](#9-помощник-по-планированию) |
| Длительность | 5 / 10 / 15 / 30 / 45 мин, 1 / 1,5 / 2 ч. После выбора пересчитывает время окончания |
| Дата и время | При включении «Весь день» обе границы — `00:00`. Если время не выбрано вручную, начало автозаполняется округлением до **ближайшего часа вперёд** (16:00, 16:34 или 16:55 → 17:00). При сдвиге окончания раньше начала система автоматически сдвигает начало, чтобы сохранить положительную продолжительность. Границы времени встречи проверяются на сервере при любом способе создания и при изменении встречи, в том числе при переносе и растягивании в сетке календаря: обе даты должны попадать в диапазон с 01.01.1753 по 31.12.9999, а окончание — быть строго позже начала; нулевая и отрицательная продолжительность не принимаются. В режиме «Весь день» окончание рассчитывается от следующих суток, поэтому 31.12.9999 в этом режиме выбрать нельзя. Встреча с недопустимыми датами не создаётся и не сохраняется, вместо этого возвращается сообщение о том, какая именно граница неверна |
| Повторять | Никогда / Ежедневно / Еженедельно / Ежемесячно в тот же день / Ежемесячно на той же неделе / Ежегодно в тот же день / Ежегодно на той же неделе. **Недоступно в Exchange-режимах «Синхронизация» и «Выключено»** |
| Место встречи | Адрес или ссылка. Кнопка «Ссылка на встречу» автоматически добавляет ссылку на личную ВКС в это поле и подпись со ссылкой в «Описание». Если у комнаты установлен пароль — в описание добавляется строка «Код доступа: XXXX». Ссылка, подпись и строка с кодом доступа входят в служебный блок, который система собирает сама: он пересобирается целиком при открытии карточки и при изменении полей «Связано с» и «Место встречи», поэтому ручные правки внутри блока не сохраняются. Текст за пределами блока не затрагивается; при снятии ВКС-ссылки блок удаляется вместе с разделителем. Название площадки в поле берётся из параметра «Имя приложения» в Общих настройках приложения режима администрирования. Иконка справа копирует ссылку. Ссылка распознаётся в значении поля по образцу адреса, и служебные символы в нём — кавычки, угловые скобки — подпись и разметку описания не ломают |
| Показывать как | Тип отсутствия: Отпуск / Встреча / Удалённая работа / Прочее. Тип определяет цвет имени пользователя в системе во время события. Список настраивается администратором |
| Связано с | Номер связанной задачи. После создания — в задачу публикуется автоматический служебный комментарий участникам от имени организатора. В почтовом уведомлении о встрече, связанной с задачей, отображается блок «Перейти» со ссылкой на эту задачу. При заполненном поле в «Описание» встречи добавляется строка «Встреча создана из: #номер» со ссылкой на задачу — она входит в служебный блок, который система собирает сама (см. «Место встречи»). Если у встречи есть и ссылка на видеоконференцию, и связь с задачей, обе части выводятся в одном блоке. Для пользователей с провайдером календаря CalDAV поле не отображается — ни при создании, ни в карточке встречи: связь встречи с задачей для CalDAV не хранится. Поле ведётся у организатора и переносится в карточки участников: при создании встречи, при замене связанной задачи и при её очистке. Значение в карточке участника перезаписывается, только когда оно отличается от значения у организатора. |
| Статус (для участника) | Принять / Под вопросом / Отклонить. До выбора — «Неизвестно». Кнопки блокируются на время выполнения перехода. После того как переход выполнен, кнопка выбора текущего статуса исчезает, а кнопки остальных действий остаются доступны. Участник всегда может изменить решение — оставшиеся варианты остаются доступными |
| Описание | Текст. В режиме просмотра длинный фрагмент без пробелов — длинная ссылка или строка-разделитель служебного блока — переносится внутри колонки «Описания» и не заходит на список участников справа. Обычный текст переносится по словам. При сужении окна список участников переносится под поля карточки, а описание остаётся в границах своей колонки. В режиме редактирования и в форме создания встречи поведение не изменилось. |
| Файлы | Вложения |

**Ссылка на конференцию и определение встречи.** Если в поле «Место встречи» указан адрес конференции, по нему определяется, какая встреча связана с комнатой ВКС: страница конференции показывает авторизованному пользователю название встречи, время начала и окончания, а для повторяющейся встречи — время ближайшего повторения. Адрес распознаётся и в прямой форме, и в форме страницы портала (`/conference?room=…`); сравнение идёт по полному адресу, поэтому ссылка с похожим именем комнаты внутри другого адреса встречей не считается. Встречи внешних календарей (Exchange, CalDAV) в этом сценарии не участвуют.

**Открытие ссылок в описании.** Ссылки в описании встречи открываются в новой вкладке браузера с отвязкой от карточки встречи. Это же касается ссылок, пришедших из внешних календарей: система приводит их к безопасному виду при отображении. Сохранение встречи не добавляет в описание служебные атрибуты отображения — текст описания от этого не меняется.

**Открытие ссылок в описании.** Ссылки в описании встречи открываются в новой вкладке браузера с отвязкой от карточки встречи. Это же касается ссылок, пришедших из внешних календарей: система приводит их к безопасному виду при отображении. Сохранение встречи не добавляет в описание служебные атрибуты отображения — текст описания от этого не меняется.

**Часовой пояс при создании встречи.** Карточка, открытая из календаря, показывает дату и время в часовом поясе этого календаря: в календаре другого сотрудника — в поясе владельца, так же как на его сетке; в своём календаре и при создании из панели навигации или из задачи — в поясе из профиля пользователя. Под полями даты и времени выводится строка «Часовой пояс» со смещением от UTC на дату начала (например, «UTC+3»), если пояс календаря отличается от пояса пользователя или если пояс организатора или кого-то из сотрудников в «Участниках» отличается от пояса календаря либо не определён; когда пояс участника определить не удалось, открывается сообщение об ошибке загрузки. При сохранении встреча записывается как один момент времени, и каждый участник видит её в своём местном времени; события «весь день» по датам не сдвигаются. Часовой пояс в самой встрече не сохраняется: при изменении встречи время показывается в поясе пользователя.

![Карточка встречи: организатор, участники, длительность, время, место и описание](https://help.1forma.ru/help-images/calendar/calendar_task_edit-01.png)

#### Участники и их статусы

В карточке события рядом с основными полями выводится список участников с их ответами на приглашение: «Принял», «Под вопросом», «Отказался», «Не ответил». Создатель встречи отмечен как «Организатор». Если ответ не получен от календаря — например, участник добавлен внешним адресом — статус показывается как «Не указан».

Над списком — общее число участников и разбивка по ответам: приняли, под вопросом, не ответили, отказались, не указано. Список можно упорядочить по порядку добавления, по статусу или по алфавиту; выбранный порядок действует до закрытия карточки и не сохраняется. Сначала показываются первые десять участников, остальные раскрываются ссылкой «Показать все». В режиме просмотра встречи ФИО организатора и участников открывают краткую карточку профиля по наведению: достаточно задержать курсор на имени примерно на полсекунды — карточка появляется, при быстром проходе курсора она не открывается. В форме редактирования встречи карточка профиля не открывается, поведение полей не меняется.

#### Поведение для отсутствий

При создании отсутствия в поле **Участники** автоматически указывается сотрудник, для которого регистрируется отсутствие (можно регистрировать для других при наличии прав, например HR за заболевшего). При создании из профиля пользователя в поле **Уведомить** автоматически добавляется его непосредственный руководитель и прямые подчинённые.

Чужое отсутствие показывается только при доступе к календарю сотрудника: если доступа нет, отсутствия в списке не будет вовсе; при уровне «только занятость» остаётся интервал без названия события, а на полном уровне доступно и название. Начало и конец отсутствия передаются как моменты времени в UTC и показываются в часовом поясе смотрящего, поэтому у сотрудников в разных поясах интервал читается одинаково. Своё отсутствие показывается полностью, включая название события, пришедшее из внешнего календаря.

**Текст чужого отсутствия** показывается, только если у смотрящего есть доступ к задаче отсутствия; иначе вместо него выводится общая подпись о событии. Своё отсутствие владелец видит полностью. То же правило действует в мобильном приложении.

**Состав отсутствия при разных уровнях доступа.** Отсутствие чужого сотрудника в профиле, краткой информации, списке коллег и результатах поиска пользователей собирается по уровню доступа смотрящего к календарю владельца. Если доступа нет, запись не показывается вовсе. При уровнях «только занятость» и «тема и место» остаются период отсутствия и название состояния занятости, а текст отсутствия и список участников не показываются. При полном доступе выводится исходный текст отсутствия, а для отсутствия, созданного задачей, дополнительно показываются участники задачи; у отсутствия по встрече участники не показываются. Своё отсутствие владелец видит полностью.

Название состояния занятости берётся из того же справочника, что и в сетке календаря, поэтому совпадает с подписью встречи при том же уровне доступа.

**Отсутствия в сигналах присутствия.** Тот же состав данных приходит и в сигналах, которые обновляют статус коллеги без перезагрузки страницы, — «стал онлайн» и «печатает». Данные собираются отдельно для каждого получателя по его правам, поэтому один и тот же сигнал разным людям приходит с разным составом сведений.

#### Изменение события

#### Изменение повторяющегося ряда

Чтобы изменить повторяющуюся встречу, открывают нужное вхождение и выбирают «Изменить ряд». Откроется форма встречи с полями и настройками повторения, заполненными данными ряда.

В верхней части формы выбирается область изменения:

- **Изменить весь ряд** — изменения применяются ко всей повторяющейся встрече;
- **Изменить ряд с <дата>** — изменения применяются к выбранному вхождению и следующим за ним; дата в подписи соответствует дате вхождения, с которого открыли форму. Этот вариант выбран по умолчанию, если календарь его поддерживает.

Для CalDAV и календаря задач доступно только изменение всего ряда: вариант «с даты» для них не показывается, а изменение всего ряда продолжает работать как раньше. При выборе «с даты» на первом вхождении ряда операция выполняется как изменение всего оставшегося ряда — отдельное продолжение с той же даты не создаётся. Изменение отдельного вхождения — другой режим: оно меняет только выбранную встречу, остальные вхождения остаются без изменений.

Кто и как может менять уже созданное событие:

- Организатор переходит к редактированию встречи прямо из карточки просмотра — кнопкой с карандашом в панели действий. У участников этой кнопки нет.
- Список участников может менять **только организатор**.
- Сохранение встречи не сбрасывает ответы участников: если состав не менялся, каждый участник считается тем же, и его ответ на приглашение сохраняется — в том числе когда почта в карточке пользователя не заполнена или отличается от той, что записана у встречи.
- Организатор и каждый участник имеют **отдельную карточку** события в своём календаре.
- Изменения организатора синхронизируются с задачами всех участников.
- Изменения участника действуют только в его карточке (не у остальных). При сдвиге времени участником организатор получает уведомление.
- При удалении встречи организатором её копии в календарях других участников не удаляются: они отвязываются от встречи организатора и остаются у участников самостоятельными событиями.
- При синхронизации с Exchange у участника доступна кнопка **«Предложить новое время»** с двумя вариантами:
  - *Принять под вопросом и предложить другое время* — при отказе организатора статус меняется на «Под вопросом».
  - *Отклонить и предложить другое время* — при отказе статус «Отклонено» и удаление из участников.
- Кнопка «Ссылка на встречу» в режиме редактирования отображается, если поле «Место встречи» пустое.
- **Перетаскивание**: перенос карточки в календаре меняет дату и время. Если встреча повторяющаяся или в ней есть участники кроме организатора, система спрашивает подтверждение с новой датой — до подтверждения перенос не сохраняется.

При переносе отдельного вхождения повторяющейся встречи меняется только это вхождение — остальные встречи серии остаются на прежних датах; это относится и к первому вхождению, дата которого совпадает с началом серии.

**Изменение повторяющейся встречи (ряда).** У повторяющейся встречи в карточке просмотра есть ссылка **«Изменить ряд»**, которую видит организатор встречи. Она открывает форму создания события, уже заполненную данными ряда: все поля и настройки повторений раскрыты и доступны для правки. Над формой — переключатель из двух пунктов: **«Изменить весь ряд»** применяет правку ко всем встречам ряда, **«Изменить ряд с <дата>»** — с даты той встречи, по которой кликнули, включительно; второй пункт выбран по умолчанию, дата подставлена датой клика.

**Доступность режима «с даты».** Разрезать ряд с даты умеют встроенный календарь 1Формы и Exchange — для них сервер сообщает признак поддержки, и второй пункт переключателя показывается. На CalDAV и в календаре задач изменение ряда с даты не предлагается: в переключателе остаётся только «Изменить весь ряд», и он работает как раньше.

**Что происходит при разрезе.** Встречи до выбранной даты не меняются. Повторения, отредактированные по отдельности после границы, переходят в новый ряд вместе со своими правками: в календаре 1Формы их ответы участников сохраняются, а в Exchange новый ряд приходит участникам приглашением, и они отвечают на него заново — как в Outlook. Участники получают два письма: уведомление об изменении прежнего ряда с отменой срезанных встреч и приглашение на новый ряд, каждое по одному разу. Изменение всего ряда и правка одного повторения работают как прежде.

#### Отменённые встречи

Отображаются серыми блоками с перечёркнутым названием. Карточка открывается только для чтения; в ней доступна кнопка **«Удалить из календаря»** (также через ПКМ по событию). В календарях других пользователей кнопка не отображается.

Отмена и удаление применяются на сетке сразу: после того как организатор отменил встречу, её карточка закрывается, а событие тут же показывается отменённым — серым блоком с перечёркнутым названием, без обновления страницы. Положение переключателя «Показать отменённые встречи» при этом не сбрасывается. Удаление встречи или ряда отменённых вхождений так же сразу снимает их с сетки.

У отменённой повторяющейся встречи рядом появляется **«Удалить ряд из календаря»** (то же действие есть в контекстном меню события на сетке календаря) — она убирает из календаря участника все вхождения серии сразу, а не одно выбранное. Действие затрагивает только календарь того, кто его выполнил: организатор и остальные участники ничего не теряют. Убираются лишь те вхождения, которые организатор действительно отменил: вхождения той же серии, оставшиеся активными, остаются в календаре. Удалить ряд можно только у встречи, полученной от организатора и им же отменённой; во встроенном календаре 1Формы и в Exchange это поддерживается, у остальных источников — нет.

Ответ на приглашение по всему ряду — «Принять ряд» и «Отклонить ряд» — доступен из контекстного меню повторяющейся встречи и меняет ответ на всех её повторениях.

Изменение ряда, в том числе с выбранной даты, выполняется из карточки встречи по ссылке «Изменить ряд» — см. «Изменение события»; удаление ряда из календаря участника — отдельное действие, доступное только у отменённой встречи.

<img src="https://help.1forma.ru/help-images/calendar/calendar_task_canceled.png" alt="Карточка отменённой встречи с кнопкой «Удалить из календаря»" width="480">

#### Вложения в карточке

В форме создания и редактирования встречи кнопка сохранения ждёт окончания загрузки вложений: пока не завершились все начатые файловые операции, она недоступна. Если файлы добавляли дважды подряд, кнопка откроется после обеих загрузок. Повторный выбор уже загруженного файла кнопку не блокирует, а ошибка загрузки не оставляет её закрытой.

Файлы — в блоке «Вложения». Если у пользователя нет права на редактирование и вложений нет — блок скрыт. При наведении справа: «Скачать всё одним архивом» и «Вложить файл». ПКМ по файлу — Скачать / Открыть в новой вкладке / Скопировать ссылку / Удалить. Офисные файлы открываются для просмотра в [R7 / OnlyOffice](https://help.1forma.ru/domains/files/business.md#интеграция-с-редакторами-р7--onlyoffice).

#### Учёт трудозатрат

При назначении встречи участникам автоматически фиксируются **плановые** трудозатраты по времени встречи. По окончании встречи у тех, кто принял участие (статус «Принять»), фиксируются **фактические** трудозатраты.

### 8. Синхронизация с Outlook / Exchange

При включённой синхронизации события из 1Формы появляются в Outlook (и наоборот) **в течение одной минуты**. Изменения параметров встречи в одной системе отражаются в другой. Цвет встречи в Outlook соответствует значению поля «Показывать как» в карточке события.

> Технические подробности синхронизации с Exchange — [provider-ews.md](https://help.1forma.ru/domains/calendar/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.

**Письмо-приглашение внешнему участнику.** При создании или изменении встречи в 1Форме внешнему участнику (его email указан в поле «Участники») на этот адрес отправляется письмо-приглашение: HTML-тело по шаблону и вложенный файл календаря `.ics`. В теле указываются название встречи, дата и время (для встречи «весь день» — только дата), описание и место проведения (если поле «Место» содержит ссылку — кликабельной, иначе текстом; при пустом поле блок не выводится). Подписи письма локализованы. Это относится к доставке приглашения по SMTP (работа с сервисами Exchange отключена либо синхронизация идёт по SMTP); при прямой синхронизации с Exchange приглашение отправляет сам Exchange, и шаблон 1Формы не применяется.

**Приглашения на встречи только для чтения.** Часть встреч приходит из Exchange приглашением, а не готовой встречей. Такое событие в 1Форме открывается только для просмотра: видны название, время, место, описание, организатор, участники, повторяемость и вложения, но кнопок ответа нет — принять, отклонить или предложить другое время можно в Outlook. Напоминание по такому событию не приходит, и связь с задачей у него не заполняется.

Чужое приватное приглашение не открывается вовсе. Если доступ к календарю коллеги ограничен, приглашение показывается урезанным — так же, как обычные встречи при том же уровне доступа.

### 9. Помощник по планированию

**Подсказка при наведении на событие.** При наведении курсора на событие в календарной сетке или в календарном виджете показывается расширенная информация без открытия карточки. Содержимое зависит от типа события: выводятся полный заголовок, тип, дата или период, а для чужого события — цветовая метка рядом с заголовком. Ширина подсказки подстраивается под содержимое и не превышает 350 px.

Для обычной встречи показываются бейдж «Событие» и, если задано, бейдж повторения (значение «Никогда» не выводится). Для события в пределах одной даты — дата, время начала и окончания и длительность; если событие занимает несколько дат, отдельно указываются начало и окончание. Место проведения показывается только при заполненном поле: текст сопровождается иконкой, ссылка открывается по нажатию, для видеосвязи выводится ссылка подключения.

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

**Как открыть:** кнопка «Помощник по планированию» в карточке встречи категории типа «Календарь» — и при создании, и при редактировании.

**Что отображается:** Каждый человек показан в помощнике один раз: организатор и приглашённый участник не дублируются.

- Временная сетка с занятыми и свободными слотами каждого участника.
- При наведении на занятый слот — всплывающая подсказка с названием встречи из календаря пользователя.
- Участники отображаются с учётом их источника календаря (встроенный календарь 1Формы или Exchange).

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

**Часовые пояса участников.** Сетка строится в часовом поясе встречи: он берётся из параметра, с которым открыт помощник, а если параметра нет — из профиля текущего пользователя. Границы рабочего дня общие для всех — из настроек рабочего времени приложения, — но у каждого участника отсчитываются в его собственном поясе и уже потом проецируются на шкалу встречи. Поэтому у коллеги из другого пояса рабочее время смещено относительно шкалы, а нерабочее закрашено серым. Шкала по умолчанию охватывает часы с 8:00 до 20:00 и расширяется, если чьи-то рабочие часы или встречи выходят за эти границы.

**Доступность и часовой пояс профиля.** Свободные и занятые интервалы участника считаются в часовом поясе его профиля: рабочее окно из настроек приложения переводится в абсолютное время по этому поясу, поэтому при просмотре из другого пояса границы рабочего дня не смещаются, а интервалы совпадают с тем, что показывает Outlook за тот же период. Если сотрудник сменил часовой пояс в профиле, занятость пересчитывается автоматически: кеш сбрасывается, данные обновляются следом. Смена пояса, пришедшая из синхронизации с каталогом или из 1С, обрабатывается так же, как ручная правка профиля; если пояс не менялся, доступность не пересобирается.

Если часовой пояс участника определить не удалось, рядом с именем выводится «Часовой пояс неизвестен». Чужой пояс вместо него не подставляется: рабочие часы для такой строки не показываются, и выбрать по ней слот нельзя.

**Недоступная повестка участника.** Строки участников загружаются независимо друг от друга: отказ или сбой по одному сотруднику не скрывает остальных. У такой строки показывается отметка о недоступности, выбрать по ней слот нельзя, а общей ошибки на всю сетку не выводится. Своя повестка и повестка доступного коллеги работают как прежде.



**Выбор времени.** Клик по свободному месту шкалы выбирает начало встречи на начало 15-минутного интервала, в который попала точка клика, и сразу передаёт дату и время в карточку встречи. Например, клик в точке 10:40 устанавливает начало на 10:30. В последнем часу шкалы начало не устанавливается позже последнего 15-минутного интервала; продолжительность встречи остаётся такой, как задана в карточке. Клик по занятому событию или по синей полосе текущей встречи время не меняет. В строке участника с неизвестным часовым поясом выбрать время нельзя.

**Выделенный интервал встречи.** Если помощник открыт из формы, где у встречи уже заданы начало и окончание, её интервал рисуется на шкале каждой строки сплошной полосой основного цвета темы — он виден независимо от занятости участников. При наведении на полосу выводится подсказка «Новая встреча». Если время встречи не задано, полоса не отображается.

Продолжительность возвращаемого слота — та же, что была у встречи в форме; если ни начала, ни окончания в форме нет, слот занимает час. При переходе на другой день полоса переносится на этот день с тем же временем суток и той же продолжительностью. Клик по полосе выделенного интервала время не выбирает и помощник не закрывает.

Кнопка «Помощник по планированию» недоступна для встреч «Весь день» и для встреч, у которых начало и окончание приходятся на разные календарные дни: помощник подбирает время однодневной встречи.

**Чего в помощнике нет.** Отдельных полей ввода времени, календаря в шапке и перетаскивания слота в помощнике нет: день выбирается листанием, время — кликом по шкале, а точное время и продолжительность правятся в карточке встречи.

![Помощник по планированию: занятость участников по часам](https://help.1forma.ru/help-images/calendar/calendar_plan.png)

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

Работа календаря подчиняется нескольким общим принципам:

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

## Связи с другими доменами

Календарь опирается на смежные домены:

- [tasks/business.md](https://help.1forma.ru/domains/tasks/business.md) — встречи и события как задачи.
- [integrations/business.md](https://help.1forma.ru/domains/integrations/business.md) — внешние источники календаря (Exchange, CalDav).
- [notifications/business.md](https://help.1forma.ru/domains/notifications/business.md) — оповещения и счётчики.

Диагностика синхронизации и типичные ошибки настройки — в [admin.md](https://help.1forma.ru/domains/calendar/admin.md).

### Карточка встречи в режиме просмотра

В карточке встречи кнопки действий закреплены внизу: длинное описание и список участников прокручиваются, а строка с кнопками остаётся на месте и не уезжает вместе с содержимым. Порядок и набор кнопок зависит от роли: организатору доступно редактирование встречи, участнику — ответ на приглашение. На узком экране кнопки переносятся на вторую строку.
