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

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

Переход с редакции «Зарплата и управление персоналом 2.5» на 3.1 часто вызывает у разработчиков культурный шок. В старой редакции вся логика расчетов была сосредоточена в модулях объектов, что позволяло легко вызвать метод Рассчитать() из любой обработки. В ЗУП 3.1 архитектура изменилась: значительная часть логики управления расчетами переместилась в модули форм. Это создает огромную проблему при попытке автоматизировать расчет документов через регламентные задания или внешние соединения, так как метод ПолучитьФорму() на сервере недоступен.

В данной статье мы разберем, как обойти эти ограничения, рассмотрим программный интерфейс ЗУП 3.1 и научимся выполнять расчеты, не обращаясь к интерактивным формам.

Почему нельзя просто «получить форму» на сервере

Прежде всего, проанализируем техническое ограничение платформы 1С:Предприятие 8.3. Регламентные задания, фоновые задания и внешние соединения (COM) выполняются в контексте сервера. В этом контексте отсутствует понятие «пользовательский интерфейс». Любая попытка вызвать форму документа приведет к ошибке, так как объекты типа УправляемаяФорма не существуют в серверном вызове без активного клиента.

Многие разработчики по привычке пытаются перенести код из модуля формы в свою обработку. Однако в ЗУП 3.1 модули форм документов могут содержать тысячи строк кода, завязанных на события элементов управления. Копирование этого кода — путь к созданию нежизнеспособного и труднообновляемого решения. Правильный подход заключается в использовании программного интерфейса (API), который заложили разработчики фирмы 1С.

Программное получение среднего заработка

Рассмотрим типовую задачу: нам необходимо получить значение среднего заработка сотрудника для формирования выгрузки во внешнюю систему. Создавать документ «Отпуск» интерактивно для каждого сотрудника нереально. Мы воспользуемся возможностями общего модуля УчетСреднегоЗаработка.

Для реализации этой задачи проанализируем следующий алгоритм:

  1. Подготовим параметры расчета (сотрудник, дата начала события, период).
  2. Вызовем функции сбора данных о заработке за предыдущие 12 месяцев.
  3. Рассчитаем итоговое значение.

Пример кода для получения среднего заработка может выглядеть следующим образом:


// Определяем параметры для расчета
ПараметрыРасчета = УчетСреднегоЗаработка.ПараметрыРасчетаСреднегоЗаработка();
ПараметрыРасчета.Сотрудник = ВыбранныйСотрудник;
ПараметрыРасчета.ДатаНачалаСобытия = ТекущаяДата();
ПараметрыРасчета.ДанныеДляРасчетаЗаполнены = Ложь;

// Получаем данные из информационной базы
ДанныеСреднего = УчетСреднегоЗаработка.ПодготовитьДанныеДляРасчетаСреднегоЗаработка(ПараметрыРасчета);

// Вычисляем результат
РезультатРасчета = УчетСреднегоЗаработка.РассчитатьСреднийЗаработок(ДанныеСреднего, ПараметрыРасчета);
СреднийЗаработок = РезультатРасчета.СреднийЗаработок;

Обратите внимание, что использование прямого обращения к общим модулям позволяет нам полностью исключить создание объекта документа в базе данных, что существенно экономит ресурсы сервера при массовой обработке данных.

Автоматический расчет документов на сервере

Если задача стоит шире — не просто получить цифру, а создать, заполнить и рассчитать полноценный документ (например, «Больничный лист» или «Премия»), нам потребуется использовать механизмы пересчета объекта.

Рассмотрим пошагово, как это сделать правильно:

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

Пример программного расчета документа:


НовыйДокумент = Документы.Отпуск.СоздатьДокумент();
НовыйДокумент.Дата = ТекущаяДата();
НовыйДокумент.Организация = Справочники.Организации.НайтиПоРеквизиту("ИНН", "7700000000");
// ... заполнение остальных обязательных реквизитов ...

// Инициализируем механизмы ЗУП для заполнения состава документа
ЗарплатаКадрыСоставДокументов.ОбновитьСоставДокумента(НовыйДокумент);

// Выполняем расчет документа без открытия формы
ПараметрыРасчета = РасчетЗарплаты.ПараметрыРасчета();
ПараметрыРасчета.ОчищатьРезультатыРасчета = Истина;

РасчетЗарплаты.Рассчитать(НовыйДокумент, ПараметрыРасчета);

// Записываем рассчитанный документ
НовыйДокумент.Записать(РежимЗаписиДокумента.Запись);

Полезные модули для автоматизации

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

Использование документа «Данные для расчета зарплаты»

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

Этот документ специально спроектирован для интеграции. Мы можем настроить «Вид данных для расчета», который будет содержать нужные нам показатели. Программное заполнение этого документа крайне простое, так как он не содержит сложной логики в форме — он служит лишь «контейнером» для значений показателей. После его записи стандартный механизм расчета зарплаты при начислении за месяц автоматически подхватит эти данные.

Рекомендации по разработке расширений

Если вы столкнулись с тем, что специфическая логика (например, отраслевой расчет) все же реализована исключительно внутри модуля формы и не вынесена в общие модули, не спешите менять конфигурацию. Используйте расширения.

Создайте в расширении новый общий модуль с признаком Сервер. Перенесите туда необходимую логику, предварительно очистив её от обращений к ЭтаФорма, Элементы и клиентским методам (ПоказатьВопрос, Предупреждение). Таким образом, вы получите серверный метод, который сможете вызывать как из формы, так и из регламентного задания, соблюдая принцип единства кода.

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

← На главную