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

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

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

Зачем нужен самописный табель, если есть типовой?

Проанализируем основные причины, по которым разработчики прибегают к созданию собственных объектов учета времени:

  1. Управленческий учет: Необходимость фиксировать фактическую явку сотрудников (например, «Явка» вместо официальной «Командировки» или «Болезни») для внутреннего расчета мотивации.
  2. Специфические формы печати: Требование выводить данные в формате Т-12, где все дни месяца (1–31) расположены в одну строку, что сложно реализуемо в рамках стандартного макета Т-13.
  3. Упрощение ввода: Типовой табель создается в разрезе подразделений. Если в компании много мелких отделов, расчетчику удобнее работать с одним сводным документом.
  4. Параллельный учет переработок: Фиксация сверхурочных часов, которые учитываются по иным правилам, чем предусмотрено законодательством.

Архитектура самописного документа

Для реализации задачи нам потребуется создать новый документ (назовем его упрТабельУчетаРабочегоВремени). Структура табличной части (ТЧ) должна позволять хранить данные в разрезе сотрудников и дней месяца. Рассмотрим оптимальный вариант структуры ТЧ:

Программное заполнение данными графиков

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

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

Рассмотрим пример кода для получения «идеального» графика сотрудника за месяц:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	ДанныеГрафиковРаботы.Дата КАК Дата,
    |	ДанныеГрафиковРаботы.Сотрудник КАК Сотрудник,
    |	ДанныеГрафиковРаботы.ВидВремени КАК ВидВремени,
    |	ДанныеГрафиковРаботы.ОсновноеЗначение КАК Часы
    |ИЗ
    |	РегистрСведений.ДанныеГрафиковРаботы КАК ДанныеГрафиковРаботы
    |ГДЕ
    |	ДанныеГрафиковРаботы.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
    |	И ДанныеГрафиковРаботы.Сотрудник В (&МассивСотрудников)";

Запрос.УстановитьПараметр("ДатаНачала", НачалоМесяца(Объект.ПериодРегистрации));
Запрос.УстановитьПараметр("ДатаОкончания", КонецМесяца(Объект.ПериодРегистрации));
Запрос.УстановитьПараметр("МассивСотрудников", СписокСотрудников);

РезультатЗапроса = Запрос.Выполнить();

Выясним причину, почему стоит использовать именно этот регистр: поле ГрафикРаботающий в нем автоматически подтягивает либо основной график сотрудника, либо его индивидуальный график (если он введен), что избавляет нас от сложной логики проверки приоритетов документов.

Учет отклонений (фактическое время)

Если самописный табель должен не просто копировать график, а показывать фактическую картину, нам нужно наложить на данные графиков документы-отклонения (больничные, отпуска, прогулы). В типовом механизме ЗУП это реализовано через вытеснение видов расчета, но для самописного документа мы можем использовать программный интерфейс.

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

Реализация строчного табеля (Т-12)

Если стоит задача сделать интерфейс, где дни с 1 по 31 идут в одну строку, алгоритм заполнения усложняется. Выясним, как лучше это реализовать:

  1. Создадим в табличной части документа 31 группу колонок (или одну строку с динамическим заполнением).
  2. После получения данных запросом из регистра ДанныеГрафиковРаботы, выполним обход выборки.
  3. Для каждого сотрудника определим день месяца через функцию День(Выборка.Дата) и запишем значение в соответствующий реквизит ТЧ (например, Объект.Состав[Индекс].День1 = 8).

Важно помнить: при заполнении на большое количество сотрудников (более 100 человек) необходимо избегать запросов внутри цикла. Сначала выгружаем все данные в ТаблицуЗначений, индексируем её по колонке Сотрудник и затем быстро распределяем данные по строкам документа.

Особенности управленческого учета

Как отмечалось в обсуждении на форуме, часто самописный табель нужен для того, чтобы «подменить» реальные данные. Например, сотрудник фактически работал, но официально находится в отпуске за свой счет. В этом случае в самописном документе программисту необходимо предусмотреть механизм ручного редактирования. Сначала документ заполняется автоматически «по графику», а затем пользователь вручную вносит правки. Главное преимущество такого подхода — экономия времени на первичный ввод данных.

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

Резюме

Создание самописного табеля в 1С:ЗУП 3.1 — задача трудоемкая, но решаемая. Основные шаги:

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

← На главную