&НаКлиенте
Процедура КалендарьПриВыводеПериода(Элемент, ОформлениеПериода)
// Защита от вызова до инициализации реквизитов формы
Если ВидыДней = Неопределено Или ЦветаВидовДней = Неопределено Тогда
Возврат;
КонецЕсли;
Для Каждого СтрокаОформленияПериода Из ОформлениеПериода.Даты Цикл
ТекущаяДата = НачалоДня(СтрокаОформленияПериода.Дата);
// 1. Установка цвета текста в зависимости от вида дня (Рабочий, Суббота, Воскресенье, Праздник)
ВидДня = ВидыДней.Получить(ТекущаяДата);
ЦветОформленияДня = ?(ВидДня <> Неопределено, ЦветаВидовДней.Получить(ВидДня), Неопределено);
Если ЦветОформленияДня = Неопределено Тогда
ЦветОформленияДня = WebЦвета.Черный;
КонецЕсли;
СтрокаОформленияПериода.ЦветТекста = ЦветОформленияДня;
// 2. Установка цвета фона по включению дня в рабочий график
// Явно проверяем равенство Истина, так как Ложь <> Неопределено давало Истина для всех дней
ДеньВГрафике = ?(ДниГрафика <> Неопределено, ДниГрафика.Получить(ТекущаяДата), Неопределено);
Если ДеньВГрафике = Истина Тогда
СтрокаОформленияПериода.ЦветФона = WebЦвета.Роса;
Иначе
СтрокаОформленияПериода.ЦветФона = WebЦвета.Белый;
КонецЕсли;
// 3. Установка цвета фона для нерабочих периодов
Если НерабочиеДаты <> Неопределено И НерабочиеДаты.Найти(ТекущаяДата) <> Неопределено Тогда
СтрокаОформленияПериода.ЦветФона = WebЦвета.Фиолетовый;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
&НаСервере
Процедура ПреобразоватьДанныеПроизводственногоКалендаря(ДанныеПроизводственногоКалендаря)
ВидыДнейСоответствие = Новый Соответствие;
ПереносыДнейСоответствие = Новый Соответствие;
Для Каждого СтрокаТаблицы Из ДанныеПроизводственногоКалендаря Цикл
ДатаНорм = НачалоДня(СтрокаТаблицы.Дата);
ВидыДнейСоответствие.Вставить(ДатаНорм, СтрокаТаблицы.ВидДня);
Если ЗначениеЗаполнено(СтрокаТаблицы.ДатаПереноса) Тогда
ПереносыДнейСоответствие.Вставить(ДатаНорм, НачалоДня(СтрокаТаблицы.ДатаПереноса));
КонецЕсли;
КонецЦикла;
// Дополнение отсутствующих дней года
ДатаДня = Дата(НомерТекущегоГода, 1, 1);
ДатаОкончания = Дата(НомерТекущегоГода, 12, 31);
Пока ДатаДня <= ДатаОкончания Цикл
Если ВидыДнейСоответствие[ДатаДня] = Неопределено Тогда
НомерДня = ДеньНедели(ДатаДня);
Если НомерДня <= 5 Тогда
ВидДняПоУмолчанию = Перечисления.ВидыДнейПроизводственногоКалендаря.Рабочий;
ИначеЕсли НомерДня = 6 Тогда
ВидДняПоУмолчанию = Перечисления.ВидыДнейПроизводственногоКалендаря.Суббота;
Иначе
ВидДняПоУмолчанию = Перечисления.ВидыДнейПроизводственногоКалендаря.Воскресенье;
КонецЕсли;
ВидыДнейСоответствие.Вставить(ДатаДня, ВидДняПоУмолчанию);
КонецЕсли;
ДатаДня = ДатаДня + 86400;
КонецЦикла;
ВидыДней = Новый ФиксированноеСоответствие(ВидыДнейСоответствие);
ПереносыДней = Новый ФиксированноеСоответствие(ПереносыДнейСоответствие);
КонецПроцедуры
&НаКлиенте
Процедура ИзменитьВидыДней(ДатыДней, ВидДня)
ВидыДнейСоответствие = Новый Соответствие(ВидыДней);
Для Каждого ВыбраннаяДата Из ДатыДней Цикл
ВидыДнейСоответствие.Вставить(НачалоДня(ВыбраннаяДата), ВидДня);
КонецЦикла;
ВидыДней = Новый ФиксированноеСоответствие(ВидыДнейСоответствие);
КонецПроцедуры