При автоматизации учета рабочего времени часто возникает задача переноса данных из оперативного документа в специализированный регистр для последующего начисления заработной платы. Рассмотрим пошагово, как реализовать этот процесс, чтобы система работала корректно, а данные были всегда актуальными.
Для решения задачи нам необходимо определиться с типом регистра. Регистр сведений подходит для хранения текущего состояния или атрибутов, тогда как Регистр накопления идеально подходит для учета оборотов. Если вашей целью является получение отчета по суммарным часам за месяц, использование регистра накопления с видом Приход будет архитектурно более верным решением.
Если же вы решили использовать именно Регистр сведений, помните, что он не умеет «накапливать» данные. При каждой записи необходимо либо перезаписывать набор записей, либо аккуратно управлять составом измерений, чтобы избежать дублирования данных по одному сотруднику в одну и ту же дату.
Самый простой и надежный способ — выполнять запись в процедуре ОбработкаПроведения модуля объекта. Давайте разберем, как это сделать программно:
ВремяОкончания и ВремяНачала.РазностьДат или просто вычитайте даты друг из друга, получая значение в секундах.Пример программного расчета и записи данных:
// В модуле объекта документа
Процедура ОбработкаПроведения(Отказ, Режим)
// Очищаем движения, если регистр подчинен регистратору
Движения.ОтработанныеЧасы.Записывать = Истина;
Движения.ОтработанныеЧасы.Очистить();
Для Каждого СтрокаТЧ Из РасписаниеЗанятий Цикл
Движение = Движения.ОтработанныеЧасы.Добавить();
Движение.Период = Дата;
Движение.Сотрудник = СтрокаТЧ.Сотрудник;
РазницаВСекундах = СтрокаТЧ.ВремяОкончания - СтрокаТЧ.ВремяНачала;
Движение.КоличествоЧасов = РазницаВСекундах / 3600;
КонецЦикла;
КонецПроцедуры
Чтобы система работала быстро и без ошибок, придерживайтесь следующих правил:
Период в регистре настроено правильно (например, «В пределах дня»), чтобы исключить коллизии при проведении нескольких документов за один день.ВремяОкончания меньше ВремяНачала, вызывайте исключение через Отказ = Истина и выводите пользователю сообщение об ошибке.После того как вы настроили запись в Регистр сведений, расчет зарплаты становится тривиальной задачей. Вам достаточно будет сделать Запрос к виртуальной таблице регистра за выбранный период:
ВЫБРАТЬ
ОтработанныеЧасыСрезПоследних.Сотрудник,
СУММА(ОтработанныеЧасыСрезПоследних.КоличествоЧасов) КАК ВсегоЧасов
ИЗ
РегистрСведений.ОтработанныеЧасы.СрезПоследних(&Период, ) КАК ОтработанныеЧасыСрезПоследних
СГРУППИРОВАТЬ ПО
ОтработанныеЧасыСрезПоследних.Сотрудник
Используя этот подход, вы обеспечите чистоту данных и прозрачность процесса начисления выплат сотрудникам. Не забывайте тестировать поведение системы при переходе времени тренировок через полночь, так как стандартная разность дат может вернуть отрицательное значение или некорректный интервал.