Как реализовать заполнение графика работы с помощью интерактивного выбора дат в календаре

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

Заполнение графиков работы — одна из наиболее частых задач при автоматизации HR-процессов и управленческого учета в 1С. Стандартное ПолеКалендаря в платформе 1С зачастую ограничивает разработчика выбором только одной даты, в то время как пользователю необходимо «натыкать» произвольное количество рабочих дней. Разберем подробно, какими способами можно реализовать удобный интерфейс для планирования графика и как правильно организовать запись данных в РегистрСведений.

Метод 1. Программное создание сетки календаря на кнопках

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

Проанализируем шаги реализации:

  1. Создадим форму, на которой разместим реквизиты ВыбранныйГод и ВыбранныйМесяц.
  2. При выборе месяца программно очистим группу элементов и создадим сетку из 31 кнопки (или надписи с гиперссылками).
  3. Для каждого дня месяца выполним проверку: сколько дней в выбранном месяце, чтобы не выводить лишние даты.

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


// Определяем количество дней в месяце
КоличествоДней = День(КонецМесяца(Дата(ВыбранныйГод, ВыбранныйМесяц, 1)));

Для НомерДня = 1 По КоличествоДней Цикл
    // Логика создания или настройки видимости кнопок на форме
    ИмяКнопки = "КнопкаДень_" + НомерДня;
    ЭлементФормы = ЭлементыФормы[ИмяКнопки];
    ЭлементФормы.Видимость = Истина;
    ЭлементФормы.Заголовок = Строка(НомерДня);
КонецЦикла;

При нажатии на кнопку дня мы можем менять ее цвет (например, на оранжевый для выделения). Данные о выбранных днях лучше всего хранить в коллекции СписокЗначений или Массив на уровне формы.

Метод 2. Использование объекта «Планировщик» (для управляемых форм)

Если мы работаем на платформе 1С:Предприятие 8.3 с использованием управляемых форм, наиболее профессиональным решением будет использование штатного объекта Планировщик. Он специально создан для визуализации временных интервалов.

Выясним преимущества этого метода:

Разберем по шагам, как настроить Планировщик для заполнения графика:

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

Пример обработки коллекции выбранных элементов перед записью в регистр:


Для Каждого Элемент Из Элементы.Планировщик.Элементы Цикл
    ДатаНачала = Элемент.Начало;
    ДатаОкончания = Элемент.Конец;
    
    // Цикл по всем дням внутри выбранного интервала
    ТекущаяДата = НачалоДня(ДатаНачала);
    Пока ТекущаяДата <= НачалоДня(ДатаОкончания) Цикл
        ДобавитьЗаписьВРегистр(ТекущаяДата, Сотрудник, ГрафикРаботы);
        ТекущаяДата = ТекущаяДата + 86400; // Прибавляем сутки
    КонецЦикла;
КонецЦикла;

Метод 3. Реализация через «Табличный документ»

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

Проанализируем алгоритм работы:

  1. Программно формируем область макета, имитирующую календарную сетку (7 колонок по количеству дней недели).
  2. Заполняем ячейки датами текущего месяца.
  3. Используем событие Выбор или ПриАктивизацииОбласти.
  4. В обработчике события проверяем текущую ячейку: если она уже помечена как «рабочая» (например, фон закрашен зеленым), сбрасываем состояние. Если пустая — помечаем.

Этот метод позволяет очень гибко управлять визуализацией: можно подсвечивать праздничные дни, используя данные из производственного календаря БСП (Библиотека стандартных подсистем).

Метод 4. Интеграция через HTML и JavaScript

Для создания максимально отзывчивого интерфейса в веб-клиенте или тонком клиенте можно использовать ПолеHTMLДокумента. Существует множество JS-библиотек (например, FullCalendar), которые позволяют реализовать полноценный интерактивный календарь.

Рассмотрим схему взаимодействия:

В 1С формируется HTML-код с подключенным скриптом календаря. При клике на дату в JavaScript срабатывает событие, которое передает данные обратно в 1С. В управляемых формах это реализуется через процедуру ПриНажатии в 1С, которая перехватывает изменение URL или специальный вызов window.external.

Запись данных в Регистр Сведений

Независимо от выбранного способа визуализации, финальным этапом является фиксация данных в базе. Проанализируем, как правильно организовать запись, чтобы не перегружать систему и обеспечить целостность данных.

Важно: Не рекомендуется записывать каждую дату в регистр сразу после клика пользователя. Лучше накапливать изменения во временной таблице значений на форме и выполнять запись одной транзакцией после нажатия кнопки «Сформировать график».

Пример процедуры записи:


Процедура СформироватьГрафикНаСервере()
    // ТЗ_ВыбранныеДаты - таблица значений на форме, куда попадали клики
    Для Каждого СтрокаДаты Из ТЗ_ВыбранныеДаты Цикл
        МенеджерЗаписи = РегистрыСведений.ГрафикиРаботы.СоздатьМенеджерЗаписи();
        МенеджерЗаписи.Период = СтрокаДаты.Дата;
        МенеджерЗаписи.Сотрудник = Объект.Сотрудник;
        МенеджерЗаписи.Состояние = Перечисления.СостоянияРаботника.Работает;
        
        // Записываем запись, замещая существующую, если нужно
        МенеджерЗаписи.Записать(Истина);
    КонецЦикла;
    
    Сообщить("График успешно сформирован!");
КонецПроцедуры

При планировании графиков также стоит учитывать существующие выходные и праздники. Вы можете использовать функции общего модуля КалендарныеГрафики из состава БСП, чтобы автоматически подсвечивать выходные дни в вашем самописном календаре, помогая пользователю ориентироваться в сетке месяца.

Резюме

Мы рассмотрели несколько подходов к созданию интерактивного календаря. Выбор конкретного метода зависит от типа форм (обычные или управляемые) и требований к интерфейсу. Для простых задач отлично подойдет сетка кнопок или табличный документ, а для сложных систем планирования лучше смотреть в сторону Планировщика или HTML-вставок. Главное — разделять визуальное представление и логику хранения данных, используя временные таблицы для промежуточного хранения выбранных пользователем дат.

← На главную