Как программно заполнить документ «Табель учета рабочего времени» в 1С:ЗУП 3.1

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

В типовой конфигурации «Зарплата и управление персоналом 3.1» автоматизация заполнения табеля является частой задачей, особенно когда данные о посещаемости сотрудников поступают из внешних систем контроля управления доступом (СКУД) или других производственных баз. В этой статье мы подробно разберем, как реализовать программное создание и заполнение этого документа, используя как стандартные механизмы конфигурации, так и прямое управление данными в табличных частях.

Анализ механизмов заполнения документа

Прежде всего, нам необходимо проанализировать внутреннюю архитектуру документа ТабельУчетаРабочегоВремени. В отличие от многих других документов, табель имеет достаточно сложную структуру табличной части ДанныеОВремени. Она не содержит простого списка дат; вместо этого данные распределены по колонкам для каждого дня месяца.

Разберем основные подходы к решению задачи:

  1. Использование экспортных процедур модуля менеджера — это наиболее корректный путь, так как он позволяет использовать логику, заложенную разработчиками 1С.
  2. Прямое заполнение табличной части — используется в случаях, когда нужно загрузить специфические данные, которые не могут быть вычислены системой автоматически (например, при импорте из файла).

Использование функции «ТаблицаДанныхДляЗаполнения»

Как справедливо отмечено в обсуждении на форуме, в модуле менеджера документа ТабельУчетаРабочегоВремени существует ключевая функция ТаблицаДанныхДляЗаполнения. Рассмотрим подробнее, как ее применить. Данная функция возвращает таблицу значений с уже рассчитанными данными о времени на основании графиков работы и отклонений, зарегистрированных в системе.

Проанализируем пример кода для инициализации и заполнения документа с помощью стандартных механизмов:


// Создаем новый документ
НовыйТабель = Документы.ТабельУчетаРабочегоВремени.СоздатьДокумент();
НовыйТабель.Дата = ТекущаяДата();
НовыйТабель.Организация = Справочники.Организации.НайтиПоНаименованию("Наша Организация");
НовыйТабель.ПериодРегистрации = НачалоМесяца(Объект.Дата);
НовыйТабель.Месяц = НачалоМесяца(Объект.Дата);
НовыйТабель.СпособВводаДанных = Перечисления.СпособыВводаДанныхОВремени.ПоДням;

// Подготовка параметров для заполнения
ПараметрыЗаполнения = Новый Структура;
ПараметрыЗаполнения.Вставить("Организация", НовыйТабель.Организация);
ПараметрыЗаполнения.Вставить("Месяц", НовыйТабель.Месяц);
ПараметрыЗаполнения.Вставить("Подразделение", НовыйТабель.Подразделение);
ПараметрыЗаполнения.Вставить("ДокрасчитатьТабель", Ложь);

// Вызываем функцию модуля менеджера для получения данных
ДанныеДляЗаполнения = Документы.ТабельУчетаРабочегоВремени.ТаблицаДанныхДляЗаполнения(ПараметрыЗаполнения);

// Загружаем полученные данные в табличную часть
НовыйТабель.ДанныеОВремени.Загрузить(ДанныеДляЗаполнения);
НовыйТабель.Записать(РежимЗаписиДокумента.Запись);

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

Прямое управление данными табличной части

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

Посмотрим на пример алгоритма, который обходит дни месяца и заполняет значения динамически:


Для Каждого СтрокаТЗ Из ВашаТаблицаСДанными Цикл
    НоваяСтрока = ТабельОбъект.ДанныеОВремени.Добавить();
    НоваяСтрока.Сотрудник = СтрокаТЗ.Сотрудник;
    
    // Перебираем дни месяца (например, для 31 дня)
    Для День = 1 По 31 Цикл
        ИмяКолонкиВид = "П" + Строка(День);
        ИмяКолонкиЧасы = "В" + Строка(День);
        
        // Проверяем наличие колонки в табличной части (на случай месяцев с 28/30 днями)
        Если ТабельОбъект.ДанныеОВремени.ВыгрузитьКолонки().Найти(ИмяКолонкиВид) <> Неопределено Тогда
            НоваяСтрока[ИмяКолонкиВид] = Справочники.ВидыИспользованияРабочегоВремени.Явка;
            НоваяСтрока[ИмяКолонкиЧасы] = 8; // Условно 8 часов
        КонецЕсли;
    КонецЦикла;
КонецЦикла;

Особенности режима «Сводно за период»

Проанализируем ситуацию, когда учет ведется не по дням, а сводно. В этом случае в реквизите СпособВводаДанных устанавливается значение Перечисления.СпособыВводаДанныхОВремени.Сводно. При таком режиме детальные колонки по дням (П1-П31) игнорируются при расчете зарплаты, а система ориентируется на агрегированные показатели. Однако программное заполнение чаще всего требуется именно для детального режима («По дням»), так как он обеспечивает максимальную точность расчета.

Важные технические нюансы

При реализации автоматизации важно помнить о следующих моментах:

  1. Несколько видов времени в один день: Если у сотрудника в один и тот же день есть и явка, и, например, работа в ночное время, в табеле это может отражаться либо одной строкой с заполнением соответствующих доп. реквизитов (если это предусмотрено настройками состава видов времени), либо несколькими строками.
  2. Проверка графиков: Программное заполнение должно выполняться с осторожностью, так как при ручном вмешательстве в ТЧ табеля вы можете случайно перезаписать данные, которые система считает «отклонениями».
  3. Подразделения: Если в документе указано конкретное подразделение, убедитесь, что при заполнении вы фильтруете сотрудников именно по этому подразделению, иначе документ может не пройти логические проверки конфигурации.

Таким образом, мы выяснили, что для корректного программного заполнения табеля в ЗУП 3.1 лучше всего комбинировать вызов функции ТаблицаДанныхДляЗаполнения из модуля менеджера для получения «каркаса» данных и последующую корректировку колонок П[День] и В[День] для внесения специфических изменений. Для удобства визуального контроля и проверки результатов в документе подойдёт расширение для цветового выделения видов рабочего времени.

← На главную