Почему программно созданный Табель в 1С:ЗУП не виден при начислении зарплаты?

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

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

Главная причина: Период регистрации

Проанализируем наиболее распространенную ошибку, с которой столкнулся автор темы. В 1С:ЗУП 3.1 (и других конфигурациях на этой базе) реквизит ПериодРегистрации играет ключевую роль в механизме запросов при расчете зарплаты. Несмотря на то, что документ может быть датирован последним числом месяца (например, 31.05.2023), его период регистрации всегда должен быть первым числом этого месяца (01.05.2023).

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

Пример корректной установки дат при создании объекта:


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

Структура табличной части Данные

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

  1. Сотрудник и ФизическоеЛицо: Часто разработчики заполняют только Сотрудник. Однако расчетные регистры в ЗУП глубоко интегрированы с разрезом по физическим лицам. Обязательно дублируйте ФизическоеЛицо из справочника сотрудников.
  2. ВидВремени: Убедитесь, что вы используете правильные ссылки на справочник ВидыИспользованияРабочегоВремени. Обычная "Явка" (код Я) должна быть передана как объект ссылки.
  3. Дата: В ТЧ Данные каждая строка привязана к конкретному числу месяца. Если вы заполняете табель за месяц, у вас должно быть по одной строке (или более, если видов времени несколько) на каждый день месяца для каждого сотрудника.

Посмотрим на пример заполнения строки таблицы:


НоваяСтрока = НовыйТабель.Данные.Добавить();
НоваяСтрока.Сотрудник = СсылкаНаСотрудника;
НоваяСтрока.ФизическоеЛицо = СсылкаНаСотрудника.ФизическоеЛицо;
НоваяСтрока.Дата = ДатаКонкретногоДня; // Например, 01.05.2023
НоваяСтрока.ВидВремени = Справочники.ВидыИспользованияРабочегоВремени.Явка;
НоваяСтрока.Часы = 8;

Использование типовых методов заполнения

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

  1. Создаем объект документа.
  2. Вызываем метод ЗаполнитьДанныеПоВсемСотрудникам() (название может меняться в зависимости от версии, проверяйте модуль менеджера или объекта).
  3. После того как система заполнила таблицу по графику, проходим циклом по ТЧ Данные и меняем часы или виды времени там, где это необходимо.

Проанализируем ситуацию: если мы просто "нарисуем" строки, мы можем забыть про реквизиты СпособВводаДанных или специфические настройки подразделений. Типовое заполнение гарантирует, что документ будет "валидным" с точки зрения бизнес-логики конфигурации.

Регистры и проведение документа

Для того чтобы данные из табеля попали в расчет зарплаты, документ должен сделать движения по регистру накопления Данные табельного учета рабочего времени сотрудников. Если документ проведен, но движений нет, значит:

Проверить наличие движений можно непосредственно из формы документа через меню "Движения документа". Если регистр Данные табельного учета рабочего времени сотрудников пуст, расчет зарплаты не "увидит" ваши ручные (или программные) правки и возьмет норму из графика.

Взаимодействие с документами-отклонениями

При программном формировании табеля важно учитывать, что в системе уже могут быть проведены Больничные листы, Отпуска или Командировки. Если ваш код просто заполнит все дни "Явкой", возникнет конфликт вытеснения.

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

Резюме: чек-лист для разработчика

Чтобы программный Табель корректно работал, проверьте следующие пункты:

  1. ПериодРегистрации установлен на 1-е число месяца.
  2. Дата документа находится в пределах разумного (обычно конец месяца).
  3. Реквизит ФизическоеЛицо в табличной части заполнен.
  4. После заполнения вызван метод ЭтотОбъект.Записать(РежимЗаписиДокумента.Проведение);.
  5. В регистре накопления Данные табельного учета рабочего времени сотрудников появились соответствующие записи.
  6. В настройках расчета зарплаты не отключено использование табелей (хотя это редкий случай).

Соблюдение этих правил позволит вам избежать проблем с "невидимыми" данными и обеспечит корректный расчет заработной платы сотрудникам предприятия.

← На главную