Календарь
страницаДокументооборот КОРП, ДГУ
27.01.2016
Календарь
Общая информация
Календарь в "1С:Документообороте" предназначен для планирования времени пользователей. В календаре отображается информация о записях календаря, мероприятиях, отсутствиях, занятом и свободном времени. Основной способ использования календаря – через команду Мой календарь. Для просмотра календарей других пользователей используется команда Все календари в разделе Совместная работа.
Метаданные
Используемые метаданные отнесены к подсистеме РабочийКалендарь.
Основная логика работы сосредоточена в общих модулях. Список общих модулей:
- РаботаСРабочимКалендаремКлиент,
- РаботаСРабочимКалендаремКлиентСервер,
- РаботаСРабочимКалендаремСервер.
Используется четыре подписки на события – КалендарьПередЗаписьюПредмета, КалендарьПередЗаписьюУчастников, КалендарьПриЗаписиПредмета, КалендарьПриЗаписиУчастников. Данные подписки используются для отображения актуальной информации о мероприятиях в календарях пользователей.
За возможность работы с рабочим календарем отвечает функциональная опция РабочийКалендарь. Значение данной функциональной опции привязано к константе ИспользоватьРабочийКалендарь. При включении функциональной опции становятся доступны возможности работы с календарем пользователей и проверка доступности.
Общие картинки ДоступенЛегенда, ПодВопросомЛегенда, ЗанятЛегенда, ОтсутствуетЛегенда предназначены для описания цветов, которые используются в календаре для обозначения занятости. Картинки отображаются в календаре пользователя.
Общие картинки ЗаписьКалендаряУдалена, ЗаписьКалендаряПодВопросом, ЗаписьКалендаряОтклонена используются для отображения состояния записи календаря в планировщике. Они обозначают удаленные записи календаря, записи календаря под вопросом и отклоненные записи календаря.
Общие картинки КоллекцияЦвет, ЦветЖелтый, ЦветЗеленый, ЦветКрасный, ЦветОранжевый, ЦветПоУмолчанию, ЦветСиний обозначают возможные цвета календаря. Ими обозначаются цвета в режиме отображения План дня, команды установки цветов, текущий цвет в карточке записи календаря.
Для установки цветов записей календаря в планировщике используются элементы стиля. За цвета самих элементов отвечают элементы стиля ЦветКалендаряЖелтый, ЦветКалендаряЗеленый, ЦветКалендаряКрасный, ЦветКалендаряОранжевый, ЦветКалендаряПоУмолчанию, ЦветКалендаряСиний.
За цвета рамок элементов отвечают элементы стиля РамкаКалендаряЖелтая, РамкаКалендаряЗеленая, РамкаКалендаряКрасная, РамкаКалендаряОранжевая, РамкаКалендаряПоУмолчанию, РамкаКалендаряСиняя.
За цвета, обозначающие занятость в планировщике, отвечают элементы стиля ЦветКалендаряДоступноеВремя, ЦветКалендаряПодВопросомВремя, ЦветКалендаряЗанятоеВремя, ЦветКалендаряОтсутствует. Дополнительно, при выборе времени мероприятия, выбранное на данный момент время отображается фоном из элемента стиля ФонВыбранногоВремени.
Цвет текста для элементов планировщика хранится в элементе стиля ЦветКалендаряПодпись.
Цвет фона текущего дня в планировщике и в плане дня хранится в элементе стиля ЦветКалендаряФонТекущегоДня. Цвет текста для обозначения текущего дня в плане дня хранится в элементе стиля ЦветКалендаряПодписьТекущийДень.
Цвет фона шапки и шкалы времени планировщика хранится в элементе стиля ЦветКалендаряФонШапки.
Справочник ЗаписиРабочегоКалендаря хранит информацию о записях календаря пользователя. В данном справочнике хранится информация о записях календаря, о повторяющихся записях календаря и мероприятиях.
Перечисление ДоступностьПользователя определяет базу для расчета занятости пользователя – считать ли пользователя всегда доступным, всегда занятым или же рассчитывать по специальному расписанию. Значение настройки используется в регистре сведений НастройкиРабочегоКалендаря, но для получения значения настройки с учетом значения по умолчанию следует использовать функцию ПолучитьНастройкуДоступностиПользователя модуля РаботаСРабочимКалендаремСервер.
Перечисление НастройкиЗаписейРабочегоКалендаря определяет доступные настройки для записей календаря. Используется для разделения хранимых настроек в регистре сведений НастройкиОтображенияЗаписейРабочегоКалендаря.
Перечисление НастройкиРабочегоКалендаря определяет доступны настройки для календаря пользователя в целом. Используется для разделения хранимых настроек в регистре сведений НастройкиРабочегоКалендаря.
Перечисление ОтображениеВремениЭлементов используется для работы с настройками планировщика, соответствует системному перечислению ОтображениеВремениЭлементовПланировщика. Хранится в персональных настройках пользователя.
Перечисление ПериодОтображенияРабочегоКалендаря используется для хранения различных вариантов отображения календаря, таких как день, неделя, месяц, план дня. Носит служебный характер на форме плана дня для рабочего стола и форме подбора времени мероприятия. На форме календаря пользователя доступен выбор варианта.
Перечисление ПравилаОкончанияПовторения содержит варианты правил окончания повторения для записей календаря. Хранится в реквизитах записи календаря.
Перечисление СостоянияЗанятости обозначает состояние занятости на конкретное время. Используется для обозначения отдельных элементов занятости в регистре сведений ЗанятостьПользователя и для обозначения итоговой рассчитанной занятост с помощью функции ПолучитьТаблицуЗанятости модуля РаботаСРабочимКалендаремСервер.
Перечисление СостоянияЗаписейРабочегоКалендаря обозначает состояние конкретной записи календаря, влияет на занятость во время записи календаря.
- Если запись календаря принята – пользователь считается занятым.
- Если запись календаря под вопросом – занятость в пользователя в это время тоже под вопросом.
- Если запись отклонена – она не влияет на занятость пользователя.
Перечисление ТипЗаписиКалендаря позволяет отличать обычные записи календаря от повторяющихся. Повторяющиеся записи календаря обозначаются как ПовторяющеесяСобытие, обычные записи календаря обозначаются как Событие и ЭлементПовторяющегосяСобытия. ЭлементПовторяющегосяСобытия обозначает, что данная запись календаря когда-то была частью повторяющееся записи календаря, но в неё были внесены изменения.
Перечисление ЦветаРабочегоКалендаря хранит значение настройки цвета записи календаря. Хранится в регистре сведений НастройкиОтображенияЗаписейРабочегоКалендаря.
Перечисление ЧастотаПовторения используется для определения правила повторения у записей рабочего календаря, обозначает как часто происходит повторение.
Перечисление ЭлементыРабочегоКалендаря используется для различения элеметов в планировщике – являются они обычными записями календарями (Событие) или повторяющимися (СобытиеПовторяюееся).
Регистр сведений ДоступноеВремяПользователя предназначен для настройки стандартного расписания доступности пользователя. Когда доступность пользователя настраивается по расписанию в данном регистре сведений хранится правила занятости пользователя на неделю.
Регистр сведений ЗанятостьПользователя предназначен для настройки занятости и доступности пользователя на конкретное время. Хранит информацию в том случае, если доступность на конкретное время отличается от доступность пользователя по расписанию.
Регистр сведений НастройкиОтображенияЗаписейРабочегоКалендаря хранит персональные настройки отображения конкретных записей календаря. Информация о цветах записей календаря хранится в данном регистре.
Регистр сведений НастройкиРабочегоКалендаря хранит настройки календарей пользователя. Информация о способе настройки доступности пользователя хранится в данном регистре.
Регистр сведений СвязанныеЗаписиКалендаря является служебным регистром, в нем хранится информация о связи мероприятий с записями календаря, созданными автоматически. Предназначен для поддержания автоматически созданных записей календаря в актуальном состоянии.
Внутреннее устройство
Планировщик
Для отображения календаря пользователя используется специальный элемент управления – Планировщик. Данное отображение используется в календаре для различных видов и при подборе времени мероприятия.

Для отображения данных в планировщике используются настройки отображения календаря. Структуру настроек отображения календаря можно получить с помощью функции ПолучитьНастройкиОтображения общего модуля РаботаСРабочимКалендаремСервер. В типовом случае достаточно уточнить в полученной структуре отображаемую дату (ОтображаемаяДата), все выделенные для отображения даты (ВыделенныеДаты), период отображения (ПериодОтображения) и пользователей, чей календарь необходимости отобразить (Пользователи). Для отображения планировщика необходимо вызвать процедуру ОтобразитьКалендарь общего модуля РаботаСРабочимКалендаремСервер – он будет заполнен в соответствии с переданными параметрами.
Отображение календаря разделено на две процедуры – загрузку данных в процедуре ЗагрузитьДанныеПланировщика общего модуля РаботаСРабочимКалендаремСервер и применение настроек отображения в процедуре ПрименитьНастройкиОтображения общего модуля РаботаСРабочимКалендаремКлиентСервер. Применение настроек отображения вынесено в клиент-серверный модуль для возможности применения настроек без клиент-серверных вызовов, при частичном обновлении данных на клиенте. Сами элементы планировщик специальным образом формируются из записей календаря с помощью функции ПолучитьСтруктуруЭлементаПланировщика общего модуля РаботаСРабочимКалендаремСервер.
Занятость в планировщике может отображаться как в виде фона, так и в виде элементов планировщика. Стандартно занятость отображается в виде фона. В случае если в настройках отображения ОтображатьЗанятость установлено в Истина, а ОтображатьСобытия установлено в Ложь – занятость отображается в виде элементов планировщика. Для получения элемента планировщика из занятость используется функция ПолучитьСтруктуруЭлементаПланировщикаЗанятость общего модуля РаботаСРабочимКалендаремСервер. Основные данные календаря при этом хранятся в структуре, сформированной с помощью функции СформироватьЭлементЗаписиКалендаря общего модуля РаботаСРабочимКалендаремКлиентСервер.
Основная логика настроек отображения планировщика прописана в процедуре ПрименитьНастройкиОтображения общего модуля РаботаСРабочимКалендаремКлиентСервер. Отдельно внимание следует обратить на то, что измерения устанавливаются только для случая отображения планировщика для нескольких пользователей. Если планировщик отображается для одного пользователя, то измерение Пользователь не используется и следует использовать не связанные с планировщиком способы определения, какому пользователю принадлежит отображаемый календарь (в форме Календарь – это реквизит ПользовательКалендаря).
Настройка шкал времени планировщика производится в процедуре УстановитьШкалуВремени общего модуля РаботаСРабочимКалендаремКлиентСервер. Для отображения месяца используется одна шкала времени. Для отображения данных по часам используется две шкалы времени: одна для отображения часов, другая "невидимая" для возможности изменения элементов планировщика в привязке к нужному размеру ячейки времени.
Календарь пользователя может содержать достаточно большое количество элементов, в связи с чем его полное обновление может вызывать заметные для пользователя задержки при контекстных вызовах пользователя. В связи с этим реализовано особое обновление данных планировщика во время работы, это процедура ОбновитьЗаписиКалендаряВПланировщике в общем модуле РаботаСРабочимКалендаремКлиент. Данная процедура позволяет обновлять данные планировщика без контекстных серверных вызовов, что положительно сказывается на скорости работы для пользователя.
У различных событий планировщика прописана специальная логика, позволяющая добиться желаемого поведения от данного элемента формы. Рассмотрим подробнее каждое из событий:
- ПриАктвизации – логика обработки данного события прописана в процедуре ОбработкаПриАктивизации общего модуля РаботаСРабочимКалендаремКлиент. Используется для установки доступности команд в контекстном меню планировщика при изменении выбора элементов.
- ПередСозданием – логика обработки данного события прописана в процедуре ОбработкаПередСозданием общего модуля РаботаСРабочимКалендаремКлиент. Используется для открытия формы создания новой записи календаря. В случае, если включен режим быстрого редактирования используется стандартное платформенное поведение планировщика.
- Выбор – логика обработки данного события прописана в процедуре ОбработкаВыбораЭлемента общего модуля РаботаСРабочимКалендаремКлиент. Используется для открытия формы существующей записи календаря. В случае выбора повторяющейся записи календаря будет предложено на выбор: открыть всё повторяющееся событие в целом или данный конкретный экземпляр. За это отвечает процедура ОбработкаВыбораПовторяющегосяСобытия в общем модуле РаботаСРабочимКалендаремКлиент.
- ПриОкончанииРедактирования – логика обработки данного события прописана в процедуре ОбработкаОкончанияРедактированияЭлемента общего модуля РаботаСРабочимКалендаремКлиент. Используется при различных изменениях элементов календаря – перетаскивании, растягивании, копирование, создании нового элемента через быстрое редактирование. При этом возможность массового копирования в планировщике запрещена. За изменение элементов отвечает процедура ОбработкаОкончанияРедактирования в общем модуле РаботаСРабочимКалендаремКлиент. За создание новых через копирование или быстрое редактирование – ОбработкаСозданиеЭлемента в общем модуле РаботаСРабочимКалендаремКлиент.
- ПередНачаломРедактирования – логика обработки данного события прописана в процедуре ОбработкаПередНачаломРедактированиемЭлемента в общем модуле РаботаСРабочимКалендаремКлиент. Создание нового элемента в данном элементе обозначает нажатие команды Редактировать в окне быстрого редактирования – в этом случае открывается форма новой записи календаря, с введенным описанием и временем (см. ОбработкаНачалаСозданияЭлемента в в общем модуле РаботаСРабочимКалендаремКлиент). Если новый элемент не создается, значит выполняется попытка начала редактирования элемента в планировщике. Быстрое редактирование существующих элементов в планировщике не используется, в связи с этим выполняется открытие формы элемента записи календаря для редактирования.
- ПередУдалением – логика обработки данного события прописана в процедуре ОбработкаПередУдалениемЭлемента общего модуля РаботаСРабочимКалендаремКлиент. Особое внимание следует уделить удалению повторяющихся записей календаря. В данном случае не происходит уточнение у пользователя, всегда удаляются экземпляры на конкретную дату, а не повторение в целом.
- ПриСменеТекущегоПериодаОтображения – логика данной обработки не вынесена в общий модуль, используется отказ от стандартной обработки. Необходима для отказа от стандартной возможности планировщика изменения текущего периода – например, при прокрутке колесика мышки.
- ПередНачаломБыстрогоРедактирования – логика данной обработки прописана в процедуре ПланировщикПередНачаломБыстрогоРедактирования общего модуля РаботаСРабочимКалендаремКлиент. Используется отказ от стандартного поведения – для отказа от окна быстрого редактирования существующих записей календаря.
План дня
Одним из вариантов отображения календаря является план дня – в этом случае календарь отображается в виде дерева значений. Данное отображение используется в календаря для вида План дня и для формы ближайших событий на рабочем столе.

Для отображения данных в плане для используются настройки отображения календаря такие же как и для планировщика. Структуру настроек отображения календаря можно получить с помощью функции ПолучитьНастройкиОтображения общего модуля РаботаСРабочимКалендаремСервер. В типовом случае достаточно уточнить в полученной структуре отображаемую дату (ОтображаемаяДата), все выделенные для отображения даты (ВыделенныеДаты), период отображения (ПериодОтображения) и пользователей, чей календарь необходимо отобразить (Пользователи). Для отображения плана дня необходимо вызвать процедуру ОтобразитьПланДня общего модуля РаботаСРабочимКалендаремСервер.
План для представляет собой дерево значений с двумя уровнями элементов. Элементы первого уровня обозначают дни, элементы второго уровня обозначают записи календаря в данном дне. За основу данных записи календаря взята структура, получаемая с помощью функции СформироватьЭлементЗаписиКалендаря общего модуля РаботаСРабочимКалендаремКлиентСервер. Дополнительно к ней формируется особое текстовое описание для отображения записи в плане дня. Например, для того чтобы отображать время у элементов календаря или авторов данных записей. Это происходит в функции СформироватьТекстовоеОписаниеСобытия общего модуля РаботаСРабочимКалендаремСервер.
У различных событий плана дня прописана специальная логика, позволяющая добиться желаемого поведения от данного элемента формы. Рассмотрим подробнее каждое из событий:
- Выбор – логика обработки данного события прописана в процедуре ОбработкаВыбораПланДня в общем модуле РаботаСРабочимКалендаремКлиент. Используется для особой обработки выбора строк с повторяющимися записями календаря – для таких записей будет предложено открыть конкретный экземпляр или же повторение в целом.
- ПриАктивизацииСтроки – логика обработки данного события прописана в процедуре ОбработкаАктивизацииОбластиПланДня в общем модуле РаботаСРабочимКалендаремКлиент. Используется для запоминания текущего элемента в плане дня. Запоминать текущей элемент в плане дня необходимо для возможности восстановления текущей позиции после обновления данных.
- ПередНачаломДобавления – логика обработки данного события прописана в процедуре ОбработкаПередНачаломДобавленияПланДня в общем модуле РаботаСРабочимКалендаремКлиент. Используется для создания новой записи с помощью процедуры СоздатьЗаписьКалендаряПланДня или копирования существующей записи с помощью СкопироватьЗаписьКалендаряПланДня.
- ПередНачаломИзменения – логика обработки данного события прописана в процедуре ОбработкаПередНачаломИзмененияПланДня в общем модуле РаботаСРабочимКалендаремКлиент. Используется для особой обработки выбора повторяющихся записей календаря, аналогично событию Выбор.
- ПередУдалением – логика обработки данного события прописана в процедуре ОбработкаПередУдалениемПланДня в общем модуле РаботаСРабочимКалендаремКлиент. Используется для особой обработки удаления повторяющихся событий – будут удалены отдельные экземпляры повторяющихся записей календаря на конкретные дни, а не повторение целиком.
- НачалоПеретаскивания – логика обработки данного события прописана в процедуре ОбработкаНачалаПеретаскиванияПланДня в общем модуле РаботаСРабочимКалендаремКлиент. Используется для особой обработки перетаскивания – можно перетаскивать только строки с записями календаря, строки с днями перетаскивать нельзя.
- ПроверкаПеретаскивания – логика обработки данного события прописана в процедуре ОбработкаПроверкиПеретаскиванияПланДня в общем модуле РаботаСРабочимКалендаремКлиент. Используется для проверки корректности перетаскиваемых данных.
- Перетаскивание – логика обработки данного события прописана в процедуре ОбработкаПеретаскиванияПланДня в общем модуле РаботаСРабочимКалендаремКлиент. Используется для корректного перетаскивания. Основная логика переноса записей календаря на другую дату расположена в процедуре ПеренестиЭлементыЗаписейКалендаряНаДату.
Напоминания
Для работы с напоминаниями в календаре используется модифицированная подсистема напоминаний БСП – см. подсистему НапоминанияПользователя.

В общем модуле НапоминанияПользователяСлужебный в функции ПолучитьЗначениеДатыНачалаЗаписиКалендаря сосредоточена особая логика определения даты напоминания, учитывающая повторяющиеся записи календаря.
В общем модуле НапоминанияПользователяГлобальный в процедуре ПроверитьТекущиеНапоминания изменено открытие форм оповещений. Если напоминаний одновременно более 5, то используется стандартная форма напоминаний БСП, в противном случае используется специальная форма напоминаний ФормаОповещенияДокументооборот.
Возможность напоминаний вынесена на форму элемента записи календаря, для возможности установки напоминаний без открытия дополнительных форм в простых случаях. В случае необходимости установки непредусмотренного простого срока напоминания используется форма НапоминаниеДокументооборот.
Данные о событиях
В календаре пользователя отображаются различные данные – записи календаря, отсутствия, мероприятия.
Особенностью отображения записей календаря является возможность настройки повторения. В этом случае будет заведен только один элемент справочника ЗаписиРабочегоКалендаря, но ему будет соответствовать целый набор событий, которые следует отображать в календаре. Для обозначения таких записей используется реквизит ТипЗаписиКалендаря – если он установлен в значение ПовторяющеесяСобытие, тогда следует учитывать значения реквизитов:
- ДатаНачалаПовторения,
- ДатаОкончанияПовторения,
- ИнтервалПовторения,
- КоличествоПовторов,
- ПовторениеПоДнямМесяца,
- ПовторениеПоМесяцам,
- ПравилоОкончанияПовторения,
- ЧастотаПовторения,
- табличных частей ИсключенияПовторения и ПовторениеПоДням.
Для настройки правил повторения используется форма ФормаНастройкиПовторения справочника ЗаписиРабочегоКалендаря. Основная логика по работе с отображением повторяющихся записей календаря прописана в процедуре ВнестиПовторяющеесяСобытиеВТаблицу в общем модуле РаботаСРабочимКалендаремСервер.
Мероприятия в календаре отображаются с помощью записей календаря. По мероприятиям заводятся соответствующие записи в календарях участников, особым образом получать данные о мероприятиях необходимости нет. За это отвечают подписки на события КалендарьПередЗаписьюПредмета, КалендарьПередЗаписьюУчастников, КалендарьПриЗаписиПредмета, КалендарьПриЗаписиУчастников.
Для отсутствий не заводятся отдельные записи в календарях пользователей, но их все равно следует отображать в календаре пользователя.
Для получения данных о всех событиях, которые отображаются в календаре пользователя, следует использовать функцию ПолучитьТаблицуСобытий общего модуля РаботаСРабочимКалендаремСервер.
Расчет занятости пользователя
Для мероприятий доступна возможности проверки занятости пользователей при работе с приглашениями. Существующие состояния занятости описаны в перечислении СостоянияЗанятости.
Для получения информации о занятости пользователя следует использовать ПолучитьТаблицуЗанятости общего модуля РаботаСРабочимКалендаремСервер. Доступно два варианта работы – расчет только занятости в целом, или расчет подробной занятости на каждый промежуток времени.
Расчет занятости происходит следующим образом:
- Для основы расчета занятости используются данные о доступности пользователя по расписанию, полученные с помощью функции ПолучитьТаблицуДоступности регистра сведений ДоступноеВремяПользователя. Доступность пользователя по расписанию настраивается с помощью формы НастройкаДоступногоВремени.
- Выполняется корректировка занятости с учетом введенной пользователем вручную занятости на конкретное время, с помощью функции ПолучитьТаблицуЗанятости регистра сведений ЗанятостьПользователя. При этом данные о свободном и занятом времени обладают приоритетом над существующими сведениями.
- Выполняется корректировка занятости с учетом данных о занятости по записям календаря, с помощью функции ПолучитьТаблицуЗанятости справочника ЗаписиРабочегоКалендаря. При этом занятость по отклоенным записям календаря не учитывается. По подтвержденным записям календаря считается что пользователя занят. По записям под вопросом считается что занятость пользователя под вопросом. При этом занятость под вопросом обладает приоритетом над свободным временном; а занятое время обладает приоритетом над занятостью под вопросом и над свободным временем.
- Выполняется корректировка занятости с учетом данных об отсутствия, с помощью функции ПолучитьТаблицуЗанятости документа Отсутствие. При этом отсутствие обладает приоритетом над всеми занятостями.
Права доступа
Права доступа на календарь пользователя зависят отображаемых данных.
- Информации о занятости доступна всем пользователям для просмотра.
- Информация о записях календаря пользователя доступна только самому пользователю и автору записи, его руководителям и делегатам. К информации о записях календаря по мероприятию дополнительно доступ имеют те пользователи, у которых есть доступ к мероприятию.
- Информация об отсутствиях доступна всем пользователям.
Есть возможность вносить записи в календари других пользователей. При этом данная запись будет внесена в состоянии Под вопросом. Уже сам пользователь, для которого предназначена запись, сможет подтвердить или отклонить её.