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

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

В процессе автоматизации кадрового учета и выплат в конфигурации 1С:Зарплата и управление персоналом 3.1 часто возникает задача программного формирования ведомостей. В отличие от простых документов, ведомости на выплату имеют сложную структуру табличных частей, которые должны быть строго синхронизированы между собой. В этой статье мы подробно разберем, как правильно создать документ ВедомостьНаВыплатуЗарплатыПеречислением (Ведомость на счета) и заполнить его данными, используя типовые механизмы системы.

Способ 1: Создание документа на сервере и заполнение через форму

Рассмотрим сценарий, когда нам необходимо создать документ программно, а затем инициировать его заполнение так, как если бы пользователь нажал кнопку «Заполнить» в интерфейсе. Этот метод удобен, если логика заполнения сложна и вы хотите максимально использовать стандартные проверки формы.

Проанализируем алгоритм действий. Сначала мы создаем объект документа на сервере, заполняем основные реквизиты (организацию, период, способ выплаты) и записываем его. Затем на клиенте мы получаем форму этого документа и вызываем процедуру из типового общего модуля.

Пример реализации на стороне сервера:


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

Вызов заполнения на стороне клиента:

После создания ссылки нам нужно открыть форму и запустить стандартный механизм расчета сумм к выплате и НДФЛ. Для этого воспользуемся общим модулем ВедомостьНаВыплатуЗарплатыКлиент.


&НаКлиенте
Процедура ИсполнитьСозданиеИЗаполнение()
    // Вызываем создание документа
    СсылкаНаДок = СформироватьДокументВедомостьНаСервере(СписокФизЛиц, ДокументОснование);
    
    // Подготавливаем параметры для открытия формы
    ПараметрыФормы = Новый Структура("Ключ", СсылкаНаДок);
    ФормаДокумента = ПолучитьФорму("Документ.ВедомостьНаВыплатуЗарплатыПеречислением.Форма.ФормаДокумента", ПараметрыФормы);
    
    // Проверяем наличие оснований и запускаем типовое заполнение
    Если ФормаДокумента.Объект.Основания.Количество() > 0 Тогда
        // Вызываем процедуру, имитирующую нажатие кнопки "Заполнить"
        ВедомостьНаВыплатуЗарплатыКлиент.Заполнить(ФормаДокумента);
    КонецЕсли;
КонецПроцедуры

Способ 2: Полностью программное заполнение на сервере (оптимальный метод)

Использование экранных форм в фоновых заданиях или при массовой обработке данных невозможно. Поэтому разберем более профессиональный подход — использование серверных методов без обращения к интерфейсу. Основная логика выплат в ЗУП 3.1 сосредоточена в модуле ВыплатаЗарплатыСервер.

Выясним причину, почему простого добавления строк в таблицу недостаточно. В ведомостях ЗУП 3.1 существует три ключевых таблицы:

  1. Состав: содержит список сотрудников.
  2. Зарплата: содержит детальную расшифровку сумм по периодам, статьям финансирования и документам-основаниям.
  3. НДФЛ: содержит расчет налога к удержанию.

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

Рассмотрим, как правильно использовать типовой программный интерфейс для заполнения:


// Пример серверного заполнения без открытия формы
Процедура ЗаполнитьВедомостьНаСервере(ДокументСсылка)
    
    ДокументОбъект = ДокументСсылка.ПолучитьОбъект();
    
    // Подготавливаем параметры заполнения (структура может меняться в зависимости от версии ЗУП)
    ПараметрыЗаполнения = ВыплатаЗарплатыСервер.ПараметрыЗаполненияВедомости();
    ПараметрыЗаполнения.Организация = ДокументОбъект.Организация;
    ПараметрыЗаполнения.ПериодРегистрации = ДокументОбъект.ПериодРегистрации;
    // ... заполнение других параметров (подразделение, способ выплаты и т.д.)
    
    // Вызов типового механизма распределения задолженности
    ВыплатаЗарплатыСервер.ЗаполнитьВедомость(ДокументОбъект, ПараметрыЗаполнения);
    
    ДокументОбъект.Записать(РежимЗаписиДокумента.Запись);
    
КонецПроцедуры

Важные нюансы при работе с ведомостями

Проанализируем несколько критических моментов, которые часто становятся причиной ошибок при программном создании ведомостей:

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

Таким образом, мы рассмотрели два подхода к автоматизации создания ведомостей. Использование типовых процедур заполнения (через форму или серверные модули) является наиболее безопасным, так как гарантирует соблюдение всех внутренних связей данных 1С:ЗУП и корректный расчет НДФЛ.

← На главную