Как получить данные о зарплате (отпускные, больничные, удержания, выплаты) программно в 1С:ЗУП 3.1

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

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

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

Основные регистры для получения данных

Для решения задачи нам не достаточно одного источника, так как информация о начисленных суммах и факте их выплаты хранится в разных физических таблицах. Рассмотрим основные регистры накопления, которые нам понадобятся:

  1. Начисления и удержания по сотрудникам: Это базовый регистр для получения данных о том, что было начислено или удержано. Он является основой для отчетов «Свод» и «Расчетный листок».
  2. Взаиморасчеты с сотрудниками: Здесь фиксируется состояние задолженности предприятия перед сотрудником. Именно отсюда корректнее всего брать данные о выплатах (расход по регистру).
  3. Зарплата к выплате: Этот регистр детализирует суммы к выплате в разрезе документов-оснований (например, конкретного приказа на отпуск).
  4. Учет доходов для исчисления НДФЛ: Необходим, если под «выплаченным доходом» понимается налоговая база сотрудника.

Разбор начислений: как отделить отпускные от больничных

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

Проанализируем пример запроса к регистру накопления НачисленияУдержанияПоСотрудникам. Мы будем использовать конструкцию ВЫБОР КОГДА, чтобы распределить данные по нужным нам столбцам в одном результате запроса:


ВЫБРАТЬ
    Данные.Сотрудник КАК Сотрудник,
    Данные.ПериодРегистрации КАК Период,
    СУММА(ВЫБОР
            КОГДА Данные.ВидРасчета.КатегорияНачисления = ЗНАЧЕНИЕ(Перечисление.КатегорииНачисленийИУдержаний.Отпуск)
                ТОГДА Данные.Результат
            ИНАЧЕ 0
        КОНЕЦ) КАК Отпускные,
    СУММА(ВЫБОР
            КОГДА Данные.ВидРасчета.КатегорияНачисления = ЗНАЧЕНИЕ(Перечисление.КатегорииНачисленийИУдержаний.ПособиеПоВременнойНетрудоспособности)
                ТОГДА Данные.Результат
            ИНАЧЕ 0
        КОНЕЦ) КАК Пособие,
    СУММА(ВЫБОР
            КОГДА Данные.ГруппаНачисленияУдержанияВыплаты = ЗНАЧЕНИЕ(Перечисление.ГруппыНачисленийУдержанийВыплат.Удержания)
                ТОГДА Данные.Результат
            ИНАЧЕ 0
        КОНЕЦ) КАК Удержания
ИЗ
    РегистрНакопления.НачисленияУдержанияПоСотрудникам КАК Данные
ГДЕ
    Данные.ПериодРегистрации МЕЖДУ &НачалоПериода И &КонецПериода
    И Данные.Сотрудник = &Сотрудник
СГРУППИРОВАТЬ ПО
    Данные.Сотрудник,
    Данные.ПериодРегистрации

В данном примере мы используем измерение ГруппаНачисленияУдержанияВыплаты, чтобы быстро отсечь налоги и начисления от удержаний, а свойство КатегорияНачисления позволяет нам быть независимыми от конкретных наименований видов расчета, созданных пользователями.

Получение данных о выплатах

Выплаченная сумма дохода — это отдельный разрез учета. В регистре НачисленияУдержанияПоСотрудникам суммы фиксируются в момент начисления (в колонке «К выплате»), но факт выдачи денег отражается в регистре ВзаиморасчетыССотрудниками.

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


ВЫБРАТЬ
    Взаиморасчеты.Сотрудник КАК Сотрудник,
    СУММА(Взаиморасчеты.СуммаВзаиморасчетов) КАК Выплачено
ИЗ
    РегистрНакопления.ВзаиморасчетыССотрудниками КАК Взаиморасчеты
ГДЕ
    Взаиморасчеты.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход)
    И Взаиморасчеты.Период МЕЖДУ &НачалоПериода И &КонецПериода
    И Взаиморасчеты.Сотрудник = &Сотрудник
СГРУППИРОВАТЬ ПО
    Взаиморасчеты.Сотрудник

Обратите внимание, что для точной связки выплаты с конкретным отпуском (если это требуется) необходимо анализировать регистр ЗарплатаКВыплате, используя измерение ДокументОснование.

Использование программного интерфейса (API) конфигурации

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

Проанализируем возможности общего модуля ЗарплатаКадрыОтчеты. В нем существуют процедуры, позволяющие собрать данные во временные таблицы с учетом всех нюансов учета. Например, вызов программного формирования отчета или использование функции СкомпоноватьДанныеДляОтчета позволяет получить полностью готовый набор данных, который система использует для «Расчетного листка».

Посмотрим на пример логики:

  1. Программа подготавливает структуру параметров (период, список сотрудников, организация).
  2. Вызывается метод, который заполняет временную таблицу ВТДанныеРегистров.
  3. Из этой таблицы данные выбираются уже в нужном нам формате.

Этот путь сложнее в реализации «в лоб», но он гарантирует соответствие данных вашего отчета типовым отчетам программы.

Работа с регистрами расчета (классический метод)

Для некоторых задач, особенно если требуется анализ времени (дней, часов) отпуска или больничного, все еще актуально использование регистров расчета. Посмотрим на пример получения суммы материальной помощи, предоставленный в обсуждении:


ВЫБРАТЬ
    Начисления.ПериодРегистрации КАК ПериодРегистрации,
    Начисления.Сотрудник КАК Сотрудник,
    СУММА(Начисления.Результат) КАК ЗП_МатериальнаяПомощь
ИЗ
    РегистрРасчета.Начисления КАК Начисления
ГДЕ
    Начисления.ПериодРегистрации МЕЖДУ &НачалоМесяца И &КонецМесяца
    И Начисления.Сотрудник = &Сотрудник
    И Начисления.ВидРасчета.Код В (&КодМатПомощь, &КодМатПомощьНеОблаг)
СГРУППИРОВАТЬ ПО
    Начисления.ПериодРегистрации,
    Начисления.Сотрудник

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

Резюме и рекомендации

Разберем по шагам, как построить надежный запрос для получения данных о зарплате:

  1. Определитесь с точкой отсчета: Если вам нужны начисления «как в своде» — используйте РегистрНакопления.НачисленияУдержанияПоСотрудникам.
  2. Используйте категории: Вместо поиска по кодам или наименованиям видов расчета, обращайтесь к ВидРасчета.КатегорияНачисления. Это застрахует код от ошибок при изменении настроек пользователем.
  3. Для выплат — только Взаиморасчеты: Не пытайтесь найти факт выплаты в регистрах начислений. Используйте РегистрНакопления.ВзаиморасчетыССотрудниками с фильтром по виду движения «Расход».
  4. Учитывайте НДФЛ: Если ваша задача — отчет по доходам для налоговой, используйте РегистрНакопления.УчетДоходовДляИсчисленияНДФЛ, так как с 2023 года дата дохода в налоговом учете совпадает с датой фактической выплаты.

Изучив эти подходы, вы сможете создавать точные и производительные отчеты, которые будут показывать корректные данные независимо от сложности расчетных схем в организации.

← На главную