В процессе автоматизации кадрового учета и расчета заработной платы часто возникает необходимость программного формирования документов. Одной из самых популярных задач является создание документа Табель. Однако разработчики часто сталкиваются с ситуацией: документ создан, заполнен, проведен, визуально не отличается от созданного вручную, но при формировании документа Начисление зарплаты и взносов система упорно игнорирует данные табеля, используя стандартный график сотрудника. Рассмотрим подробнее, почему это происходит и как правильно реализовать программное заполнение.
Проанализируем наиболее распространенную ошибку, с которой столкнулся автор темы. В 1С:ЗУП 3.1 (и других конфигурациях на этой базе) реквизит ПериодРегистрации играет ключевую роль в механизме запросов при расчете зарплаты. Несмотря на то, что документ может быть датирован последним числом месяца (например, 31.05.2023), его период регистрации всегда должен быть первым числом этого месяца (01.05.2023).
Разберем, почему это важно. Механизмы расчета зарплаты ищут данные в регистрах, опираясь на начало периода. Если программно установить в ПериодРегистрации дату 31.05.2023, то для системы этот табель будет относиться к "хвосту" месяца или вовсе выпадать из выборки, так как алгоритмы расчета ожидают увидеть запись, жестко привязанную к началу расчетного листка.
Пример корректной установки дат при создании объекта:
НовыйТабель = Документы.ТабельУчетаРабочегоВремени.СоздатьДокумент();
НовыйТабель.Дата = КонецМесяца(ТекущаяДата()); // Дата самого документа
НовыйТабель.ПериодРегистрации = НачалоМесяца(ТекущаяДата()); // Критически важная строка
НовыйТабель.Организация = Справочники.Организации.НайтиПоРеквизиту("ИНН", "1234567890");
// Далее заполнение остальных реквизитов...
В современных версиях ЗУП 3.1 вся информация о времени хранится в табличной части Данные. При программном заполнении недостаточно просто добавить строку с сотрудником и часами. Выясним, какие поля являются обязательными для того, чтобы документ стал "рабочим" для механизмов проведения.
Сотрудник. Однако расчетные регистры в ЗУП глубоко интегрированы с разрезом по физическим лицам. Обязательно дублируйте ФизическоеЛицо из справочника сотрудников.ВидыИспользованияРабочегоВремени. Обычная "Явка" (код Я) должна быть передана как объект ссылки.Данные каждая строка привязана к конкретному числу месяца. Если вы заполняете табель за месяц, у вас должно быть по одной строке (или более, если видов времени несколько) на каждый день месяца для каждого сотрудника.Посмотрим на пример заполнения строки таблицы:
НоваяСтрока = НовыйТабель.Данные.Добавить();
НоваяСтрока.Сотрудник = СсылкаНаСотрудника;
НоваяСтрока.ФизическоеЛицо = СсылкаНаСотрудника.ФизическоеЛицо;
НоваяСтрока.Дата = ДатаКонкретногоДня; // Например, 01.05.2023
НоваяСтрока.ВидВремени = Справочники.ВидыИспользованияРабочегоВремени.Явка;
НоваяСтрока.Часы = 8;
Вместо того чтобы вручную формировать каждую строку, рекомендуется использовать встроенный функционал документа. Это обезопасит вас от пропуска скрытых служебных реквизитов. Разберем алгоритм, который сочетает в себе автоматику и ручную корректировку:
ЗаполнитьДанныеПоВсемСотрудникам() (название может меняться в зависимости от версии, проверяйте модуль менеджера или объекта).Данные и меняем часы или виды времени там, где это необходимо.Проанализируем ситуацию: если мы просто "нарисуем" строки, мы можем забыть про реквизиты СпособВводаДанных или специфические настройки подразделений. Типовое заполнение гарантирует, что документ будет "валидным" с точки зрения бизнес-логики конфигурации.
Для того чтобы данные из табеля попали в расчет зарплаты, документ должен сделать движения по регистру накопления Данные табельного учета рабочего времени сотрудников. Если документ проведен, но движений нет, значит:
Табель имеет наивысший приоритет.Проверить наличие движений можно непосредственно из формы документа через меню "Движения документа". Если регистр Данные табельного учета рабочего времени сотрудников пуст, расчет зарплаты не "увидит" ваши ручные (или программные) правки и возьмет норму из графика.
При программном формировании табеля важно учитывать, что в системе уже могут быть проведены Больничные листы, Отпуска или Командировки. Если ваш код просто заполнит все дни "Явкой", возникнет конфликт вытеснения.
Рекомендуем перед финальной записью документа проверять, не перекрывают ли ваши данные периоды отсутствия сотрудников. Если используется типовой метод заполнения, система сама учтет отклонения. Если же вы заполняете таблицу полностью вручную, вам придется самостоятельно реализовать запросы к регистрам состояний сотрудников, чтобы не проставить рабочие часы в день болезни.
Чтобы программный Табель корректно работал, проверьте следующие пункты:
ПериодРегистрации установлен на 1-е число месяца.Дата документа находится в пределах разумного (обычно конец месяца).ФизическоеЛицо в табличной части заполнен.ЭтотОбъект.Записать(РежимЗаписиДокумента.Проведение);.Данные табельного учета рабочего времени сотрудников появились соответствующие записи.Соблюдение этих правил позволит вам избежать проблем с "невидимыми" данными и обеспечит корректный расчет заработной платы сотрудникам предприятия.