Разработка подсистемы расчета зарплаты — это одна из самых сложных и в то же время интересных задач для разработчика 1С. В отличие от обычного товарного или денежного учета, здесь вступают в силу механизмы, завязанные на времени, графиках работы и сложных зависимостях одних расчетов от других. В этой статье мы разберем, с чего начать создание такой системы, какие объекты платформы 1С:Предприятие нам понадобятся и какую методологию лучше выбрать.
Прежде чем приступать к написанию кода, давайте разберем, чем расчет зарплаты отличается от записи обычного расхода. Ключевое отличие — это наличие периода действия. Если мы платим сотруднику оклад, мы платим его не «просто так», а за то, что он работал в определенный интервал времени (например, с 1 по 30 число месяца). Если в этот период он заболел, мы должны «вытеснить» часть оклада больничным. Именно этот механизм автоматического вытеснения и составляет основу «движка» зарплаты в 1С.
Рассмотрим два основных подхода к архитектуре системы:
Первым делом нам необходимо создать объект ПланВидовРасчета. Это справочник, в котором будут храниться все наши начисления (Оклад, Премия, Больничный) и удержания (НДФЛ, Штрафы). При настройке этого объекта крайне важно обратить внимание на следующие вкладки:
Вкладка «Расчет»: Здесь мы указываем, будет ли данный вид расчета использовать период действия. Для «Оклада» это обязательно, а для «Разовой премии» — нет.
Вкладка «Использование»: Здесь настраивается зависимость по базе. Например, если «Премия» составляет 10% от «Оклада», то «Оклад» должен быть указан как базовый вид расчета для «Премии».
Вкладка «Вытеснение»: Это самое важное. Для «Оклада» в список вытесняющих видов расчета мы добавим «Больничный» и «Отпуск». Это заставит систему автоматически уменьшать фактическое время работы по окладу при вводе больничного листа.
Если ПланВидовРасчета — это описание «правил игры», то РегистрРасчета — это место, где эти правила исполняются. Нам понадобятся два основных регистра:
Для регистра основных начислений обязательно установите свойство Период действия в значение «Истина» и свяжите его с графиком работы (обычно это справочник «ГрафикиРаботы» или аналогичный). Это позволит использовать системную функцию ПолучитьДанныеГрафика.
Проанализируем процесс расчета. Нам нужно не просто записать сумму, а вычислить её на основе отработанных дней. Разберем типичный алгоритм расчета оклада по дням. Сначала нам нужно получить данные о том, сколько дней сотрудник должен был отработать по норме и сколько он отработал фактически.
Рассмотрим пример кода в модуле документа или обработки расчета:
// Создаем набор записей регистра расчета
НаборЗаписей = РегистрыРасчета.ОсновныеНачисления.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(Ссылка);
НаборЗаписей.Прочитать();
// Вызываем механизм расчета для каждой строки
Для Каждого Запись Из НаборЗаписей Цикл
Если Запись.ВидРасчета = ПланыВидовРасчета.Начисления.Оклад Тогда
// Получаем данные графика: фактический период с учетом вытеснения
ДанныеГрафика = РегистрыРасчета.ОсновныеНачисления.ПолучитьДанныеГрафика(
Запись.НомерСтроки,
"ЗначениеФактическое, ЗначениеПериодДействия"
);
ФактическиОтработано = ДанныеГрафика.ЗначениеФактическое;
НормаВремени = ДанныеГрафика.ЗначениеПериодДействия;
Если НормаВремени > 0 Тогда
Запись.Результат = (Запись.Размер / НормаВремени) * ФактическиОтработано;
КонецЕсли;
КонецЕсли;
КонецЦикла;
НаборЗаписей.Записать(Истина);
В этом примере ЗначениеПериодДействия вернет нам количество дней по графику за весь месяц (норму), а ЗначениеФактическое — только те дни, которые остались после того, как платформа вычла из периода оклада все пересекающиеся периоды больничных или отпусков.
Когда мы рассчитываем премию или налог, нам нужно знать «базу». Платформа 1С предоставляет для этого мощный инструмент — метод ПолучитьБазу(). Давайте проанализируем, как это работает на примере расчета квартальной премии, которая зависит от начисленного оклада за предыдущие три месяца.
Для этого в запросе или через объектную модель мы обращаемся к виртуальной таблице БазаОсновныеНачисления. Важно правильно настроить Период регистрации (когда мы считаем) и Период действия (за какое время мы собираем базу).
Если вы чувствуете, что разработка идет тяжело, проанализируем доступные учебные материалы и готовые конфигурации:
Не пытайтесь сразу написать полноценный ЗУП. Современная зарплата — это не только начисления, но и сложнейшая отчетность (НДФЛ, страховые взносы, ЕФС-1). Если ваша задача — просто считать управленческую зарплату, сосредоточьтесь на регистрах расчета и механизме вытеснения. Налоги и отчетность лучше оставить типовым решениям или реализовывать в последнюю очередь.
Используйте механизм перерасчетов. В зарплате часто бывает так: мы начислили зарплату за март, а в апреле узнали, что сотрудник болел в конце марта. Платформа 1С умеет фиксировать такие коллизии в специальных таблицах перерасчетов. Обязательно изучите этот функционал, иначе ваша система «захлебнется» при первой же необходимости внести правки в прошлый период.
Подводя итог, можно сказать: разработка зарплаты с нуля — это отличный способ прокачать свои навыки владения платформой 1С:Предприятие. Главное — четко разделять методику (как мы считаем) и технику (как это реализовано в коде).