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