# Календарь — Администрирование

Документ описывает администрирование календаря: настройку производственного календаря, планировщиков, справочников состояний и синхронизацию с Exchange (EWS). Для администраторов и инженеров поддержки. Разделы: механизмы администрирования, ключевые настройки (производственный календарь, планировщик, типы отсутствий, кнопка «Создать встречу», EWS), масштабы представлений, типичные ошибки настройки, диагностика синхронизации.

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

- **Автоадминка** — 1 форма (планировщик)
- **Отдельная SPA-страница** — 1 форма (производственный календарь) — зарегистрирована в дереве автоадминки, но открывает собственную SPA-страницу
- **Редактор сущностей** — 2 схемы (`absencetype` — типы отсутствий, `freebusystate` — статусы занятости)

## Механизмы администрирования

**Автоадминка:**

| Alias формы | Название | Таблица БД | Папка |
|-------------|----------|-----------|-------|
| `scheduler-settings` | Планировщик | dbo.SchedulerSettings | Пользовательский интерфейс |

**Отдельная SPA-страница (в дереве автоадминки):**

| Alias формы | Название | Url | Таблица БД | Папка |
|-------------|----------|-----|-----------|-------|
| `production-calendar` | Производственный календарь | `/administration/product-calendar` | dbo.ProductionCalendarEx | Общая бизнес-логика |

**Редактор сущностей:**

| Схема JSON | Таблица | Назначение |
|-----------|---------|------------|
| `absencetype` | dbo.AbsenceTypes | Типы отсутствий (больничный, отпуск, командировка) |
| `freebusystate` | (схема редактора сущностей) | Статусы занятости/свободности в календарных сценариях |

## Ключевые настройки

### Производственный календарь (ProductionCalendarEx)

**Где настраивается:** SPA-страница `/administration/product-calendar` (пункт `production-calendar` в дереве автоадминки)
**Таблица БД:** `dbo.ProductionCalendarEx`

8 полей: даты, типы дней (рабочий/выходной/праздник), описания.

| Группа полей | Что контролирует |
|-------------|------------------|
| Дата, тип дня | Рабочий / выходной / праздничный / сокращённый |
| Описание | Название праздника/события |
| Год | Привязка к конкретному году |

**Как применяется:** данные используются функциями `dbo.tc_AddWorking*Ex` / `dbo.tc_DiffWorking*Ex` для расчёта сроков задач и просрочек. Загрузка через API `app/v1.2/api/calendar/sendcalendardata`.

### Планировщик (SchedulerSettings)

**Где настраивается:** автоадминка → форма `scheduler-settings`
**Таблица БД:** `dbo.SchedulerSettings`

14 полей: расписания фоновых задач календарного контура.

| Группа полей | Что контролирует |
|-------------|------------------|
| Интервалы обновления | Частота синхронизации с внешними календарями |
| Параметры повторных попыток | Повторные попытки при ошибках |
| Таймауты | Ограничения по времени выполнения |

**Как применяется:** управляет фоновыми процессами синхронизации Exchange/CalDav/OForma календарей.

### Типы отсутствий и статусы занятости (Редактор сущностей)

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

**Типы отсутствий:** настраивается через Редактор сущностей → `absencetype`, таблица `dbo.AbsenceTypes`. Классификация отсутствий: отпуск, больничный, командировка и т.д. Используется в интерфейсе календаря и процессах согласования.

**Статусы занятости:** настраивается через Редактор сущностей → `freebusystate`. Состояния занятости пользователя (свободен, занят, предварительно, нет на месте). Используется при отображении доступности в календарных сценариях.

### Кнопка «Создать встречу» в календаре (рабочее место группы)

**Где хранится:** `dbo.UserGroupSettings` — запись рабочего места группы, применяемого к пользователю (при нескольких группах берётся запись с наибольшим приоритетом).
**Где отдаётся и задаётся:** `GET api/user/settings` → блок `UserUISettings`; сохранение — `POST api/user/{userId}/ui-settings`.

| Поле | Тип | Значение по умолчанию | Что задаёт |
|------|-----|----------------------|------------|
| `HideCreateMeetingButton` | `bit` / `bool?`, nullable | `NULL` — не задано | Скрывать ли кнопку «Создать встречу» в календаре |
| `CreateMeetingCategoryId` | `int`, nullable, FK на `dbo.Subcategories(SubcatID)` | `NULL` — не задано | Категория, в которой создаётся встреча из календаря |

**Правила сохранения:**

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

Клиент эти поля не читает: настройка хранится в рабочем месте группы и отдаётся в контракте настроек пользователя, но на интерфейс не влияет — кнопка «Создать встречу» в календаре отображается всегда, а категория создаваемой встречи берётся из системной календарной категории приложения (`calendarSubcatId`).

### Синхронизация с Exchange (EWS) — настройка в админке

> **Технические детали EWS** (архитектура провайдера, аутентификация, push-синхронизация, маппинг полей, операции с событиями, ограничения) — в [Календарь — синхронизация с Exchange (EWS)](https://help.1forma.ru/domains/calendar/provider-ews.md).
> **Диагностика синхронизации пользователя** — в [отдельном руководстве](https://help.1forma.ru/domains/calendar/runbook-exchange-user-sync.md).
>
> Здесь — только «где в админке настроить» и какому ключу/флагу соответствует поле интерфейса.

#### Предварительные требования и точки настройки EWS

Перед включением синхронизации с Exchange нужны: URL EWS, системная учётная запись с правами impersonate (рекомендуется) или делегирования, и Exchange 2013+ для режима «Онлайн». Сценарий настройки зависит от наличия синхронизации с Active Directory.

Требования для включения синхронизации:

1. URL EWS (`https://exchange.example.com/EWS/Exchange.asmx`).
2. Системная учётная запись на сервере Exchange.
3. Права для системной учётной записи: либо делегирование (`AddDelegate`) на каждый календарь, либо служебное право `impersonate` (рекомендуется).
4. Для режима «Онлайн» — Exchange 2013 или выше.

| Контекст | Где настраивается | Owner-документ |
|----------|-------------------|----------------|
| **С AD** | Сервис `ExchangeWebService` (страница «Сервисы») + Общие настройки приложения | предпочтительно — настройки сервиса |
| **Без AD** | Только Общие настройки приложения; сервис EWS по умолчанию выбирается там же (поле «Сервис EWS») | Общие настройки |
| **По пользователю** | Профиль пользователя → вкладка «Сервис» → блок «Режим работы с сервисами Exchange» | переопределяет глобальные настройки |

#### Поля сервиса ExchangeWebService

Где: страница «Сервисы» → создать сервис типа `ExchangeWebService` → его настройки.

| Поле интерфейса | Назначение | Что под ним |
|---------|-----------|-------------|
| Сервис | Выбор предварительно созданного сервиса с типом `ExchangeWebService` | ссылка на запись в `Services` |
| Домен | Имя домена компании | используется при доменной (Basic) авторизации |
| Url | Адрес вызова сервиса EWS | адрес вызова EWS |
| Логин / Пароль | Учётные данные системной учётной записи. Пароль хранится в зашифрованном виде | Basic Auth |
| Использовать имперсонализацию | Соединение перевоплощается в нужного пользователя при изменении его событий. **Приоритетнее**, чем «Использовать перевоплощение» в Общих настройках | перевоплощение в пользователя ([EWS §2](https://help.1forma.ru/domains/calendar/provider-ews.md#2-аутентификация)) |
| Использовать SID для перевоплощения | Если включено — перевоплощение по SID (значение берётся из AD); иначе — по SMTP-адресу | флаг `UseSIDForImpersonalization` |
| Разрешить пользователям смотреть чужие календари используя права системной учётной записи | Отображение чужих календарей через права системного аккаунта | право доступа |
| Показывать только занятость при просмотре календарей с чужого сервиса | Пользователи без отношения к сервису видят синие слоты «Занят» без деталей | право доступа |
| Показывать только занятость при просмотре чужих календарей с домашнего сервиса | То же — для пользователей собственного сервиса | право доступа |

⚠️ **Правило входа в аккаунт:** при активной имперсонализации (или для пользователя в домене) используется SID; если «Использовать SID для перевоплощения» неактивна или SID отсутствует, либо имперсонализация выключена — вход по email из профиля пользователя.

После создания сервис нужно выбрать в поле «Настройки EWS» при настройке синхронизации с AD.

#### Технические имена полей сервиса ExchangeWebService

В запросе `~/api/services` и в таблице `dbo.EwsServiceSettings` поля сервиса `ExchangeWebService` называются так:

| Поле интерфейса | Ключ в запросе `/api/services` | Столбец в `dbo.EwsServiceSettings` |
|---|---|---|
| Url | `ewsUrl` | `EwsUrl` |
| Логин | `ewsLogin` | `EwsLogin` |
| Пароль | `ewsPassword` | `EwsPassword` |
| Использовать имперсонализацию | `useImpersonalization` | `UseImpersonalization` |
| Использовать SID для перевоплощения | `useSIDForImpersonalization` | `UseSIDForImpersonalization` |

> ⚠️ До обновления от 08.07.2026 в форме сервиса в админке ключ назывался `useImpersonization` (с опечаткой, без «aliz»). Из-за этого значение чекбокса «Использовать имперсонализацию» не сохранялось в БД и сбрасывалось при повторном открытии. Начиная со сборки от 08.07.2026 ключ приведён в соответствие имени столбца и поля бэкенда `UseImpersonalization`.

#### Если чекбокс «Использовать имперсонализацию» не сохраняется

1. В консоли браузера убедитесь, что в теле запроса к `/api/services` при сохранении уходит `useImpersonalization: true`, а не `useImpersonization`.
2. Проверьте значение в БД:

```sql
select Id, Name, UseImpersonalization, UseSIDForImpersonalization
from dbo.EwsServiceSettings
where Name = 'Имя вашего сервиса';
```

#### Поля Общих настроек приложения (синхронизация с Exchange)

Где: Общие настройки приложения → секция «Настройки синхронизации с Exchange Server».

| Поле интерфейса | Назначение |
|---------|-----------|
| Адрес EWS | URL EWS — для синхронизации календарей и импорта контактов |
| Категории событий, которые не будут синхронизированы | Список категорий Exchange через `;` (исключаются из синхронизации) |
| Режим работы с сервисами Exchange | Режим по умолчанию для новых пользователей — автоматически прокидывается в их профиль |
| Синхронизировать календарь с Exchange (событийный режим) | Событийная синхронизация; см. [EWS §3](https://help.1forma.ru/domains/calendar/provider-ews.md#3-режимы-синхронизации) |
| Синхронизировать периодические встречи с Exchange | Включает синхронизацию повторяющихся событий |
| Не синхронизировать события старше, дней | Глубина синхронизации для событийного режима; `0` = без ограничения |
| Максимальное количество неудачных попыток синхронизации с Exchange | При превышении — пользователь автоматически исключается из синхронизации; `0` = без ограничения |
| Использовать перевоплощение | Сервисный аккаунт перевоплощается в организатора. **Менее приоритетна**, чем «Использовать имперсонализацию» в настройках сервиса |
| Доменная авторизация | Включено — синхронизация для сервера в домене; выключено — для сервера в рабочей группе |
| Логин / Пароль / Домен | Учётные данные служебного аккаунта (пароль шифруется в интерфейсе) |

#### По пользователю: «Режим работы с сервисами Exchange»

Где: профиль пользователя → вкладка «Сервис» → блок «Режим работы с сервисами Exchange».

| Значение в интерфейсе | Действие | Поле в БД |
|-------------|----------|-------------|
| Выключено | Sync календаря отключён | `DoSyncWithExchange = false`, `CalendarEwsDirectSync = false` |
| Онлайн | События читаются напрямую из Exchange без локальных сущностей. Требует Exchange 2013+ | `CalendarEwsDirectSync = true` |

Полная матрица режимов и ограничения — в [EWS §3](https://help.1forma.ru/domains/calendar/provider-ews.md#3-режимы-синхронизации).

⚠️ **Только для лицензированных пользователей.** Для пользователей без лицензии «Первой Формы» календарь не синхронизируется, даже если режим включён.

⚠️ **Доступ к чужим событиям в режиме «Онлайн»:** только при включённой имперсонализации в настройках сервиса. Исключение — системный пользователь «Робот 1Ф».

#### CustomSettings — пул, подписки, кэш и CalendarExtParams

Параметры пула, таймаутов, кэшей, логирования и поведения push-подписок задаются через CustomSettings (страница «Настройки приложения» → пользовательские ключи). Полный перечень — в [EWS §8](https://help.1forma.ru/domains/calendar/provider-ews.md#8-настройки-customsettings):

- размер пула и параметры семафора (`ExchangeConnectionPoolSize`, `ExchangeSemaphoreCount`, `ExchangeSemaphoreWait`);
- push-подписки (`EnableEwsSubscriptions`, `EnableEwsEmailSubscriptions`, `EnableEwsCalendarInboxAccess`, `ExchangeConnectionLifetime`);
- TTL кэша прав (`ExchangePermissionsCacheLifeTime`, default 5 мин);
- TTL кэша ошибочных прав (`ExchangePermissionsFailedCacheLifeTime`, default 1 мин) — сколько держится отказ в правах после сбоя Exchange, пока права не перечитаны;
- автоотключение синхронизации при ошибках (`EnableEwsSetDirectSyncDisabledWhenEwsErrorsOccurs`);
- логирование (`WriteEwsRequestDurationToAutomationLog`, `ExchangeSubscriptionsToLog`);
- видимость событий без прав в Exchange (`EWSDoNotCheckUserRight` + `EWSShowBusyStatus`).

**CustomSettings — `CalendarExtParams`:** JSON-маппинг ID ДП в календарной категории на семантику событий — без него планирование встреч из задач не работает. Все ID в одном объекте:

```
allDayExtParamId, conferenceExtParamId, freeBusyStatusIDExtParamId,
fromExtParamId, locationIdExtParamId, meetingCommentIDExtParamId,
participantIDExtParamId, taskExtParamId, toExtParamId, typeIdExtParamId
```

Каждый ключ — int (ID соответствующего ДП в системной календарной категории). Используется при создании / редактировании встреч из карточки задачи и при синхронизации с Exchange.

#### appsettings.json — серверные ключи и лимиты синхронизации

Серверные ключи применяются на старте приложения и управляют поведением синхронизации Exchange:

| Ключ | Тип | Назначение |
|------|-----|------------|
| `IsExchangeSyncServer` | bool | Сервер, держащий соединения с Exchange и принимающий уведомления (для multi-server установок — ровно один) |
| `UseExchangeAutodiscover` | bool | Использовать AutoDiscover для определения адреса EWS |
| `ExchangeTraceListenerFlags` | string | Флаги `TraceFlags` для трейсов EWS-запросов. Если ключ не задан — трейсы не собираются |
| `CreateTasksForAppointments` | bool / `true` | При создании встречи в Exchange создаётся ли задача в системной календарной категории. `false` — для ускорения синхронизации |

**Лимиты, горизонты и ретраи синхронизации встреч:**

| Ключ | По умолчанию | Назначение |
|------|--------------|------------|
| `Appointments_TimeTryToReacreateMins` | `10` | Время (мин), в течение которого система повторяет попытки пересоздать встречу в EWS при сбое |
| `AppointmentsToExternal_HandleOpenExternalConnection` | `false` | Включает обработчик события открытия соединения с Exchange |
| `AppointmentsToExternal_NotSyncedAppointmentsLimit` | `100` | Максимум необновлённых встреч из 1Ф в Exchange при открытии соединения. Рекомендуется снизить до **10** |
| `AppointmentsToTasks_NotSyncedAppointmentsLimit` | `50` | Лимит встреч, создаваемых задачами при «отстающей» синхронизации. Рекомендуется снизить до **10** |
| `AppointmentsToTasks_FutureDaysLimit` | `180` | Горизонт синхронизации в будущем (дней от текущей даты). События позже горизонта создаются позднее |
| `AppointmentsToTasks_OccurrencesCountLimit` | `50` | Сколько повторений создаётся для бесконечного recurring-события (если в задаче «Без ограничений») |
| `AppointmentsToTasks_OccurrencesDaysLimit` | `180` | Горизонт повторений для бесконечного recurring (дней) |
| `AppointmentsToTasks_OccurrencesPastDaysLimit` | — | Горизонт повторений в прошлое (дней). Начиная с этой даты создаются задачи-повторения |

#### Ограничения видимости чужих событий и типы отсутствий

Чтобы пользователь видел только свои встречи (чужие — синими слотами «Занят» без деталей), нужно одно из:

- отключить право группы на группу «Просматривать календарные события членов группы» (см. `domains/permissions`);
- в настройках сервиса `ExchangeWebService` включить «Показывать пользователям только занятость при просмотре календарей с чужого сервиса».

В настройках типа отсутствия (см. раздел «Типы отсутствий» выше) есть флаг «Синхронизировать с Exchange» — он управляет цветовым обозначением имён в зависимости от типа занятости при синхронизации с календарём Exchange.

**Права на запись в чужой календарь CalDAV.** Видимость чужих событий и возможность писать в чужой календарь — разные вещи. В CalDAV разрешение на создание, изменение и удаление событий в календаре коллеги выдаётся на самом CalDAV-сервере — это делегирование — и не зависит от права группы на просмотр. Права перед записью перечитываются у сервера, поэтому снятое делегирование сразу отклоняет сохранение. Со стороны платформы отдельного ключа для этой возможности нет, поддерживает её только сервер Kerio.

#### Уровень видимости чужого календаря

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

| Ситуация | Уровень |
|----------|---------|
| Пользователь смотрит собственный календарь | полные сведения |
| У владельца включена прямая синхронизация с Exchange | уровень чтения папки, посчитанный для пары «владелец — зритель» |
| Владелец без Exchange, а также сборка без провайдера Exchange | полные сведения при взаимном праве группы «Просматривать календарные события», иначе доступа нет |

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

Уровень считается один раз на пару «владелец — зритель» и применяется к отсутствиям и событиям в карточке коллеги, к статусу занятости в списке сотрудников и к мобильному профилю.

### Масштабы представлений «Календарь» и «Ресурсы»

> **Связано.** Включение/отключение представлений категории и выбор представления по умолчанию — в [Категории — администрирование](https://help.1forma.ru/domains/categories/admin.md) §28. Здесь — только масштабы Календаря и Ресурсов и флаг отображения задач в терминальном статусе.

**Где настраивается:** в категории → блок настроек представления → у блока «Календарь» / «Ресурсы» — кнопка «шестерёнка» → переход к настройкам доступных масштабов.

Названия масштабов на этой странице — статические подписи интерфейса: они берутся из ресурсных файлов SPA и показываются на языке администратора, а русское название остаётся в коде запасным значением. Подробнее — [Локализация — Администрирование](https://help.1forma.ru/domains/localization/admin.md).

**Запоминание выбора:** система запоминает последний выбранный пользователем масштаб и при следующем открытии возвращает его. «Масштаб по умолчанию» используется только при первом открытии или для нового пользователя.

**Масштабы представления «Календарь» (6 значений):**

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

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

Карточка в масштабе «Расписание» строится по шаблону канбана категории — по тому же, что настраивается для представления «Канбан» (см. [Канбан — администрирование](https://help.1forma.ru/domains/kanban/admin.md)). Если шаблон у категории не задан, выводится прежняя карточка календаря с фиксированным набором полей.

**Масштабы представления «Ресурсы» (7 значений):**

| Масштаб | Описание |
|---------|----------|
| Годы | По годам с разбивкой по кварталам. По умолчанию — текущий год по ширине экрана |
| Месяцы | По месяцам. По умолчанию — текущее полугодие |
| Месяцы/недели | По месяцам с разбивкой по первому дню недели. По умолчанию — текущее полугодие |
| Недели | По неделям с разбивкой по первому дню недели. По умолчанию — текущая дата по центру экрана |
| Неделя | По дням (по умолчанию). Только текущая неделя по ширине экрана |
| День | По дням, с разрешением до часа. Прокрутка вправо/влево недоступна — переход стрелками или выбором даты |
| Расписание | По календарным неделям. Прокрутка стрелками или выбором даты |

![Выбор масштаба представления «Ресурсы»: Годы, Месяцы, Месяцы/недели, Недели, Неделя](https://help.1forma.ru/help-images/resources/view_resources_-005.png)

**Флаг «Отображать задачи в терминальном статусе» (блок «Календарь»):**

| Состояние | Поведение |
|-----------|-----------|
| Активен | В календарном представлении категории и в системном календаре отображаются завершённые и отклонённые задачи |
| Неактивен | В календарном представлении только активные (незавершённые) задачи |

## Типичные ошибки настройки

Ниже — частые симптомы при настройке календаря и синхронизации с Exchange: вероятная причина, где проверить в интерфейсе и запрос для диагностики в БД.

| Симптом | Причина | Где проверить | SQL-диагностика |
|---------|---------|---------------|-----------------|
| Нерабочие дни не совпадают с ожиданием | Некорректные данные в производственном календаре | Форма `production-calendar` | `select * from dbo.ProductionCalendarEx where [Year] = {year} order by [Date]` |
| Неверно считаются сроки/просрочка | Производственный календарь не заполнен на нужный период | `dbo.ProductionCalendarEx` | `select min([Date]), max([Date]) from dbo.ProductionCalendarEx` |
| Агенда/события пустеют на периоде | Неверные настройки провайдера или таймзона | Настройки провайдера пользователя | `select * from dbo.SchedulerSettings` |
| Фоновая синхронизация не работает | Некорректные настройки планировщика | Форма `scheduler-settings` | `select * from dbo.SchedulerSettings` |
| Тип отсутствия не отображается | Не настроен в редакторе сущностей | Редактор сущностей `absencetype` | `select * from dbo.AbsenceTypes` |
| Пользователь автоматически исключён из синхронизации EWS | Превышено «Максимальное количество неудачных попыток синхронизации с Exchange» | Профиль пользователя → «Сервис» → блок «Синхронизация с Exchange» (счётчик неудачных попыток) | `select UserID, UserName, DoSyncWithExchange, CalendarEwsDirectSync, SyncWithExchangeFailedAttempts from Users where UserID = @userId` |
| Нет push-обновлений событий | Streaming-подписки выключены или JobServer не запущен | CustomSettings: `EnableEwsSubscriptions`; запущен сервер заданий (JobServer). Подробности — [EWS §11](https://help.1forma.ru/domains/calendar/provider-ews.md#11-диагностика) | — |
| Чужие календари недоступны в режиме «Онлайн» | Не включена «Использовать имперсонализацию» в настройках сервиса | Настройки сервиса `ExchangeWebService` | `select * from dbo.EwsServiceSettings` |
| Не отображается выбранный масштаб Календаря/Ресурсов | Масштаб выключен в настройках представлений категории | Настройки категории → блок «Календарь» / «Ресурсы» → шестерёнка | См. [categories/admin.md §28](https://help.1forma.ru/domains/categories/admin.md) |

## Диагностика синхронизации с Exchange (для администратора)

> **Не дублирует** [Календарь — синхронизация с Exchange (EWS)](https://help.1forma.ru/domains/calendar/provider-ews.md) §11 (SQL-диагностика) и [Exchange — диагностика синхронизации пользователя](https://help.1forma.ru/domains/calendar/runbook-exchange-user-sync.md) (детальное руководство). Здесь — порядок действий администратора в интерфейсе.

### Пошаговая диагностика синхронизации с Exchange

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

**Если синхронизация конкретного пользователя автоматически отключена:**

1. Профиль пользователя → вкладка «Сервис» → блок «Синхронизация с Exchange» — посмотреть счётчик неудачных попыток.
2. Если счётчик ≥ значения «Максимальное количество неудачных попыток синхронизации с Exchange» из Общих настроек — пользователь исключён.
3. Журнал пользователя (вкладка «Журнал») — найти сообщение об остановке синхронизации.
4. Системный журнал ошибок — найти причину последней неудачи (часто: переполнен/недоступен почтовый ящик, отсутствуют права имперсонализации, неверный SID).
5. Сбросить счётчик неудачных попыток в том же блоке профиля (`Сервис` → «Синхронизация с Exchange»).
6. Если ошибка не устранена — синхронизация снова отключится. До сброса убедиться, что причина устранена.

**Если синхронизация глобально не работает:**

1. Общие настройки приложения → «Настройки синхронизации с Exchange Server» — проверить включён ли режим («Синхронизировать календарь с Exchange» или «Режим работы с сервисами Exchange» = «Онлайн»).
2. Настройки сервиса `ExchangeWebService` — проверить URL, доменные учётные данные, имперсонализацию.
3. CustomSettings: `EnableEwsSubscriptions = true`, `EnableEwsCalendarInboxAccess = true`.
4. Streaming subscriptions работают только на JobServer — убедиться, что JobServer запущен.
5. Глубже — [EWS §11](https://help.1forma.ru/domains/calendar/provider-ews.md#11-диагностика) и [руководство по диагностике синхронизации](https://help.1forma.ru/domains/calendar/runbook-exchange-user-sync.md).

## Связанные документы

Дополнительные материалы по календарю и синхронизации с Exchange:

- [Календарь — синхронизация с Exchange (EWS)](https://help.1forma.ru/domains/calendar/provider-ews.md) — аутентификация, push-подписки, CustomSettings, диагностика
- [Exchange — диагностика синхронизации пользователя](https://help.1forma.ru/domains/calendar/runbook-exchange-user-sync.md)
- [Категории — администрирование](https://help.1forma.ru/domains/categories/admin.md) — §28 «Представления категории»: включение/отключение представлений, выбор по умолчанию
- [Интеграции — администрирование](https://help.1forma.ru/domains/integrations/admin.md) — внешние сервисы
