Календарь — Администрирование¶
Обзор¶
Домен calendar охватывает настройку производственного календаря, планировщиков и справочников календарных состояний. Администрирование использует:
- Автоадминка (dbadmin) -- 1 форма (планировщик)
- Кастомная SPA-страница -- 1 форма (производственный календарь) -- зарегистрирована в дереве автоадминки, но открывает собственную SPA-страницу
- EntityEditor -- 2 схемы (
absencetype-- типы отсутствий,freebusystate-- статусы занятости)
Механизмы администрирования¶
Автоадминка (dbadmin)¶
| Alias формы | Название | Таблица БД | Полей | Секций | Deps | Папка |
|---|---|---|---|---|---|---|
scheduler-settings |
Планировщик | dbo.SchedulerSettings | 14 | 1 | 0 | Пользовательский интерфейс |
Кастомная SPA-страница (в дереве автоадминки)¶
| Alias формы | Название | Url | Таблица БД | Папка |
|---|---|---|---|---|
production-calendar |
Производственный календарь | /administration/product-calendar |
dbo.ProductionCalendarEx | Общая бизнес-логика |
EntityEditor¶
| Схема JSON | Таблица | Назначение |
|---|---|---|
absencetype |
dbo.AbsenceTypes | Типы отсутствий (больничный, отпуск, командировка) |
freebusystate |
(EntityEditor-схема) | Статусы занятости/свободности в календарных сценариях |
Ключевые настройки¶
Производственный календарь (ProductionCalendarEx)¶
Где настраивается: SPA-страница /administration/product-calendar (пункт production-calendar в дереве автоадминки)
Таблица БД: dbo.ProductionCalendarEx
8 полей: даты, типы дней (рабочий/выходной/праздник), описания.
| Группа полей | Что контролирует |
|---|---|
| Дата, тип дня | Рабочий / выходной / праздничный / сокращённый |
| Описание | Название праздника/события |
| Год | Привязка к конкретному году |
Эффект в runtime: данные используются функциями dbo.tc_AddWorking*Ex / dbo.tc_DiffWorking*Ex для расчёта сроков задач и просрочек. Загрузка через legacy API app/v1.2/api/calendar/sendcalendardata.
Планировщик (SchedulerSettings)¶
Где настраивается: автоадминка -> форма scheduler-settings
Таблица БД: dbo.SchedulerSettings
14 полей: расписания фоновых задач календарного контура.
| Группа полей | Что контролирует |
|---|---|
| Интервалы обновления | Частота синхронизации с внешними календарями |
| Параметры retry | Повторные попытки при ошибках |
| Таймауты | Ограничения по времени выполнения |
Эффект в runtime: управляет фоновыми процессами синхронизации Exchange/CalDav/OForma календарей.
Типы отсутствий (EntityEditor)¶
Где настраивается: EntityEditor -> absencetype
Таблица БД: dbo.AbsenceTypes
Классификация отсутствий: отпуск, больничный, командировка и т.д. Используется в UI календаря и процессах согласования.
Статусы занятости (EntityEditor)¶
Где настраивается: EntityEditor -> freebusystate
Состояния занятости пользователя (свободен, занят, предварительно, нет на месте). Используется при отображении доступности в календарных сценариях.
Синхронизация с Exchange (EWS) — настройка в админке¶
Технические детали EWS (архитектура провайдера, аутентификация, streaming subscriptions, маппинг полей, CRUD, известные баги) — в provider-ews.md. Диагностика sync пользователя — в runbook-exchange-user-sync.md.
Здесь — только «где в админке настроить» и какому ключу/флагу соответствует поле UI.
Предварительные требования¶
Перед включением синхронизации нужны:
- URL EWS (
https://exchange.example.com/EWS/Exchange.asmx). - Системная учётная запись на сервере Exchange.
- Права для системной учётной записи: либо делегирование (
AddDelegate) на каждый календарь, либо служебное правоimpersonate(рекомендуется). - Для режима «Онлайн» — Exchange 2013 или выше.
Точки настройки¶
Сценарий настройки зависит от наличия синхронизации с Active Directory.
| Контекст | Где настраивается | Owner-документ |
|---|---|---|
| С AD | Сервис ExchangeWebService (страница «Сервисы») + Общие настройки приложения |
предпочтительно — настройки сервиса |
| Без AD | Только Общие настройки приложения; сервис EWS по умолчанию выбирается там же (поле «Сервис EWS») | Общие настройки |
| Per-user | Профиль пользователя → вкладка «Сервис» → блок «Режим работы с сервисами Exchange» | per-user поверх глобальных |
Поля сервиса ExchangeWebService¶
Где: страница «Сервисы» → создать сервис типа ExchangeWebService → его настройки.
| Поле UI | Назначение | Что под ним |
|---|---|---|
| Сервис | Выбор предварительно созданного сервиса с типом ExchangeWebService |
ссылка на запись в Services |
| Домен | Имя домена компании | передаётся в WebCredentials(login, password, domain) |
| Url | Адрес вызова сервиса EWS | endpoint EWS |
| Логин / Пароль | Учётные данные системной учётной записи. Пароль шифруется через IEncryptionService |
Basic Auth |
| Использовать имперсонализацию | Соединение перевоплощается в нужного пользователя при изменении его событий. Приоритетнее, чем «Использовать перевоплощение» в Общих настройках | ImpersonatedUserId (provider-ews.md §2) |
| Использовать SID для перевоплощения | Если включено — ConnectingIdType.SID (значение берётся из AD); иначе — ConnectingIdType.SmtpAddress |
флаг UseSIDForImpersonalization |
| Разрешить пользователям смотреть чужие календари используя права системной учётной записи | Отображение чужих календарей через права системного аккаунта | per-permission |
| Показывать только занятость при просмотре календарей с чужого сервиса | Пользователи без отношения к сервису видят синие слоты «Занят» без деталей | per-permission |
| Показывать только занятость при просмотре чужих календарей с домашнего сервиса | То же — для пользователей собственного сервиса | per-permission |
⚠️ Правило входа в аккаунт: при активной имперсонализации (или для пользователя в домене) используется SID; если «Использовать SID для перевоплощения» неактивна или SID отсутствует, либо имперсонализация выключена — вход по email из профиля пользователя.
После создания сервис нужно выбрать в поле «Настройки EWS» при настройке синхронизации с AD.
Поля Общих настроек приложения (синхронизация с Exchange)¶
Где: Общие настройки приложения → секция «Настройки синхронизации с Exchange Server».
| Поле UI | Назначение |
|---|---|
| Адрес EWS | URL EWS — для синхронизации календарей и импорта контактов |
| Категории событий, которые не будут синхронизированы | Список категорий Exchange через ; (исключаются из sync) |
| Режим работы с сервисами Exchange | Default-режим для новых пользователей — автоматически прокидывается в их профиль |
| Синхронизировать календарь с Exchange (событийный режим) | Legacy event-driven sync; см. provider-ews.md §3 |
| Синхронизировать периодические встречи с Exchange | Включает sync рекуррентных событий |
| Не синхронизировать события старше, дней | Окно sync для событийной синхронизации; 0 = без ограничения |
| Максимальное количество неудачных попыток синхронизации с Exchange | При превышении — пользователь автоматически исключается из sync; 0 = без ограничения |
| Использовать перевоплощение | Сервисный аккаунт перевоплощается в организатора. Менее приоритетна, чем «Использовать имперсонализацию» в настройках сервиса |
| Доменная авторизация | Включено — sync для сервера в домене; выключено — для сервера в рабочей группе |
| Логин / Пароль / Домен | Учётные данные служебного аккаунта (пароль шифруется в UI) |
Per-user: «Режим работы с сервисами Exchange»¶
Где: профиль пользователя → вкладка «Сервис» → блок «Режим работы с сервисами Exchange».
| Значение UI | Действие | Под капотом |
|---|---|---|
| Выключено | Sync календаря отключён | DoSyncWithExchange = false, CalendarEwsDirectSync = false |
| Онлайн | События читаются напрямую из Exchange без локальных сущностей. Требует Exchange 2013+ | CalendarEwsDirectSync = true |
Полная матрица режимов и ограничения — в provider-ews.md §3.
⚠️ Только для лицензированных пользователей. Для пользователей без лицензии «Первой Формы» календарь не синхронизируется, даже если режим включён.
⚠️ Доступ к чужим событиям в режиме «Онлайн»: только при включённой имперсонализации в настройках сервиса. Исключение — системный пользователь «Робот 1Ф».
Тонкие настройки — CustomSettings¶
Параметры пула, таймаутов, кэшей, логирования и поведения streaming-подписок задаются через CustomSettings (страница «Настройки приложения» → пользовательские ключи). Полный перечень — в provider-ews.md §9:
- размер пула и параметры семафора (
ExchangeConnectionPoolSize,ExchangeSemaphoreCount,ExchangeSemaphoreWait); - streaming subscriptions (
EnableEwsSubscriptions,EnableEwsEmailSubscriptions,EnableEwsCalendarInboxAccess,ExchangeConnectionLifetime); - TTL кэша прав (
ExchangePermissionsCacheLifeTime, default 5 мин); - автоотключение sync при ошибках (
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 — серверные ключи (применяются на старте):
| Ключ | Тип | Назначение |
|---|---|---|
IsExchangeSyncServer |
bool | Сервер, держащий соединения с Exchange и принимающий уведомления (для multi-server установок — ровно один) |
UseExchangeAutodiscover |
bool | Использовать AutoDiscover для определения EWS-endpoint |
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» — он управляет цветовым обозначением имён в зависимости от типа занятости при синхронизации с календарём Exchange.
Масштабы представлений «Календарь» и «Ресурсы»¶
Cross-link. Включение/отключение представлений категории и выбор default — в categories/admin.md §28. Здесь — только масштабы Календаря и Ресурсов и флаг отображения задач в терминальном статусе.
Где настраивается: в категории → блок настроек представления → у блока «Календарь» / «Ресурсы» — кнопка «шестерёнка» → переход к настройкам доступных масштабов.
Запоминание выбора: система запоминает последний выбранный пользователем масштаб и при следующем открытии возвращает его. «Масштаб по умолчанию» используется только при первом открытии или для нового пользователя.
Масштабы представления «Календарь» (6 значений)¶
| Масштаб | Описание |
|---|---|
| Месяц | Задачи на месяц, в виде списка |
| Месяц (Карточка) | Задачи на месяц, в виде карточек |
| Неделя | Задачи на неделю, в виде списка |
| Расписание | Задачи на неделю, в виде карточек |
| Рабочая неделя | Задачи на неделю без выходных, в виде списка |
| День | Задачи на день, в виде списка |
Масштабы представления «Ресурсы» (7 значений)¶
| Масштаб | Описание |
|---|---|
| Годы | По годам с разбивкой по кварталам. По умолчанию — текущий год по ширине экрана |
| Месяцы | По месяцам. По умолчанию — текущее полугодие |
| Месяцы/недели | По месяцам с разбивкой по первому дню недели. По умолчанию — текущее полугодие |
| Недели | По неделям с разбивкой по первому дню недели. По умолчанию — текущая дата по центру экрана |
| Неделя | По дням (default). Только текущая неделя по ширине экрана |
| День | По дням, с разрешением до часа. Прокрутка вправо/влево недоступна — переход стрелками или выбором даты |
| Расписание | По календарным неделям. Прокрутка стрелками или выбором даты |
Флаг «Отображать задачи в терминальном статусе» (блок «Календарь»)¶
| Состояние | Поведение |
|---|---|
| Активен | В календарном представлении категории и в системном календаре отображаются завершённые и отклонённые задачи |
| Неактивен | В календарном представлении только активные (незавершённые) задачи |
Типичные ошибки настройки¶
| Симптом | Причина | Где проверить | SQL-диагностика |
|---|---|---|---|
| Нерабочие дни не совпадают с ожиданием | Некорректные данные в производственном календаре | Форма production-calendar |
select * from dbo.ProductionCalendarEx where [Year] = {year} order by [Date] |
| Неверно считаются сроки/просрочка | Производственный календарь не заполнен на нужный период | dbo.ProductionCalendarEx |
select min([Date]), max([Date]) from dbo.ProductionCalendarEx |
| Агенда/события пустеют на периоде | Неверные provider-настройки или таймзона | Provider-настройки пользователя | select * from dbo.SchedulerSettings |
| Фоновая синхронизация не работает | Некорректные настройки планировщика | Форма scheduler-settings |
select * from dbo.SchedulerSettings |
| Тип отсутствия не отображается | Не настроен в EntityEditor | EntityEditor absencetype |
select * from dbo.AbsenceTypes |
| Пользователь автоматически исключён из EWS-sync | Превышено «Максимальное количество неудачных попыток синхронизации с Exchange» | Профиль пользователя → «Сервис» → блок «Синхронизация с Exchange» (счётчик неудачных попыток) | select UserID, UserName, DoSyncWithExchange, CalendarEwsDirectSync, SyncWithExchangeFailedAttempts from Users where UserID = @userId |
| Нет push-обновлений событий | Streaming subscriptions выключены или JobServer не запущен | CustomSettings: EnableEwsSubscriptions; флаг Configuration.IsJobServer. Подробности — provider-ews.md §13 |
— |
| Чужие календари недоступны в режиме «Онлайн» | Не включена «Использовать имперсонализацию» в настройках сервиса | Настройки сервиса ExchangeWebService |
select * from dbo.EwsServiceSettings |
| Не отображается выбранный масштаб Календаря/Ресурсов | Масштаб выключен в настройках представлений категории | Настройки категории → блок «Календарь» / «Ресурсы» → шестерёнка | См. categories/admin.md §28 |
Диагностика синхронизации с Exchange (для администратора)¶
Не дублирует provider-ews.md §13 (диагностика для разработчика, SQL-уровень) и runbook-exchange-user-sync.md (детальный runbook). Здесь — порядок действий администратора в UI.
Если sync конкретного пользователя автоматически отключён¶
- Профиль пользователя → вкладка «Сервис» → блок «Синхронизация с Exchange» — посмотреть счётчик неудачных попыток.
- Если счётчик ≥ значения «Максимальное количество неудачных попыток синхронизации с Exchange» из Общих настроек — пользователь исключён.
- Журнал пользователя (вкладка «Журнал») — найти сообщение об остановке синхронизации.
- Системный журнал ошибок — найти причину последней неудачи (часто: переполнен/недоступен почтовый ящик, отсутствуют права имперсонализации, неверный SID).
- Сбросить счётчик неудачных попыток в том же блоке профиля (
Сервис→ «Синхронизация с Exchange»). - Если ошибка не устранена — sync снова отключится. До сброса убедиться, что причина устранена.
Если sync глобально не работает¶
- Общие настройки приложения → «Настройки синхронизации с Exchange Server» — проверить включён ли режим («Синхронизировать календарь с Exchange» или «Режим работы с сервисами Exchange» = «Онлайн»).
- Настройки сервиса
ExchangeWebService— проверить URL, доменные креды, имперсонализацию. - CustomSettings:
EnableEwsSubscriptions = true,EnableEwsCalendarInboxAccess = true. - Streaming subscriptions работают только на JobServer — убедиться, что JobServer запущен.
- Глубже — provider-ews.md §13 и runbook-exchange-user-sync.md.
Связанные документы¶
docs/domains/calendar/backend.md-- backend-архитектура (провайдеры, агенда, синхронизация)docs/domains/calendar/provider-ews.md-- технические детали EWS (аутентификация, streaming subscriptions, CustomSettings, известные баги)docs/domains/calendar/runbook-exchange-user-sync.md-- runbook диагностики ошибок sync пользователяdocs/domains/calendar/data-flow.md-- E2E диагностика (события, нерабочие дни)docs/domains/calendar/database.md-- схема БД (ProductionCalendarEx, календарные функции)docs/domains/categories/admin.md-- §28 «Представления категории»: включение/отключение представлений, defaultdocs/domains/integrations/admin.md-- внешние сервисы: ссылка на EWS возвращает сюдаdocs/platform/backend/admin-architecture.md-- общая архитектура администрированияdocs/reference/database/dbadmin-forms-map.md-- карта всех форм автоадминки