Заполнение графиков работы — одна из наиболее частых задач при автоматизации HR-процессов и управленческого учета в 1С. Стандартное ПолеКалендаря в платформе 1С зачастую ограничивает разработчика выбором только одной даты, в то время как пользователю необходимо «натыкать» произвольное количество рабочих дней. Разберем подробно, какими способами можно реализовать удобный интерфейс для планирования графика и как правильно организовать запись данных в РегистрСведений.
Если задача стоит в рамках обычных форм или когда требуется максимальная простота без внешних компонент, рассмотрим вариант создания собственной формы календаря. Суть заключается в динамическом размещении элементов на форме, которые будут имитировать дни месяца.
Проанализируем шаги реализации:
ВыбранныйГод и ВыбранныйМесяц.Рассмотрим пример кода для определения количества дней в месяце и заполнения структуры дат:
// Определяем количество дней в месяце
КоличествоДней = День(КонецМесяца(Дата(ВыбранныйГод, ВыбранныйМесяц, 1)));
Для НомерДня = 1 По КоличествоДней Цикл
// Логика создания или настройки видимости кнопок на форме
ИмяКнопки = "КнопкаДень_" + НомерДня;
ЭлементФормы = ЭлементыФормы[ИмяКнопки];
ЭлементФормы.Видимость = Истина;
ЭлементФормы.Заголовок = Строка(НомерДня);
КонецЦикла;
При нажатии на кнопку дня мы можем менять ее цвет (например, на оранжевый для выделения). Данные о выбранных днях лучше всего хранить в коллекции СписокЗначений или Массив на уровне формы.
Если мы работаем на платформе 1С:Предприятие 8.3 с использованием управляемых форм, наиболее профессиональным решением будет использование штатного объекта Планировщик. Он специально создан для визуализации временных интервалов.
Выясним преимущества этого метода:
Разберем по шагам, как настроить Планировщик для заполнения графика:
Сначала настроим шкалу времени так, чтобы одна колонка соответствовала одному дню. Для этого в свойствах планировщика установим кратность и выключим отображение времени. При клике пользователя на ячейку будет создаваться объект ЭлементПланировщика.
Пример обработки коллекции выбранных элементов перед записью в регистр:
Для Каждого Элемент Из Элементы.Планировщик.Элементы Цикл
ДатаНачала = Элемент.Начало;
ДатаОкончания = Элемент.Конец;
// Цикл по всем дням внутри выбранного интервала
ТекущаяДата = НачалоДня(ДатаНачала);
Пока ТекущаяДата <= НачалоДня(ДатаОкончания) Цикл
ДобавитьЗаписьВРегистр(ТекущаяДата, Сотрудник, ГрафикРаботы);
ТекущаяДата = ТекущаяДата + 86400; // Прибавляем сутки
КонецЦикла;
КонецЦикла;
Посмотрим на ситуацию, когда нам нужно вывести календарь сразу на несколько месяцев вперед. Использование кнопок здесь будет громоздким. В этом случае идеально подойдет ТабличныйДокумент, встроенный прямо в форму.
Проанализируем алгоритм работы:
Выбор или ПриАктивизацииОбласти.Этот метод позволяет очень гибко управлять визуализацией: можно подсвечивать праздничные дни, используя данные из производственного календаря БСП (Библиотека стандартных подсистем).
Для создания максимально отзывчивого интерфейса в веб-клиенте или тонком клиенте можно использовать ПолеHTMLДокумента. Существует множество JS-библиотек (например, FullCalendar), которые позволяют реализовать полноценный интерактивный календарь.
Рассмотрим схему взаимодействия:
В 1С формируется HTML-код с подключенным скриптом календаря. При клике на дату в JavaScript срабатывает событие, которое передает данные обратно в 1С. В управляемых формах это реализуется через процедуру ПриНажатии в 1С, которая перехватывает изменение URL или специальный вызов window.external.
Независимо от выбранного способа визуализации, финальным этапом является фиксация данных в базе. Проанализируем, как правильно организовать запись, чтобы не перегружать систему и обеспечить целостность данных.
Важно: Не рекомендуется записывать каждую дату в регистр сразу после клика пользователя. Лучше накапливать изменения во временной таблице значений на форме и выполнять запись одной транзакцией после нажатия кнопки «Сформировать график».
Пример процедуры записи:
Процедура СформироватьГрафикНаСервере()
// ТЗ_ВыбранныеДаты - таблица значений на форме, куда попадали клики
Для Каждого СтрокаДаты Из ТЗ_ВыбранныеДаты Цикл
МенеджерЗаписи = РегистрыСведений.ГрафикиРаботы.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Период = СтрокаДаты.Дата;
МенеджерЗаписи.Сотрудник = Объект.Сотрудник;
МенеджерЗаписи.Состояние = Перечисления.СостоянияРаботника.Работает;
// Записываем запись, замещая существующую, если нужно
МенеджерЗаписи.Записать(Истина);
КонецЦикла;
Сообщить("График успешно сформирован!");
КонецПроцедуры
При планировании графиков также стоит учитывать существующие выходные и праздники. Вы можете использовать функции общего модуля КалендарныеГрафики из состава БСП, чтобы автоматически подсвечивать выходные дни в вашем самописном календаре, помогая пользователю ориентироваться в сетке месяца.
Мы рассмотрели несколько подходов к созданию интерактивного календаря. Выбор конкретного метода зависит от типа форм (обычные или управляемые) и требований к интерфейсу. Для простых задач отлично подойдет сетка кнопок или табличный документ, а для сложных систем планирования лучше смотреть в сторону Планировщика или HTML-вставок. Главное — разделять визуальное представление и логику хранения данных, используя временные таблицы для промежуточного хранения выбранных пользователем дат.