Дополнительная внешняя обработка для создания Компенсации за задержку зарплаты на
основании Ведомости на выплату зарплаты через банк или на лицевые счета в рамках зарплатного проекта или через кассу.
Зарплата считается задержанной в соответствии с настройками организации (в моем случае с 16 числа следующего месяца), с этого дня начинается расчет компенсации. При расчете учитывается изменение ставки рефинансирования ЦБ.
Месяц, за который задержана зарплата подставляется из Ведомости (поле 'Месяц выплаты'), дата выплаты берется из ведомости (если заполнена дата выплаты, то берется дата выплаты, если не заполнена, то подставляется дата документа, эта дата будет окончанием периода расчета компенсации.
Состав сотрудников соответствует составу из ведомости.
Команда выполняется для одного выделенного объекта в списке, иначе некорректно рассчитываются даты выплат.
Если ведомость проведена, запрашивается разрешение на отмену проведения, компенсация рассчитывается только в том случае, если выплата еще не осуществлялась (это нужно для выплаты компенсации задним числом), после всех операций ведомость проводится автоматически.
8.3.24.1761 - версия платформы, на которой велась разработка
3.1.30.81 - версия ЗУП, в которой проводилось тестирование
Размещаю некоторые функции из модуля внешней обработки.
Создание документа
&НаСервереБезКонтекста
Функция СоздатьДокКомпенсацияЗаЗадержкуЗарплаты(Ведомость)
ДокКомпенсация = Документы.КомпенсацияЗаЗадержкуЗарплаты.СоздатьДокумент();
ДатаВыплаты = ?(ЗначениеЗаполнено(Ведомость.ДатаВыплаты), Ведомость.ДатаВыплаты, Ведомость.Дата); //дата выплаты по ведомости (обычно совпадает с датой документа)
ДокКомпенсация.Дата = ДатаВыплаты; //ТекущаяДата(); - не подходит, т.к. дата документа должна быть не меньше даты выплаты
ДокКомпенсация.Организация = Ведомость.Организация;
ДокКомпенсация.Подразделение = Ведомость.Подразделение;
ДокКомпенсация.ПериодРегистрации = НачалоМесяца(ТекущаяДата()); //компенсацию планируем выплачивать текущим месяцем
ДокКомпенсация.ПериодВзаиморасчетов = Ведомость.ПериодРегистрации; //за какой месяц задержана зарплата
ДокКомпенсация.ПланируемаяДатаВыплаты = ДатаВыплаты;
ДокКомпенсация.ПорядокВыплаты = Перечисления.ХарактерВыплатыЗарплаты.Зарплата; //выплата вместе с зарплатой
ДокКомпенсация.РегистрироватьДоходыСтраховыхВзносов = Истина; //так нужно по закону
ДокКомпенсация.РегистрироватьКакОблагаемыйНДФЛДоход = Истина; //так нужно по закону
ДокКомпенсация.СпособРасчетовСФизическимиЛицами = Перечисления.СпособыРасчетовСФизическимиЛицами.ОплатаТруда; //выплаты через 70 счет БУ
ДокКомпенсация.КатегорияДохода = Перечисления.КатегорииДоходовНДФЛ.ПрочиеДоходыВДенежнойФормеОтТрудовойДеятельности;
//май 2024 ведомость в банк №112 от 26.06.2024
ДокКомпенсация.Комментарий = ЗарплатаКадрыКлиентСервер.ПолучитьПредставлениеМесяца(ДокКомпенсация.ПериодВзаиморасчетов) + " " + Ведомость.Ссылка;
ДокКомпенсация.Ответственный = Пользователи.АвторизованныйПользователь();
ОтветственныеЛица = ЗарплатаКадры.ОтветственныеЛицаОрганизации(ДокКомпенсация.Организация, "Руководитель,ДолжностьРуководителя", ДатаВыплаты);
ДокКомпенсация.Руководитель = ОтветственныеЛица.Руководитель;
ДокКомпенсация.ДолжностьРуководителя = ОтветственныеЛица.ДолжностьРуководителя;
СотрудникиВедомости = ПолучитьСписокСотрудников(Ведомость, ДокКомпенсация);
//ДокКомпенсация.ЗаполнитьКомпенсации(); //не подходит, т.к. нет возможности передать состав сотрудников из ведомости
ДокКомпенсация.ДополнитьКомпенсации(СотрудникиВедомости);
РассчитатьНДФЛ(,,ДокКомпенсация);
ДокКомпенсация.СуммаПоДокументу = ДокКомпенсация.Начисления.Итог("СуммаКомпенсации");
Если НЕ ЗначениеЗаполнено(ДокКомпенсация.СуммаПоДокументу) Тогда
//нет смысла создавать пустые документы
ОбщегоНазначения.СообщитьПользователю("Сумма компенсации по новому документу равна 0, документ не будет создан!");
Возврат Неопределено;
КонецЕсли;
НачатьТранзакцию();
ДокКомпенсация.Записать(РежимЗаписиДокумента.Проведение);
ЗафиксироватьТранзакцию();
Возврат ДокКомпенсация.Ссылка;
КонецФункции
Расчет проводится типовым механизмом модуля объекта документа ДокументОбъект.КомпенсацияЗаЗадержкуЗарплаты.ДополнитьКомпенсации(СотрудникиВедомости)
В принципе, можно было бы использовать метод ЗаполнитьКомпенсации(), но в нем нет возможности переопределить сотрудников - он заполняет документ всеми работающими в подразделении сотрудниками (или вообще всеми сотрудниками организации, если подразделение не указано).
Подгрузка физлиц из ведомости, формирование списка сотрудников
&НаСервереБезКонтекста
Функция ПолучитьСписокСотрудников(Ведомость, ДокКомпенсация)
Перем ПараметрыПолученияСотрудниковОрганизаций, СотрудникиВедомости;
ПараметрыПолученияСотрудниковОрганизаций = КадровыйУчет.ПараметрыПолученияСотрудниковОрганизацийПоСпискуФизическихЛиц();
ПараметрыПолученияСотрудниковОрганизаций.Организация = ДокКомпенсация.Организация;
ПараметрыПолученияСотрудниковОрганизаций.ОтбиратьПоГоловнойОрганизации = Ложь;
ПараметрыПолученияСотрудниковОрганизаций.Подразделение = ДокКомпенсация.Подразделение;
ПараметрыПолученияСотрудниковОрганизаций.НачалоПериода = НачалоМесяца(ДокКомпенсация.ПериодВзаиморасчетов);
ПараметрыПолученияСотрудниковОрганизаций.ОкончаниеПериода = КонецМесяца(ДокКомпенсация.ПериодВзаиморасчетов);
ПараметрыПолученияСотрудниковОрганизаций.РаботникиПоТрудовымДоговорам = Истина;
ПараметрыПолученияСотрудниковОрганизаций.РаботникиПоДоговорамГПХ = Неопределено;
ПараметрыПолученияСотрудниковОрганизаций.СписокФизическихЛиц = Ведомость.Состав.ВыгрузитьКолонку("ФизическоеЛицо");
КадровыйУчетРасширенный.ПрименитьОтборПоФункциональнойОпцииВыполнятьРасчетЗарплатыПоПодразделениям(ПараметрыПолученияСотрудниковОрганизаций);
СотрудникиВедомости = КадровыйУчет.СотрудникиОрганизации(Истина, ПараметрыПолученияСотрудниковОрганизаций).ВыгрузитьКолонку("Сотрудник");
Возврат СотрудникиВедомости;
КонецФункции
Расчет НДФЛ
&НаСервереБезКонтекста
Процедура РассчитатьНДФЛ(Сотрудники = Неопределено, ТолькоОбновитьНДФЛ = Ложь, ДокКомпенсация)
Если Сотрудники = Неопределено Тогда
Сотрудники = ОбщегоНазначения.ВыгрузитьКолонку(ДокКомпенсация.Начисления, "Сотрудник", Истина);
КонецЕсли;
Если ТипЗнч(Сотрудники) <> Тип("Массив") Тогда
Сотрудники = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(Сотрудники);
КонецЕсли;
ОбщегоНазначенияКлиентСервер.УдалитьЗначениеИзМассива(Сотрудники, Справочники.Сотрудники.ПустаяСсылка());
МассивСотрудников = ОбщегоНазначения.ВыгрузитьКолонку(ДокКомпенсация.Начисления, "Сотрудник", Истина);
ОбщегоНазначенияКлиентСервер.УдалитьЗначениеИзМассива(МассивСотрудников, Справочники.Сотрудники.ПустаяСсылка());
ФизическиеЛицаСотрудников = ОбщегоНазначения.ЗначениеРеквизитаОбъектов(МассивСотрудников, "ФизическоеЛицо");
ФизическиеЛицаКРасчету = Новый ТаблицаЗначений;
ФизическиеЛицаКРасчету.Колонки.Добавить("ФизическоеЛицо", Новый ОписаниеТипов("СправочникСсылка.ФизическиеЛица"));
ФизическиеЛицаКРасчету.Колонки.Добавить("Сотрудник", Новый ОписаниеТипов("СправочникСсылка.Сотрудники"));
Для Каждого Сотрудник Из Сотрудники Цикл
НоваяСтрока = ФизическиеЛицаКРасчету.Добавить();
НоваяСтрока.ФизическоеЛицо = ФизическиеЛицаСотрудников[Сотрудник];
НоваяСтрока.Сотрудник = Сотрудник;
КонецЦикла;
НастройкиРасчета = УчетПрочихДоходов.ПараметрыРасчетаДокумента();
НастройкиРасчета.СписокФизическихЛиц = ФизическиеЛицаКРасчету;
НастройкиРасчета.РасчетНДФЛНарастающимИтогомСНачалаГода = Истина;
НастройкиРасчета.РассчитатьНалогиИВзносы = Истина;
ПараметрыРасчета = УчетПрочихДоходов.ПараметрыРасчета(ДокКомпенсация, НастройкиРасчета);
РезультатРасчетаЗаполнитьНачисления(ПараметрыРасчета, ДокКомпенсация);
РезультатРасчета = Документы.КомпенсацияЗаЗадержкуЗарплаты.НДФЛ(ДокКомпенсация, ПараметрыРасчета);
РезультатРасчетаВДанныеФормы(РезультатРасчета, ДокКомпенсация);
КонецПроцедуры
Расчет НДФЛ тоже выполняется типовым методом модуля менеджера Документы.КомпенсацияЗаЗадержкуЗарплаты.НДФЛ(ДокКомпенсация, ПараметрыРасчета) и дальше обрабатывается для подстановки в созданный объект ДокКомпенсация (адаптирована типовая процедура).
Некоммерческая публикация.