Задача простейшая – подсветить каждому пользователю по известным периодам дня при вкладке день и неделя нерабочее время. Рабочее время известно и вычисляется как начало дня (справочник пользователи, дополнительный реквизит) и коэффициент, который варьируется от 0.01 до 1.00, показывающий, какая ставка у пользователя. Например, коэффициент на 1/4 ставки будет 0.25. Если у пользователя начало дня не указано, то он работает по стандартной схеме начала рабочего дня, поэтому получаем данные из константы.
Таким образом, длительность дня рассчитывается так: НачалоРабочегоДня + 8 * 60 *60 * Коэффициент = ВремяОкончанияРабочегоДня.
Все, что видимо до НачалаРабочегоДня требуется подсветить (как в Outlook), так же как и после окончания рабочего дня.
Используем следующий код:
Планировщик.ИнтервалыФона.Добавить(НачалоДня(НачалоОтображенияВремени), НачалоОтображенияВремени);
Планировщик.ИнтервалыФона.Добавить(ОкончаниеРабочегоВремени, КонецДня(ОкончаниеРабочегоВремени));
Планировщик.ИнтервалыФона[0].Цвет = WebЦвета.БледноБирюзовый;
Планировщик.ИнтервалыФона[1].Цвет = WebЦвета.БледноБирюзовый;
Но есть одно “но” – НачалоОтображенияВремени, ОкончаниеРабочегоВремени представляет собой только часы, то есть формат 01.01.0001 ЧЧ-ММ-СС
Поэтому формировать подсветку надо добавлением к началу дня, окончанию рабочего дня по каждой отображаемой дате в колонке время из переменных.
Очень долго висел вопрос “А где же планировщик хранит отображаемые даты?”
В результате ответ следующий:
ДатаНачалаОтображения = Планировщик.НачалоПериодаОтображения;
ДатаОкончанияОтображения = Планировщик.КонецПериодаОтображения;
РазностьДат = Окр((ДатаОкончанияОтображения-ДатаНачалаОтображения)/3600,0,1);
СтруктураВремениПользователя = ПолучитьНачалоКонецДняПоПользователю();
Для СчетчикЦикла = 0 По РазностьДат Цикл
ДеньПланировщика = НачалоДня(ДатаНачалаОтображения + СчетчикЦикла * 3600);
Планировщик.ИнтервалыФона.Добавить(ДеньПланировщика +
(СтруктураВремениПользователя.НачалоДня - НачалоДня(СтруктураВремениПользователя.НачалоДня)),
ДеньПланировщика + (СтруктураВремениПользователя.КонецДня - НачалоДня(СтруктураВремениПользователя.НачалоДня)));
Планировщик.ИнтервалыФона[СчетчикЦикла].Цвет = WebЦвета.СветлоЗеленый;
КонецЦикла;
После выполнения этого кода, получаем результат на форме, где цвет установлен для демонстрации скриншота на сайте (не делайте такой цвет, выглядит ужасно в 1С).