Как программно заполнить месяц начисления в документе Данные для расчета зарплаты в 1С:ЗУП 3.1?

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

При программном создании зарплатных документов в 1С:ЗУП 3.1 разработчики часто сталкиваются с вопросом заполнения поля Месяц (месяц начисления). Попытка вызвать функции интерфейса, такие как ЗарплатаКадрыКлиент.ВводМесяцаАвтоПодборТекста() или ЗарплатаКадрыКлиент.ВводМесяцаПриИзменении() из фонового задания или серверного модуля обработки, приводит к ошибкам компиляции или отсутствию доступа к форме. Разберем по шагам, как устроено хранение периода в ЗУП 3.1 и как правильно заполнять этот реквизит программно.

Выясним причину: разделение данных и интерфейса формы

Проанализируем структуру типовой конфигурации. На форме документа «Данные для расчета зарплаты» (как и в документах начислений) пользователь видит строковое поле ввода месяца вида «Январь 2024 г.». Однако в таблице базы данных такого строкового реквизита не существует.

Рассмотрим, как это реализовано на уровне платформы:

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

Корректный способ: программное заполнение на сервере

Для создания и записи документа через встроенный язык достаточно напрямую заполнить реквизиты объекта метаданных. Главное правило: дата месяца начисления должна быть обязательно приведена к первому числу месяца со временем 00:00:00 с помощью функции НачалоМесяца().

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


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

// Устанавливаем месяц начисления в реквизит объекта:
ДокОбъект.Период = НачалоМесяца(НужнаяДата);

// Если шаблон документа настроен на ввод данных за период:
ДокОбъект.ПериодОкончания = КонецМесяца(НужнаяДата);

ДокОбъект.Записать(РежимЗаписиДокумента.Запись);

Важный нюанс: если не использовать НачалоМесяца() и передать дату с произвольным временем или серединой месяца, движения по регистрам показателей зарплаты зафиксируют некорректный период, и последующие расчетные документы не смогут подхватить введенные показатели.

Особенности заполнения табличной части документа

В документе «Данные для расчета зарплаты» есть еще одна тонкость. На форме отображаются динамические таблицы («ДанныеСводно», «ДанныеДетально»), которые формируются интерфейсом «на лету» в зависимости от реквизита ВидДокумента.

При программном заполнении этих динамических таблиц на сервере нет. Нам необходимо заполнять реальную табличную часть объекта — ЗначенияПоказателей:


СтрокаПоказателя = ДокОбъект.ЗначенияПоказателей.Добавить();
СтрокаПоказателя.Объект = СотрудникСсылка; // или подразделение, в зависимости от настройки
СтрокаПоказателя.Показатель = НужныйПоказатель;
СтрокаПоказателя.Значение = 15; // вводимое значение показателя
СтрокаПоказателя.Период = ДокОбъект.Период;

Интерактивное открытие формы с предзаполнением

Если задача заключается не в тихой записи документа в базе, а в открытии формы пользователю с уже заполненным периодом, используется клиентский контекст. В этом случае строковое представление формируется типовыми средствами автоматически при инициализации формы объектом, либо можно явно передать параметры при открытии:


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

ОткрытьФорму("Документ.ДанныеДляРасчетаЗарплаты.ФормаОбъекта", ПараметрыФормы);

В модуле самой формы уже сработают типовые обработчики, в том числе формирование текстовой строки месяца из реквизита Период, и пользователь увидит корректно заполненное поле интерфейса.

← На главную