При переходе на программу 1С:Зарплата и управление персоналом 3.1 (ЗУП) пользователи и разработчики часто сталкиваются с жесткими методологическими ограничениями, которых не было в старых версиях (например, в 1С:Предприятии 7.7). Одно из таких ограничений — невозможность «из коробки» настроить формулу начисления, которая автоматически рассчитывала бы базу за произвольный период внутри одного месяца (например, только с 1 по 20 число), если сотрудник отработал месяц целиком.
В этой статье мы подробно разберем, почему в системе расчета ЗУП 3.1 действует такое ограничение, проанализируем его причины с точки зрения законодательства и рассмотрим четыре практических способа решения этой задачи: от программирования до чисто пользовательских настроек.
Давайте выясним причину такого поведения программы. Архитектура 1С:ЗУП 3.1 изначально проектировалась с жесткой привязкой к месячным интервалам регистрации доходов. Это обусловлено требованиями Налогового кодекса РФ (НК РФ). Согласно законодательству, датой фактического получения дохода в виде оплаты труда считается последний день месяца, за который она была начислена.
Именно поэтому стандартный механизм получения расчетной базы (показатель РасчетнаяБаза) работает исключительно в рамках полных календарных месяцев. Если мы попытаемся привязать разовое начисление к произвольному периоду внутри месяца, система заблокирует эту попытку и вернет расчет к пределам регламентированного месяца. Дохода за период, например, с 1 по 20 число месяца, с точки зрения методологии учета просто не существует — весь доход регистрируется концом месяца.
Тем не менее на практике регулярно возникают задачи, когда необходимо выплатить проектную премию, бонус за KPI или рассчитать долю оклада за определенный интервал дней. Рассмотрим, как мы можем решить эту задачу.
Если перед вами стоит задача реализовать расчет на уровне программного кода (в рамках внешней обработки, расширения или доработки конфигурации), стандартные виртуальные таблицы расчета вам не помогут. Нам придется использовать запросы к физическим таблицам и механизмы пропорционального распределения.
Проанализируем шаги, которые необходимо выполнить разработчику:
БазаНачисления мы пишем прямой запрос к физической таблице регистра расчета РегистрРасчета.Начисления или к регистру накопления РегистрНакопления.НачисленияУдержанияПоСотрудникам.Рассмотрим пример построения такого запроса к физической таблице начислений:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Начисления.Сотрудник КАК Сотрудник,
| Начисления.Начисление КАК Начисление,
| Начисления.Результат КАК Результат,
| Начисления.ПериодДействияНачало КАК ПериодДействияНачало,
| Начисления.ПериодДействияКонец КАК ПериодДействияКонец
|ИЗ
| РегистрРасчета.Начисления КАК Начисления
|ГДЕ
| Начисления.Сотрудник = &Сотрудник
| И Начисления.ПериодДействияНачало >= &НачалоПериода
| И Начисления.ПериодДействияКонец <= &КонецПериода";
Запрос.УстановитьПараметр("Сотрудник", ВыбранныйСотрудник);
Запрос.УстановитьПараметр("НачалоПериода", НачалоМесяца(ДатаНачала));
Запрос.УстановитьПараметр("КонецПериода", КонецМесяца(ДатаОкончания));
При программной реализации важно учитывать важный нюанс работы механизмов ЗУП 3.1: если вы запрашиваете данные за неполный месяц, стандартные функции расчета НДФЛ и страховых взносов могут отработать некорректно. Чтобы обойти это ограничение, в параметрах получения данных в качестве начала периода для расчета (МесяцДатаНачала) всегда передавайте строго начало месяца с помощью функции НачалоМесяца(ДатаНачала), а дату окончания периода разрешайте передавать произвольным числом. Это обеспечит корректный сбор базы.
Для нарезки произвольных временных интервалов и их последующего сопоставления с кадровыми данными сотрудников мы рекомендуем использовать встроенную программную процедуру:
ЗарплатаКадрыОбщиеНаборыДанных.СоздатьВТПериоды()
Если вы не хотите вносить изменения в конфигурацию и использовать программирование, наиболее чистым и методологически верным способом является использование механизма «Данных для расчета зарплаты».
Разберем этот процесс по шагам:
БазаЗаПроизвольныйПериод или ДоляВремениЗаПериод). Настроим его так, чтобы он вводился только в месяце расчета непосредственно перед расчетом зарплаты.РасчетнаяБаза укажем созданный нами показатель БазаЗаПроизвольныйПериод.Этот способ полностью безопасен при обновлениях конфигурации и исключает ошибки в расчете налогов и взносов.
Рассмотрим довольно креативный «обходной путь», который позволяет заставить стандартный расчетный механизм ЗУП временно уменьшить базу сотрудника без ручного счета в Excel.
Если нам нужно рассчитать базу только за период с 01.04 по 20.04, мы можем искусственно «вырезать» оставшиеся дни месяца из графика сотрудника:
Важное предупреждение: Данный метод требует очень высокой квалификации расчетчика. Использование фиктивных документов-отклонений может запутать учет рабочего времени и привести к ошибкам в регламентированной отчетности, поэтому применять его следует с особой осторожностью.
Если подобные задачи в вашей организации возникают регулярно, оптимальным решением станет использование механизмов расширения конфигурации 1С. В сообществе разработчиков 1С существует множество готовых решений, которые добавляют на форму документов «Премия» или «Регистрация разовых начислений» дополнительные сервисные кнопки (например, «Рассчитать пропорционально времени за период»).
При использовании такого расширения:
Таким образом, мы сохраняем типовую конфигурацию на поддержке, а конечные пользователи получают удобный и автоматизированный инструмент для ежедневной работы.