Как реализовать подсистему «Рабочий календарь» в 1С:Предприятие 8 на основе типовых решений?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Создание полноценного рабочего календаря в среде 1С:Предприятие 8 — это комплексная задача, требующая не только проектирования структуры данных, но и глубокого понимания механизмов визуализации и алгоритмов расчета времени. В типовых конфигурациях, таких как «1С:Документооборот», эта подсистема уже реализована на высоком уровне. Проанализируем теоретический материал и разберем по шагам, как превратить описание объектов метаданных в работающий программный код.

1. Подготовка базовой инфраструктуры и функциональных опций

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

Рассмотрим, какие общие модули нам понадобятся для сосредоточения основной логики:

  1. РаботаСРабочимКалендаремСервер — здесь мы разместим функции расчета занятости и запросы к базе данных.
  2. РаботаСРабочимКалендаремКлиентСервер — для процедур проверки корректности введенных дат, которые должны работать на обоих уровнях.
  3. РаботаСРабочимКалендаремКлиент — для управления формой планировщика и интерактивными действиями пользователя.

2. Проектирование структуры хранения данных

Основным объектом для хранения информации является справочник ЗаписиРабочегоКалендаря. Разберем его ключевые реквизиты. Нам необходимо хранить не только время начала и окончания, но и тип записи (событие, повторяющееся событие или исключение из повторения). Для этого используем перечисление ТипЗаписиКалендаря.

Для реализации гибкого расписания занятости нам потребуется связка из двух регистров сведений:

  1. Регистр ДоступноеВремяПользователя: здесь мы будем хранить «шаблон» недели (например, Пн-Пт с 09:00 до 18:00).
  2. Регистр ЗанятостьПользователя: этот регистр предназначен для фиксации конкретных отклонений. Если пользователь занят на совещании или отсутствует, запись попадает сюда.

Выясним причину использования перечисления СостоянияЗанятости. Оно позволяет системе отличать жесткое бронирование времени (Занят) от предварительного (ПодВопросом) или полного отсутствия в офисе (Отсутствует).

3. Реализация графического интерфейса через объект «Планировщик»

Визуализация календаря в 1С выполняется с помощью стандартного элемента управления Планировщик. Посмотрим на пример того, как программно инициализировать этот элемент в коде формы:


&НаСервере
Процедура ИнициализироватьПланировщик()
    
    ЭлементПланировщик = ЭтаФорма.Элементы.Календарь;
    
    // Устанавливаем параметры шкалы времени
    ЭлементПланировщик.Периодичность = 1800; // 30 минут в секундах
    ЭлементПланировщик.НачалоДня = '00010101080000'; // 8:00
    ЭлементПланировщик.КонецДня  = '00010101200000'; // 20:00
    
    // Настройка цветов из элементов стиля
    ЭлементПланировщик.ЦветФонаТекущегоДня = Стиль.ЦветКалендаряФонТекущегоДня;
    
КонецПроцедуры

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

4. Алгоритм расчета доступности пользователя

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

  1. Получение базового графика: Программа считывает данные из регистра ДоступноеВремяПользователя. Если данных нет, по умолчанию принимается круглосуточная доступность или график предприятия.
  2. Наложение исключений: Система анализирует регистр ЗанятостьПользователя. Эти записи имеют приоритет над общим графиком.
  3. Учет мероприятий: Если запись календаря связана с объектом «Мероприятие» (через регистр СвязанныеЗаписиКалендаря), она блокирует соответствующий интервал времени.

Рассмотрим фрагмент кода для проверки пересечений при создании новой записи:


&НаСервере
Функция ПроверитьДоступность(Пользователь, ДатаНачала, ДатаОкончания) Экспорт
    
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |	ЗанятостьПользователя.СостояниеЗанятости
        |ИЗ
        |	РегистрСведений.ЗанятостьПользователя КАК ЗанятостьПользователя
        |ГДЕ
        |	ЗанятостьПользователя.Пользователь = &Пользователь
        |	И ЗанятостьПользователя.ПериодЗавершения > &ДатаНачала
        |	И ЗанятостьПользователя.Период < &ДатаОкончания";
        
    Запрос.УстановитьПараметр("Пользователь", Пользователь);
    Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала);
    Запрос.УстановитьПараметр("ДатаОкончания", ДатаОкончания);
    
    Результат = Запрос.Выполнить();
    Возврат Результат.Пустой();
    
КонецФункции

5. Работа с повторяющимися событиями

Разберем, как реализовать механизм повторения (например, «каждый понедельник»). Вместо создания множества физических записей в ЗаписиРабочегоКалендаря, мы создаем одну «мастер-запись» с заполненными реквизитами повторения (используя перечисления ЧастотаПовторения и ПравилаОкончанияПовторения).

При выводе данных в Планировщик мы должны программно «развернуть» эти правила в интервале отображения. Если пользователь меняет время только одного конкретного экземпляра из серии, мы создаем новую запись с типом ЭлементПовторяющегосяСобытия, которая будет «перекрывать» мастер-запись в этот конкретный день.

6. Подписки на события и целостность данных

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

Эти подписки позволяют автоматически обновлять записи в справочнике ЗаписиРабочегоКалендаря, когда изменяется документ-основание (например, «Протокол совещания» или «Заявка на командировку»). Это избавляет пользователя от необходимости вручную вносить изменения в свой план дня.

7. Расширенные возможности: цвета и стили

Для удобства восприятия информации необходимо использовать элементы стиля. Цветовая индикация позволяет мгновенно оценить плотность графика. Рассмотрим, как в коде формы применить цвет к элементу планировщика:


ЭлементПланировщика = Планировщик.Элементы.Добавить(ДатаНачала, ДатаОкончания);
ЭлементПланировщика.Текст = "Производственное совещание";

// Используем перечисление цветов рабочего календаря
Если Запись.Цвет = Перечисления.ЦветаРабочегоКалендаря.Красный Тогда
    ЭлементПланировщика.ЦветФона = Стиль.ЦветКалендаряКрасный;
    ЭлементПланировщика.ЦветТекста = Стиль.ЦветКалендаряПодпись;
КонецЕсли;

Такой подход гарантирует единообразие интерфейса во всей системе и позволяет централизованно менять палитру календаря через настройку элементов стиля конфигурации.

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

← На главную