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