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