Как при печати штатного расписания автоматически выделять выходные и праздничные дни другим цветом?

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

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

Понимание задачи и выбор инструментов

Чтобы реализовать данную функциональность, нам необходимо решить две задачи: определить статус конкретной даты (является ли она рабочим, выходным или праздничным днем) и применить визуальное оформление к соответствующей области ТабличныйДокумент.

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

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

Для начала создадим функцию, которая будет извлекать данные о днях из регистра за выбранный период. Рассмотрим пример кода, который делает выборку данных за указанный интервал:


Функция ПолучитьДанныеПроизводственногоКалендаря(ДатаНачала, ДатаОкончания)
    Запрос = Новый Запрос;
    Запрос.УстановитьПараметр("ДатаНачала", НачалоДня(ДатаНачала));
    Запрос.УстановитьПараметр("ДатаОкончания", КонецДня(ДатаОкончания));
    Запрос.Текст = 
        "ВЫБРАТЬ
        |	РегламентированныйПроизводственныйКалендарь.ДатаКалендаря КАК ДатаКалендаря,
        |	РегламентированныйПроизводственныйКалендарь.ВидДня КАК ВидДня
        |ИЗ
        |	РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
        |ГДЕ
        |	РегламентированныйПроизводственныйКалендарь.ДатаКалендаря МЕЖДУ &ДатаНачала И &ДатаОкончания";
    Возврат Запрос.Выполнить().Выгрузить();
КонецФункции

Программная раскраска ячеек макета

После получения таблицы данных, содержащей информацию о днях, мы можем приступить к заполнению печатной формы. В цикле формирования документа мы будем проверять статус текущей даты. Если день попадает в категорию выходных или праздничных, мы применим свойство ЦветФона к нужной области макета.

Рассмотрим процесс по шагам:

  1. Получаем данные производственного календаря за нужный период с помощью функции, описанной выше.
  2. В цикле обхода дней периода ищем запись в полученной таблице значений, используя метод НайтиСтроки.
  3. Анализируем поле ВидДня. Если значение соответствует выходному дню или празднику, применяем оформление.

Для ВашаДата = НачалоМесяца(ДатаОтчета) По КонецМесяца(ДатаОтчета) Цикл
    // Ищем статус дня в нашей таблице
    МассивНайденныхСтрок = ТаблицаПроизвКаленд.НайтиСтроки(Новый Структура("ДатаКалендаря", ВашаДата));
    
    Если МассивНайденныхСтрок.Количество() > 0 Тогда
        ВидДня = МассивНайденныхСтрок[0].ВидДня;
        
        Если ВидДня = Перечисления.ВидыДнейПроизводственногоКалендаря.Суббота ИЛИ 
             ВидДня = Перечисления.ВидыДнейПроизводственногоКалендаря.Воскресенье ИЛИ 
             ВидДня = Перечисления.ВидыДнейПроизводственногоКалендаря.Праздник Тогда
             
             // Закрашиваем ячейку в области табличного документа
             Область = ТабДокумент.Область(Строка, Колонка);
             Область.ЦветФона = WebЦвета.ЛососьСветлый;
        КонецЕсли;
    КонецЕсли;
КонецЦикла;

Рекомендации по оптимизации

Работая с печатными формами 1С, стоит обратить внимание на следующие нюансы:

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

← На главную