В конфигурации 1С:Зарплата и управление персоналом 3.1 (ЗУП), особенно в версии КОРП, разработчики часто сталкиваются с проблемой: при программном создании и проведении документа ПрогулНеявка записи в регистре расчета «Основные начисления» не появляются. Даже если заполнить основные реквизиты и вызвать стандартный метод Записать(РежимЗаписиДокумента.Проведение), документ остается «пустым» с точки зрения расчета зарплаты. Это происходит потому, что механизмы расчета в современных конфигурациях на базе 1С v8.3 вынесены в специализированные модули и тесно связаны с данными экранных форм.
В этой статье мы подробно разберем, как обойти ограничение экранных форм и выполнить полноценный расчет документа на стороне сервера, чтобы в системе корректно сформировались все движения по регистрам.
Проанализируем ситуацию: в ЗУП 3.1 документ — это не только набор реквизитов шапки, но и скрытые или вспомогательные табличные части (ТЧ), такие как Начисления, Показатели, ДанныеОВремени. Именно на основании данных в этих ТЧ движок проведения формирует записи в регистрах расчета. В типовой форме расчет этих таблиц происходит в интерактивном режиме или при нажатии кнопки «Провести и закрыть» через вызов серверных функций, имитирующих контекст формы.
Если мы просто создаем объект в коде, эти таблицы остаются пустыми. Следовательно, при проведении системе «нечего» записывать в регистр расчета. Чтобы решить задачу, нам нужно программно инициировать процедуру расчета зарплаты для конкретного документа.
Наиболее корректным способом в актуальных версиях ЗУП 3.1 является использование экспортных методов программного интерфейса подсистемы «Зарплата и Кадры». Рассмотрим алгоритм работы с модулем ЗарплатаКадрыСоставДокументов. Этот метод позволяет заполнить состав документа и рассчитать его показатели без привязки к форме.
Разберем пример кода для создания и расчета документа:
// Создаем новый документ
НовыйДокумент = Документы.ПрогулНеявка.СоздатьДокумент();
НовыйДокумент.Дата = ТекущаяДата();
НовыйДокумент.Организация = СсылкаНаОрганизацию;
НовыйДокумент.Сотрудник = СсылкаНаСотрудника;
НовыйДокумент.МесяцНачисления = НачалоМесяца(ДатаСобытия);
НовыйДокумент.ДатаНачала = ДатаНачалаПрогула;
НовыйДокумент.ДатаОкончания = ДатаОкончанияПрогула;
НовыйДокумент.ВидОтсутствия = Справочники.ПричиныОтсутствияСотрудников.Прогул;
// Устанавливаем признаки, чтобы система понимала статус расчета
НовыйДокумент.Рассчитал = ПараметрыСеанса.ТекущийПользователь;
НовыйДокумент.ПерерасчетВыполнен = Истина;
// Вызываем процедуру автоматического заполнения и расчета
// Важно: Этот метод заполнит ТЧ "Начисления" и "Данные о времени"
ЗарплатаКадрыСоставДокументов.ЗаполнитьИРассчитать(НовыйДокумент);
// Теперь можно проводить
НовыйДокумент.Записать(РежимЗаписиДокумента.Проведение);
Если универсальный метод по каким-то причинам не подходит или требуются дополнительные настройки, мы можем обратиться к низкоуровневым процедурам расчета. В ЗУП за это отвечает модуль ПроведениеРасчета. Выясним причину, почему это может понадобиться: например, если в вашей версии КОРП используются дополнительные аналитики (территории, условия труда), которые нужно передать в расчет.
Рассмотрим шаги реализации:
ПроведениеРасчета.Рассчитать(ДокументОбъект, ДополнительныеПараметры).Пример реализации на сервере:
ДокОбъект = Документы.ПрогулНеявка.СоздатьДокумент();
// ... заполнение реквизитов ...
ПараметрыРасчета = Новый Структура;
ПараметрыРасчета.Вставить("ПересчитатьДокумент", Истина;
ПараметрыРасчета.Вставить("РассчитатьЗарплату", Истина);
// Инициализируем расчет расчетных механизмов
ПроведениеРасчета.Рассчитать(ДокОбъект, ПараметрыРасчета);
// Проверяем, заполнились ли ТЧ Начисления
Если ДокОбъект.Начисления.Количество() > 0 Тогда
ДокОбъект.Записать(РежимЗаписиДокумента.Проведение);
КонецЕсли;
Этот метод часто упоминается опытными разработчиками (сообщение 4 форума). Он заключается в создании структуры, которая по составу полей полностью повторяет реквизиты формы. Многие типовые процедуры расчета принимают на вход не ДокументОбъект, а именно структуру или ДанныеФормыСтруктура.
Проанализируем ситуацию: если процедура в модуле менеджера или объекта требует контекста формы, мы можем создать структуру, заполнить её данными из нашего объекта, вызвать процедуру расчета, а затем с помощью метода Загрузить() вернуть рассчитанные строки обратно в ТЧ объекта.
Посмотрим на пример логики:
ПараметрыФормы, содержащую поля Объект (наш документ) и технические флаги.РассчитатьОбъект).Проанализируем особенности версии КОРП, которые могут блокировать появление движений:
1. Настройки Вида Расчета: Проверьте, что используемый вид расчета (например, «Прогул») в своих настройках на вкладке «Налоги, взносы, бухучет» или «Основное» настроен так, чтобы фиксироваться в регистрах. Если это просто информационное отсутствие без регистрации времени в регистре расчета, то записей не будет по определению.
2. Режим учета времени: Если документ работает в режиме «только учет времени», он может не создавать записей в Основные начисления. Убедитесь, что программно заполнен ВидДохода и корректно указаны даты, попадающие в график работы сотрудника.
3. Графики работы: При программном расчете крайне важно, чтобы у сотрудника был назначен актуальный график. Механизм расчета вызывает функции получения нормы времени. Если график не найден, расчет вернет пустой результат, и ТЧ Начисления останется пустой.
Если движения всё равно не появляются, рекомендуем выполнить следующие действия:
Начисления.ИдентификаторСтрокиВидаРасчета. Часто расчет не срабатывает, если связи между строками ТЧ нарушены или не проинициализированы.Использование метода ЗарплатаКадрыСоставДокументов.ЗаполнитьИРассчитать() обычно снимает 90% проблем, так как он инкапсулирует в себе всю сложную логику ЗУП по инициализации расчетных механизмов. Это позволяет автоматизировать ввод неявок через внешние обработки или регламентные задания, сохраняя целостность данных в регистрах расчета.