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

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

Обзор

Домен 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.

Предварительные требования

Перед включением синхронизации нужны:

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

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

Если sync глобально не работает

  1. Общие настройки приложения → «Настройки синхронизации с Exchange Server» — проверить включён ли режим («Синхронизировать календарь с Exchange» или «Режим работы с сервисами Exchange» = «Онлайн»).
  2. Настройки сервиса ExchangeWebService — проверить URL, доменные креды, имперсонализацию.
  3. CustomSettings: EnableEwsSubscriptions = true, EnableEwsCalendarInboxAccess = true.
  4. Streaming subscriptions работают только на JobServer — убедиться, что JobServer запущен.
  5. Глубже — 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 «Представления категории»: включение/отключение представлений, default
  • docs/domains/integrations/admin.md -- внешние сервисы: ссылка на EWS возвращает сюда
  • docs/platform/backend/admin-architecture.md -- общая архитектура администрирования
  • docs/reference/database/dbadmin-forms-map.md -- карта всех форм автоадминки