При работе с распределенными системами или при необходимости консолидации данных часто возникает задача получения показателей из специализированных баз. Одним из наиболее востребованных, но в то же время сложных показателей является Фонд оплаты труда (ФОТ) в конфигурации «Зарплата и управление персоналом 3.1». Сложность заключается в том, что ФОТ в ЗУП — это не просто значение в регистре, а результат работы сложных механизмов вытеснения, плановых начислений и графиков работы. Рассмотрим подробнее, как можно организовать получение этого отчета из внешней информационной базы.
Этот метод часто выбирают за его относительную простоту реализации «в коде». Мы создаем подключение к целевой базе ЗУП непосредственно из текущей конфигурации. Для этого используется объект V83.COMConnector. Проанализируем пример кода для установления связи:
// Создаем объект для подключения
Попытка
COMСоединитель = Новый COMОбъект("V83.COMConnector");
СтрокаПодключения = "Srvr='ServerName';Ref='BaseName';Usr='Login';Pwd='Password';";
БазаЗУП = COMСоединитель.Connect(СтрокаПодключения);
Исключение
Сообщить("Не удалось подключиться: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
После того как соединение установлено, нам нужно получить данные. Важно помнить, что попытка просто прочитать регистры через запрос может привести к неверным цифрам. Правильнее всего будет вызвать экспортную функцию из модуля менеджера отчета или общего модуля на стороне ЗУП, которая вернет нам результат формирования отчета. Разберем шаги:
БазаЗУП обращаемся к этой функции.Важное ограничение: Технология COM требует наличия одинаковых версий платформы, плохо работает на 64-битных серверах без дополнительной настройки и потребляет одну сеансовую лицензию на каждое подключение.
Выясним, почему этот метод считается более предпочтительным. HTTP-сервисы работают быстрее, не зависят от разрядности системы и позволяют передавать данные в легком формате JSON. Рассмотрим алгоритм реализации:
В базе ЗУП 3.1 создадим Расширение, в котором добавим HTTP-сервис. Проанализируем структуру обработчика GET-запроса:
Функция ПолучитьДанныеФОТ(Запрос)
// Параметры периода получаем из URL
ДатаНачала = Запрос.ПараметрыЗапроса.Получить("ДатаНачала");
ДатаОкончания = Запрос.ПараметрыЗапроса.Получить("ДатаОкончания");
// Вызываем программное формирование СКД (рассмотрено ниже)
ТаблицаРезультат = СформироватьФОТНаСервере(ДатаНачала, ДатаОкончания);
// Сериализуем в JSON
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ТаблицаРезультат);
СтрокаJSON = ЗаписьJSON.Закрыть();
Ответ = Новый HTTPСервисОтвет(200);
Ответ.УстановитьТелоИзСтроки(СтрокаJSON, КодировкаТекста.UTF8);
Возврат Ответ;
КонецФункции
Преимущество здесь в том, что внешняя база просто отправляет стандартный веб-запрос и получает готовый набор цифр, который легко разобрать и вывести в макет.
Посмотрим на ситуацию со стороны формирования самих данных. Как уже было сказано, расчет ФОТ — процедура тяжелая. Чтобы не изобретать велосипед, мы должны использовать штатную Систему компоновки данных (СКД) отчета «Анализ ФОТ по сотрудникам».
Проанализируем пример кода, который можно выполнить внутри HTTP-сервиса или через COM, чтобы получить результат отчета программно:
// Получаем схему компоновки штатного отчета
ОтчетОбъект = Отчеты.АнализФОТПоСотрудникам.Создать();
Схема = ОтчетОбъект.СхемаКомпоновкиДанных;
// Настраиваем параметры
Настройки = Схема.НастройкиПоУмолчанию;
ПараметрПериод = Настройки.ПараметрыДанных.Элементы.Найти("Период");
ПараметрПериод.Значение = Новый СтандартныйПериод(НачалоМесяца(ТекущаяДата()), КонецМесяца(ТекущаяДата()));
ПараметрПериод.Использование = Истина;
// Инициализируем макет и процессор
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки, , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
ТаблицаЗначений = Новый ТаблицаЗначений;
ПроцессорВывода.УстановитьОбъект(ТаблицаЗначений);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
В результате переменная ТаблицаЗначений будет содержать все необходимые расчетные данные по ФОТ, учитывая все внутренние механизмы ЗУП. Именно эту таблицу мы и будем передавать обратно вызывающей стороне.
Выясним, какой метод лучше использовать в конкретных условиях:
Рекомендация: Для получения корректного ФОТ всегда используйте программный вызов ПроцессорКомпоновкиДанных штатных отчетов ЗУП. Это гарантирует, что данные во внешней базе будут на 100% совпадать с тем, что видит бухгалтер в самой ЗУП.
Разберем еще один нюанс: права доступа. При создании HTTP-сервиса или COM-подключения обязательно создайте в целевой базе ЗУП отдельного пользователя с ограниченными правами. Ему должны быть доступны только роли на чтение соответствующих регистров и запуск отчета АнализФОТПоСотрудникам. Это обезопасит конфиденциальные данные о зарплатах от несанкционированного доступа.
Таким образом, мы рассмотрели комплексный подход к интеграции. Сочетание HTTP-сервиса и программного вызова СКД является наиболее надежным и современным способом получения отчетности из внешних баз 1С.