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