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