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