При создании отчетов и печатных форм в системе 1С часто возникает задача визуального выделения выходных и праздничных дней. Это помогает пользователям быстрее ориентироваться в графиках работы сотрудников. Давайте разберем, как реализовать такую автоматическую подсветку программным способом, чтобы при печати за любой выбранный период дни недели подсвечивались корректно.
Чтобы реализовать данную функциональность, нам необходимо решить две задачи: определить статус конкретной даты (является ли она рабочим, выходным или праздничным днем) и применить визуальное оформление к соответствующей области ТабличныйДокумент.
Для определения типа дня лучше всего подходит использование РегистрСведений.РегламентированныйПроизводственныйКалендарь. Это позволяет учитывать не только субботы и воскресенья, но и государственные праздники, а также переносы выходных дней, которые утверждены на законодательном уровне.
Для начала создадим функцию, которая будет извлекать данные о днях из регистра за выбранный период. Рассмотрим пример кода, который делает выборку данных за указанный интервал:
Функция ПолучитьДанныеПроизводственногоКалендаря(ДатаНачала, ДатаОкончания)
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("ДатаНачала", НачалоДня(ДатаНачала));
Запрос.УстановитьПараметр("ДатаОкончания", КонецДня(ДатаОкончания));
Запрос.Текст =
"ВЫБРАТЬ
| РегламентированныйПроизводственныйКалендарь.ДатаКалендаря КАК ДатаКалендаря,
| РегламентированныйПроизводственныйКалендарь.ВидДня КАК ВидДня
|ИЗ
| РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
|ГДЕ
| РегламентированныйПроизводственныйКалендарь.ДатаКалендаря МЕЖДУ &ДатаНачала И &ДатаОкончания";
Возврат Запрос.Выполнить().Выгрузить();
КонецФункции
После получения таблицы данных, содержащей информацию о днях, мы можем приступить к заполнению печатной формы. В цикле формирования документа мы будем проверять статус текущей даты. Если день попадает в категорию выходных или праздничных, мы применим свойство ЦветФона к нужной области макета.
Рассмотрим процесс по шагам:
НайтиСтроки.ВидДня. Если значение соответствует выходному дню или празднику, применяем оформление.
Для ВашаДата = НачалоМесяца(ДатаОтчета) По КонецМесяца(ДатаОтчета) Цикл
// Ищем статус дня в нашей таблице
МассивНайденныхСтрок = ТаблицаПроизвКаленд.НайтиСтроки(Новый Структура("ДатаКалендаря", ВашаДата));
Если МассивНайденныхСтрок.Количество() > 0 Тогда
ВидДня = МассивНайденныхСтрок[0].ВидДня;
Если ВидДня = Перечисления.ВидыДнейПроизводственногоКалендаря.Суббота ИЛИ
ВидДня = Перечисления.ВидыДнейПроизводственногоКалендаря.Воскресенье ИЛИ
ВидДня = Перечисления.ВидыДнейПроизводственногоКалендаря.Праздник Тогда
// Закрашиваем ячейку в области табличного документа
Область = ТабДокумент.Область(Строка, Колонка);
Область.ЦветФона = WebЦвета.ЛососьСветлый;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Работая с печатными формами 1С, стоит обратить внимание на следующие нюансы:
WebЦвета.ЛососьСветлый), рекомендуется использовать ЦветаСтиля. Это позволит пользователю изменять тему оформления в настройках системы, не меняя при этом программный код.РегламентированныйПроизводственныйКалендарь является наиболее надежным, так как он автоматически учитывает все переносы и специфику выходных дней в конкретном году, в отличие от простого анализа функции ДеньНедели().Следуя этим рекомендациям, вы сможете создать гибкую и надежную печатную форму, которая будет автоматически подстраиваться под производственный календарь любого выбранного периода.