Как получить доход или расчетную базу за произвольный период в 1С:ЗУП 3.1?

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

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

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

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

Давайте выясним причину такого поведения программы. Архитектура 1С:ЗУП 3.1 изначально проектировалась с жесткой привязкой к месячным интервалам регистрации доходов. Это обусловлено требованиями Налогового кодекса РФ (НК РФ). Согласно законодательству, датой фактического получения дохода в виде оплаты труда считается последний день месяца, за который она была начислена.

Именно поэтому стандартный механизм получения расчетной базы (показатель РасчетнаяБаза) работает исключительно в рамках полных календарных месяцев. Если мы попытаемся привязать разовое начисление к произвольному периоду внутри месяца, система заблокирует эту попытку и вернет расчет к пределам регламентированного месяца. Дохода за период, например, с 1 по 20 число месяца, с точки зрения методологии учета просто не существует — весь доход регистрируется концом месяца.

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

Способ 1. Программный подход (для разработчиков)

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

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

  1. Запрос к физическим таблицам: Вместо виртуальной таблицы БазаНачисления мы пишем прямой запрос к физической таблице регистра расчета РегистрРасчета.Начисления или к регистру накопления РегистрНакопления.НачисленияУдержанияПоСотрудникам.
  2. Программный расчет пропорции: Если сотрудник отработал весь месяц, а нам нужен только его кусок (например, с 01.04 по 20.04), мы получаем общую сумму начисления за месяц, делим её на количество рабочих дней (или часов) по графику сотрудника за весь месяц и умножаем на количество фактически отработанных дней (часов), пришедшихся на наш произвольный интервал.

Рассмотрим пример построения такого запроса к физической таблице начислений:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	Начисления.Сотрудник КАК Сотрудник,
    |	Начисления.Начисление КАК Начисление,
    |	Начисления.Результат КАК Результат,
    |	Начисления.ПериодДействияНачало КАК ПериодДействияНачало,
    |	Начисления.ПериодДействияКонец КАК ПериодДействияКонец
    |ИЗ
    |	РегистрРасчета.Начисления КАК Начисления
    |ГДЕ
    |	Начисления.Сотрудник = &Сотрудник
    |	И Начисления.ПериодДействияНачало >= &НачалоПериода
    |	И Начисления.ПериодДействияКонец <= &КонецПериода";

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

При программной реализации важно учитывать важный нюанс работы механизмов ЗУП 3.1: если вы запрашиваете данные за неполный месяц, стандартные функции расчета НДФЛ и страховых взносов могут отработать некорректно. Чтобы обойти это ограничение, в параметрах получения данных в качестве начала периода для расчета (МесяцДатаНачала) всегда передавайте строго начало месяца с помощью функции НачалоМесяца(ДатаНачала), а дату окончания периода разрешайте передавать произвольным числом. Это обеспечит корректный сбор базы.

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

ЗарплатаКадрыОбщиеНаборыДанных.СоздатьВТПериоды()

Способ 2. Пользовательский подход: Ввод показателей (без программирования)

Если вы не хотите вносить изменения в конфигурацию и использовать программирование, наиболее чистым и методологически верным способом является использование механизма «Данных для расчета зарплаты».

Разберем этот процесс по шагам:

  1. Перейдем в меню Настройки — Показатели расчета зарплаты и создадим новый показатель (например, БазаЗаПроизвольныйПериод или ДоляВремениЗаПериод). Настроим его так, чтобы он вводился только в месяце расчета непосредственно перед расчетом зарплаты.
  2. Создадим шаблон документа в меню Настройки — Шаблоны документов ввода данных для расчета зарплаты, в который добавим наш новый показатель.
  3. Рассчитаем сумму дохода за произвольный период во внешнем файле (например, в Excel) на основе данных стандартных отчетов ЗУП («Табель» или «Анализ зарплаты»).
  4. Загрузим полученные значения из Excel в документ «Данные для расчета зарплаты» (или внесем их вручную).
  5. В формуле нашего начисления вместо стандартного показателя РасчетнаяБаза укажем созданный нами показатель БазаЗаПроизвольныйПериод.

Этот способ полностью безопасен при обновлениях конфигурации и исключает ошибки в расчете налогов и взносов.

Способ 3. Обходной путь через документы-отклонения

Рассмотрим довольно креативный «обходной путь», который позволяет заставить стандартный расчетный механизм ЗУП временно уменьшить базу сотрудника без ручного счета в Excel.

Если нам нужно рассчитать базу только за период с 01.04 по 20.04, мы можем искусственно «вырезать» оставшиеся дни месяца из графика сотрудника:

  1. Введем на период с 21.04 по 30.04 временный документ-отклонение. Это может быть Отпуск без сохранения оплаты, Простой по вине работодателя или Отсутствие по невыясненным причинам.
  2. После проведения этого документа откроем документ Начисление зарплаты и взносов. Программа автоматически пересчитает оклад сотрудника пропорционально только за фактически отработанное время с 01.04 по 20.04.
  3. Наше зависимое начисление (например, премия процентом от оклада) возьмет в качестве расчетной базы именно эту уменьшенную сумму.
  4. После того как расчет зафиксирован и документ начисления зарплаты проведен, мы можем распровести или удалить наш «виртуальный» документ-отклонение (если в реальности сотрудник работал эти дни), чтобы вернуть оклад сотрудника в норму. Оставшуюся часть оклада за конец месяца в таком случае доначисляют отдельным документом или ручной корректировкой.

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

Способ 4. Использование готовых расширений

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

При использовании такого расширения:

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

← На главную