Как выгрузить виды начислений из 1С:ЗУП в PostgreSQL с разделением по категориям

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

При интеграции 1С:ЗУП с внешними аналитическими системами, такими как PostgreSQL, часто возникает задача выгрузки не просто сырых данных, а классифицированных начислений. Основная сложность заключается в том, что в типовой конфигурации 1С нет одной конкретной колонки, где было бы написано «Аванс» или «Командировка» в явном виде. Эти данные разбросаны по разным регистрам и типам документов.

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

Выбор источника данных: регистры накопления

Проанализируем структуру данных 1С:ЗУП. Для решения задачи нам могут встретиться два основных регистра:

  1. БухгалтерскиеВзаиморасчетыССотрудниками — этот регистр фиксирует состояние задолженности, но он менее удобен для детального анализа самих начислений.
  2. НачисленияУдержанияПоСотрудникам — это оптимальный источник. Именно здесь хранятся суммы начисленной зарплаты, отпусков и пособий в разрезе сотрудников, подразделений и периодов.

Рассмотрим, какие поля нам понадобятся для выгрузки в Postgres:

Классификация начислений через конструкцию ВЫБОР

Для того чтобы в результирующей таблице Postgres появилось поле «Вид начисления», воспользуемся механизмом определения типа документа-регистратора. Выясним причину появления каждой записи в регистре. Разберем логику классификации по шагам:

1. Отпуска, больничные и командировки. В 1С:ЗУП эти начисления делаются специализированными документами. Мы можем проверить тип регистратора прямо в запросе.

2. Аванс. Под авансом обычно понимается «Начисление за первую половину месяца». За это отвечает одноименный документ.

3. Зарплата. Все остальное, что не попало в вышеуказанные категории (оклады, премии, надбавки), обычно относится к итоговому расчету за месяц.

Посмотрим на пример реализации этой логики в тексте запроса:


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

Работа с персональными данными и аналитикой

При выгрузке в Postgres важно соблюдать структуру справочников. Рассмотрим подробнее получение СНИЛС и ИНН:

ИНН организации: Обращаемся через точку к реквизиту Организация.ИНН. Убедитесь, что в справочнике «Организации» это поле заполнено, иначе в Postgres уйдет пустая строка.

СНИЛС: В 1С:ЗУП СНИЛС хранится в справочнике ФизическиеЛица. Поскольку в регистре мы видим объект Сотрудник, путь будет следующим: Сотрудник.ФизическоеЛицо.СтраховойНомерПФР. Обратите внимание, что СНИЛС может храниться с дефисами и пробелами, при необходимости используйте функции ПОДСТРОКА или обработку строки в коде перед выгрузкой.

Период: Для финансовой отчетности важно использовать ПериодРегистрации — это месяц, в который начисление «легло» в учет. ПериодДействия же может относиться к прошлому или будущему времени (например, отпуск, начавшийся в конце одного месяца и закончившийся в другом).

Методы передачи данных в PostgreSQL

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

Способ 1: Внешние источники данных (рекомендуемый). В дереве метаданных 1С можно создать объект ВнешнийИсточникДанных. Настроив связь через ODBC-драйвер с вашей базой Postgres, вы сможете работать с таблицами внешней базы почти как с объектами 1С.

Способ 2: Использование ADO (COM-объект). Если нужно выполнить прямой SQL-запрос INSERT или COPY. Проанализируем пример кода для подключения:


Connection = Новый COMОбъект("ADODB.Connection");
ConnectionString = "Driver={PostgreSQL Unicode};Server=ваш_сервер;Port=5432;Database=ваша_база;Uid=логин;Pwd=пароль;";
Connection.Open(ConnectionString);

// Получаем данные из СКД в таблицу значений
РезультатТаблица = ПолучитьДанныеИзЗапроса(); 

Для Каждого Строка Из РезультатТаблица Цикл
    ТекстЗапросаSQL = "INSERT INTO accruals (employee_name, snils, amount, category) VALUES ('" 
        + Строка.ФИО + "', '" + Строка.СНИЛС + "', " + Строка.Сумма + ", '" + Строка.ВидНачисления + "')";
    Connection.Execute(ТекстЗапросаSQL);
КонецЦикла;

Важный нюанс по дублям: При выгрузке из регистров накопления записи могут дублироваться, если одно и то же начисление распределено по разным статьям финансирования или способам отражения. Чтобы избежать «раздувания» сумм в Postgres, обязательно используйте группировку в запросе 1С по всем ключевым полям (Сотрудник, Период, ВидНачисления) и агрегатную функцию СУММА(Сумма).

Таким образом, комбинируя данные из регистра НачисленияУдержанияПоСотрудникам и анализируя Регистратор, мы получаем стройную систему выгрузки, которая позволит пользователям в Postgres видеть понятные категории выплат вместо внутренних идентификаторов 1С.

← На главную