Как во внешней печатной форме ЗУП 3.1 разделить рабочее время и время работы в праздничные и выходные дни?

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

Разработка и модификация печатных форм в конфигурации 1С:Зарплата и Управление Персоналом 3.1 требует понимания того, как система хранит данные о времени сотрудников. Часто возникает задача разделить в табеле учета рабочего времени (например, по форме 0504421) «обычные» явки и часы, отработанные в выходные или праздничные дни. Давайте разберемся, как это реализовать, опираясь на заложенные в конфигурации механизмы.

Понимание структуры данных табеля

В ЗУП 3.1 данные о рабочем времени до попадания в печатную форму проходят стадию подготовки. Система оперирует не просто «датами» и «часами», а конкретными ВидамиИспользованияРабочегоВремени. Именно эти виды содержат ключевой признак, который поможет нам разделить данные — БуквенныйКод.

Вместо того чтобы вручную вычислять, является ли день выходным через производственный календарь (что часто ведет к ошибкам из-за индивидуальных графиков работы), мы будем анализировать именно код вида времени, зафиксированный в табеле для конкретной записи.

Реализация логики разделения

Рассмотрим пошагово, как внедрить раздельный учет в алгоритм формирования вашей печатной формы.

  1. Анализ текущей выборки: В процедуре формирования формы найдите цикл, который перебирает дни месяца и заполняет параметры области табличной части. В типовых решениях это место выглядит примерно так:
    
    Если КлючВарианта = "Форма0504421с2015" Тогда
        ОбластьВремяСтрока.Параметры.ДниПерваяПоловина = ?(ВыводитьЯвки, ДниПерваяПоловина, ДниНеявокПерваяПоловина);
        // ... (аналогичные операции для остальных параметров)
    КонецЕсли;
    
  2. Использование БуквенногоКода: Внутри цикла обхода данных по дням, для каждой итерации, вы имеете доступ к объекту, содержащему вид времени. Проверяйте значение БуквенныйКод. Для обычных явок это обычно «Я», а для работы в выходные дни — «РВ».
  3. Разделение счетчиков: Создайте две переменные-счетчика внутри цикла для каждой строки сотрудника: ВсегоЧасовЯвки и ВсегоЧасовВыходные.
    
    Если ТекущийБуквенныйКод = "РВ" Тогда
        ВсегоЧасовВыходные = ВсегоЧасовВыходные + ОтработаноЧасов;
    ИначеЕсли ТекущийБуквенныйКод = "Я" Тогда
        ВсегоЧасовЯвки = ВсегоЧасовЯвки + ОтработаноЧасов;
    КонецЕсли;
    

Альтернативный подход: работа с производственным календарем

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

Рассмотрим пример функции для определения типа дня:


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

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

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

Чтобы ваша печатная форма работала корректно и стабильно:

Таким образом, ключ к решению задачи лежит не в добавлении сложных запросов, а в правильной группировке данных уже на этапе формирования выборки в коде внешней печатной формы. Используя БуквенныйКод, вы получите максимально достоверные данные, которые соответствуют фактическому учету, настроенному в вашей системе.

← На главную