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