Переход с редакции «Зарплата и управление персоналом 2.5» на 3.1 часто вызывает у разработчиков культурный шок. В старой редакции вся логика расчетов была сосредоточена в модулях объектов, что позволяло легко вызвать метод Рассчитать() из любой обработки. В ЗУП 3.1 архитектура изменилась: значительная часть логики управления расчетами переместилась в модули форм. Это создает огромную проблему при попытке автоматизировать расчет документов через регламентные задания или внешние соединения, так как метод ПолучитьФорму() на сервере недоступен.
В данной статье мы разберем, как обойти эти ограничения, рассмотрим программный интерфейс ЗУП 3.1 и научимся выполнять расчеты, не обращаясь к интерактивным формам.
Прежде всего, проанализируем техническое ограничение платформы 1С:Предприятие 8.3. Регламентные задания, фоновые задания и внешние соединения (COM) выполняются в контексте сервера. В этом контексте отсутствует понятие «пользовательский интерфейс». Любая попытка вызвать форму документа приведет к ошибке, так как объекты типа УправляемаяФорма не существуют в серверном вызове без активного клиента.
Многие разработчики по привычке пытаются перенести код из модуля формы в свою обработку. Однако в ЗУП 3.1 модули форм документов могут содержать тысячи строк кода, завязанных на события элементов управления. Копирование этого кода — путь к созданию нежизнеспособного и труднообновляемого решения. Правильный подход заключается в использовании программного интерфейса (API), который заложили разработчики фирмы 1С.
Рассмотрим типовую задачу: нам необходимо получить значение среднего заработка сотрудника для формирования выгрузки во внешнюю систему. Создавать документ «Отпуск» интерактивно для каждого сотрудника нереально. Мы воспользуемся возможностями общего модуля УчетСреднегоЗаработка.
Для реализации этой задачи проанализируем следующий алгоритм:
Пример кода для получения среднего заработка может выглядеть следующим образом:
// Определяем параметры для расчета
ПараметрыРасчета = УчетСреднегоЗаработка.ПараметрыРасчетаСреднегоЗаработка();
ПараметрыРасчета.Сотрудник = ВыбранныйСотрудник;
ПараметрыРасчета.ДатаНачалаСобытия = ТекущаяДата();
ПараметрыРасчета.ДанныеДляРасчетаЗаполнены = Ложь;
// Получаем данные из информационной базы
ДанныеСреднего = УчетСреднегоЗаработка.ПодготовитьДанныеДляРасчетаСреднегоЗаработка(ПараметрыРасчета);
// Вычисляем результат
РезультатРасчета = УчетСреднегоЗаработка.РассчитатьСреднийЗаработок(ДанныеСреднего, ПараметрыРасчета);
СреднийЗаработок = РезультатРасчета.СреднийЗаработок;
Обратите внимание, что использование прямого обращения к общим модулям позволяет нам полностью исключить создание объекта документа в базе данных, что существенно экономит ресурсы сервера при массовой обработке данных.
Если задача стоит шире — не просто получить цифру, а создать, заполнить и рассчитать полноценный документ (например, «Больничный лист» или «Премия»), нам потребуется использовать механизмы пересчета объекта.
Рассмотрим пошагово, как это сделать правильно:
Организация, Сотрудник, Дата, ПериодРегистрации).Заполнить() объекта, который подтянет кадровые данные.РасчетЗарплаты.Пример программного расчета документа:
НовыйДокумент = Документы.Отпуск.СоздатьДокумент();
НовыйДокумент.Дата = ТекущаяДата();
НовыйДокумент.Организация = Справочники.Организации.НайтиПоРеквизиту("ИНН", "7700000000");
// ... заполнение остальных обязательных реквизитов ...
// Инициализируем механизмы ЗУП для заполнения состава документа
ЗарплатаКадрыСоставДокументов.ОбновитьСоставДокумента(НовыйДокумент);
// Выполняем расчет документа без открытия формы
ПараметрыРасчета = РасчетЗарплаты.ПараметрыРасчета();
ПараметрыРасчета.ОчищатьРезультатыРасчета = Истина;
РасчетЗарплаты.Рассчитать(НовыйДокумент, ПараметрыРасчета);
// Записываем рассчитанный документ
НовыйДокумент.Записать(РежимЗаписиДокумента.Запись);
Для эффективной работы в ЗУП 3.1 программисту необходимо знать «точки входа» в программный интерфейс. Разберем основные модули, которые помогут вам в решении задач автоматизации:
РасчетЗарплаты — основной модуль для запуска расчета начислений, удержаний и взносов в документах.УчетСреднегоЗаработка — всё, что касается расчета среднего для отпусков, командировок и пособий.ЗарплатаКадрыСоставДокументов — используется для автоматического формирования строк в табличных частях документов при изменении ключевых реквизитов.УчетПособийСоциальногоСтрахования — специализированные функции для расчета больничных листов.КадровыйУчет — получение срезов данных о сотрудниках, позициях штатного расписания и графиках работы.Проанализируем ситуацию, когда нам нужно загрузить в систему огромный массив внешних данных (например, показатели эффективности или суммы премий из сторонней CRM). Вместо того чтобы пытаться имитировать сложный расчет в документах начислений, рассмотрим использование универсального документа ДанныеДляРасчетаЗарплаты.
Этот документ специально спроектирован для интеграции. Мы можем настроить «Вид данных для расчета», который будет содержать нужные нам показатели. Программное заполнение этого документа крайне простое, так как он не содержит сложной логики в форме — он служит лишь «контейнером» для значений показателей. После его записи стандартный механизм расчета зарплаты при начислении за месяц автоматически подхватит эти данные.
Если вы столкнулись с тем, что специфическая логика (например, отраслевой расчет) все же реализована исключительно внутри модуля формы и не вынесена в общие модули, не спешите менять конфигурацию. Используйте расширения.
Создайте в расширении новый общий модуль с признаком Сервер. Перенесите туда необходимую логику, предварительно очистив её от обращений к ЭтаФорма, Элементы и клиентским методам (ПоказатьВопрос, Предупреждение). Таким образом, вы получите серверный метод, который сможете вызывать как из формы, так и из регламентного задания, соблюдая принцип единства кода.
Выясним главную причину сложностей: разработчики ЗУП 3.1 стремились сделать интерфейс максимально отзывчивым (реактивным), поэтому расчеты часто инициируются событиями формы. Но, используя описанные выше методы программного интерфейса, мы можем эффективно управлять данными системы в фоновом режиме, обеспечивая высокую скорость обработки больших объемов информации.