Как автоматизировать запись отработанных часов сотрудников из документа «Расписание занятий» в регистр сведений?

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

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

Выбор архитектуры хранения данных

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

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

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

Самый простой и надежный способ — выполнять запись в процедуре ОбработкаПроведения модуля объекта. Давайте разберем, как это сделать программно:

  1. Определите длительность тренировки, вычисляя разность между ВремяОкончания и ВремяНачала.
  2. Используйте метод РазностьДат или просто вычитайте даты друг из друга, получая значение в секундах.
  3. Разделите полученное количество секунд на 3600, чтобы перевести результат в часы.

Пример программного расчета и записи данных:


// В модуле объекта документа
Процедура ОбработкаПроведения(Отказ, Режим)
    
    // Очищаем движения, если регистр подчинен регистратору
    Движения.ОтработанныеЧасы.Записывать = Истина;
    Движения.ОтработанныеЧасы.Очистить();
    
    Для Каждого СтрокаТЧ Из РасписаниеЗанятий Цикл
        Движение = Движения.ОтработанныеЧасы.Добавить();
        Движение.Период = Дата;
        Движение.Сотрудник = СтрокаТЧ.Сотрудник;
        
        РазницаВСекундах = СтрокаТЧ.ВремяОкончания - СтрокаТЧ.ВремяНачала;
        Движение.КоличествоЧасов = РазницаВСекундах / 3600;
    КонецЦикла;

КонецПроцедуры

Оптимизация работы с данными

Чтобы система работала быстро и без ошибок, придерживайтесь следующих правил:

Анализ данных для расчета зарплаты

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


ВЫБРАТЬ
    ОтработанныеЧасыСрезПоследних.Сотрудник,
    СУММА(ОтработанныеЧасыСрезПоследних.КоличествоЧасов) КАК ВсегоЧасов
ИЗ
    РегистрСведений.ОтработанныеЧасы.СрезПоследних(&Период, ) КАК ОтработанныеЧасыСрезПоследних
СГРУППИРОВАТЬ ПО
    ОтработанныеЧасыСрезПоследних.Сотрудник

Используя этот подход, вы обеспечите чистоту данных и прозрачность процесса начисления выплат сотрудникам. Не забывайте тестировать поведение системы при переходе времени тренировок через полночь, так как стандартная разность дат может вернуть отрицательное значение или некорректный интервал.

← На главную