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