В типовой конфигурации «Зарплата и управление персоналом 3.1» автоматизация заполнения табеля является частой задачей, особенно когда данные о посещаемости сотрудников поступают из внешних систем контроля управления доступом (СКУД) или других производственных баз. В этой статье мы подробно разберем, как реализовать программное создание и заполнение этого документа, используя как стандартные механизмы конфигурации, так и прямое управление данными в табличных частях.
Прежде всего, нам необходимо проанализировать внутреннюю архитектуру документа ТабельУчетаРабочегоВремени. В отличие от многих других документов, табель имеет достаточно сложную структуру табличной части ДанныеОВремени. Она не содержит простого списка дат; вместо этого данные распределены по колонкам для каждого дня месяца.
Разберем основные подходы к решению задачи:
Как справедливо отмечено в обсуждении на форуме, в модуле менеджера документа ТабельУчетаРабочегоВремени существует ключевая функция ТаблицаДанныхДляЗаполнения. Рассмотрим подробнее, как ее применить. Данная функция возвращает таблицу значений с уже рассчитанными данными о времени на основании графиков работы и отклонений, зарегистрированных в системе.
Проанализируем пример кода для инициализации и заполнения документа с помощью стандартных механизмов:
// Создаем новый документ
НовыйТабель = Документы.ТабельУчетаРабочегоВремени.СоздатьДокумент();
НовыйТабель.Дата = ТекущаяДата();
НовыйТабель.Организация = Справочники.Организации.НайтиПоНаименованию("Наша Организация");
НовыйТабель.ПериодРегистрации = НачалоМесяца(Объект.Дата);
НовыйТабель.Месяц = НачалоМесяца(Объект.Дата);
НовыйТабель.СпособВводаДанных = Перечисления.СпособыВводаДанныхОВремени.ПоДням;
// Подготовка параметров для заполнения
ПараметрыЗаполнения = Новый Структура;
ПараметрыЗаполнения.Вставить("Организация", НовыйТабель.Организация);
ПараметрыЗаполнения.Вставить("Месяц", НовыйТабель.Месяц);
ПараметрыЗаполнения.Вставить("Подразделение", НовыйТабель.Подразделение);
ПараметрыЗаполнения.Вставить("ДокрасчитатьТабель", Ложь);
// Вызываем функцию модуля менеджера для получения данных
ДанныеДляЗаполнения = Документы.ТабельУчетаРабочегоВремени.ТаблицаДанныхДляЗаполнения(ПараметрыЗаполнения);
// Загружаем полученные данные в табличную часть
НовыйТабель.ДанныеОВремени.Загрузить(ДанныеДляЗаполнения);
НовыйТабель.Записать(РежимЗаписиДокумента.Запись);
Этот метод хорош тем, что он автоматически учитывает индивидуальные графики, больничные листы, отпуска и другие документы-отклонения, которые уже проведены в системе. Для последующей сверки и контроля плановых и фактических данных можно использовать отчет по учету отработанного времени сотрудников.
Если ваша задача — заполнить табель специфическими часами из внешней системы, мы должны работать с колонками табличной части напрямую. Выясним структуру хранения данных: в табличной части ДанныеОВремени для каждого дня месяца предусмотрены две колонки:
П1, П2, ... П31 — колонки для хранения Вида времени (например, «Явка» или «Ночные»). Тип данных: СправочникСсылка.ВидыИспользованияРабочегоВремени.В1, В2, ... В31 — колонки для хранения Количества часов. Тип данных: Число.Посмотрим на пример алгоритма, который обходит дни месяца и заполняет значения динамически:
Для Каждого СтрокаТЗ Из ВашаТаблицаСДанными Цикл
НоваяСтрока = ТабельОбъект.ДанныеОВремени.Добавить();
НоваяСтрока.Сотрудник = СтрокаТЗ.Сотрудник;
// Перебираем дни месяца (например, для 31 дня)
Для День = 1 По 31 Цикл
ИмяКолонкиВид = "П" + Строка(День);
ИмяКолонкиЧасы = "В" + Строка(День);
// Проверяем наличие колонки в табличной части (на случай месяцев с 28/30 днями)
Если ТабельОбъект.ДанныеОВремени.ВыгрузитьКолонки().Найти(ИмяКолонкиВид) <> Неопределено Тогда
НоваяСтрока[ИмяКолонкиВид] = Справочники.ВидыИспользованияРабочегоВремени.Явка;
НоваяСтрока[ИмяКолонкиЧасы] = 8; // Условно 8 часов
КонецЕсли;
КонецЦикла;
КонецЦикла;
Проанализируем ситуацию, когда учет ведется не по дням, а сводно. В этом случае в реквизите СпособВводаДанных устанавливается значение Перечисления.СпособыВводаДанныхОВремени.Сводно. При таком режиме детальные колонки по дням (П1-П31) игнорируются при расчете зарплаты, а система ориентируется на агрегированные показатели. Однако программное заполнение чаще всего требуется именно для детального режима («По дням»), так как он обеспечивает максимальную точность расчета.
При реализации автоматизации важно помнить о следующих моментах:
Таким образом, мы выяснили, что для корректного программного заполнения табеля в ЗУП 3.1 лучше всего комбинировать вызов функции ТаблицаДанныхДляЗаполнения из модуля менеджера для получения «каркаса» данных и последующую корректировку колонок П[День] и В[День] для внесения специфических изменений. Для удобства визуального контроля и проверки результатов в документе подойдёт расширение для цветового выделения видов рабочего времени.