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