Если сотрудник работал за месяц в разных обособленных подразделениях, при проведении документа «Начисление зарплаты» по первому из них программа сторнирует доход и НДФЛ, исчисленный документом «Начисление зарплаты за первую половину месяца» по обоим подразделениям, и записывает его на первое.
Запрос по доходам:
ВЫБРАТЬ
СведенияОДоходахНДФЛ.Регистратор КАК Регистратор,
СведенияОДоходахНДФЛ.ДатаПолученияДохода КАК ДатаПолученияДохода,
СведенияОДоходахНДФЛ.СуммаДохода КАК СуммаДохода,
СведенияОДоходахНДФЛ.Начисление КАК Начисление,
СведенияОДоходахНДФЛ.Подразделение КАК Подразделение,
СведенияОДоходахНДФЛ.Период КАК Период,
СведенияОДоходахНДФЛ.СуммаВычета КАК СуммаВычета,
СведенияОДоходахНДФЛ.Сотрудник.Код КАК СотрудникКод
ИЗ
РегистрНакопления.СведенияОДоходахНДФЛ КАК СведенияОДоходахНДФЛ
ГДЕ
СведенияОДоходахНДФЛ.ФизическоеЛицо = &ФизическоеЛицо
И СведенияОДоходахНДФЛ.Период >= &Период
ИТОГИ
СУММА(СуммаДохода),
СУММА(СуммаВычета)
ПО
Подразделение,
Регистратор
Результат:
Видим, что Начисление зарплаты №390(Отдел маркетинга) сторнировало доход по обоим подразделениям, в том числе и по Апт. пункту.
Теперь по налогу
Запрос:
ВЫБРАТЬ
РасчетыНалогоплательщиковСБюджетомПоНДФЛ.Регистратор КАК Регистратор,
РасчетыНалогоплательщиковСБюджетомПоНДФЛ.Сумма КАК Сумма,
РасчетыНалогоплательщиковСБюджетомПоНДФЛ.Подразделение КАК Подразделение,
РасчетыНалогоплательщиковСБюджетомПоНДФЛ.РасчетМежрасчетногоПериода КАК РасчетМежрасчетногоПериода,
РасчетыНалогоплательщиковСБюджетомПоНДФЛ.СуммаВыплаченногоДохода КАК СуммаВыплаченногоДохода,
РасчетыНалогоплательщиковСБюджетомПоНДФЛ.ВидДвижения КАК ВидДвижения
ИЗ
РегистрНакопления.РасчетыНалогоплательщиковСБюджетомПоНДФЛ КАК РасчетыНалогоплательщиковСБюджетомПоНДФЛ
ГДЕ
РасчетыНалогоплательщиковСБюджетомПоНДФЛ.ФизическоеЛицо = &ФизическоеЛицо
УПОРЯДОЧИТЬ ПО
Подразделение
Результат:
Сто рублей налога взяли с аванса в Апт. пункте, а сторнировали в отделе маркетинга.
Смысл исправлений: чтобы каждое начисление зарплаты сторнировало аванс(Доход и налог) только своего подразделения.
Общий модуль УчетНДФЛ
Процедура ДополнитьДвиженияСписаниемАванса(
После запроса из ВТАвансыНалоговКПогашению КАК ВыплаченныеАвансы
Результаты = Запрос.ВыполнитьПакет();
Результат = Результаты[2];
Если Не Результат.Пустой() Тогда
АвансыКЗачету = Результат.Выгрузить();
//Начало вставки
//при учете доходов идет перебор по СтрокаОкончательногоРасчета, откуда можно взять подразделение, а тут надо смотреть всю таблицу
КоличествоЭлементов = АвансыКЗачету.Количество();
Счетчик=0;
Пока Счетчик < КоличествоЭлементов Цикл
Струка = Новый Структура;
Струка.Вставить("ФизическоеЛицо",АвансыКЗачету[Счетчик].ФизическоеЛицо);
мСтрок = ДанныеОДоходахОкончательногоРасчета.НайтиСтроки(Струка);
Если мСтрок.Количество()=0 Тогда
Сообщить("Строки дохода не найдены");
Счетчик=Счетчик+1;
Продолжить;
КонецЕсли;
Найдено = Ложь;
Для каждого мт из мСтрок Цикл
Если мт.РегистрацияВНалоговомОргане = АвансыКЗачету[Счетчик].Подразделение.РегистрацияВНалоговомОргане Тогда
Найдено = Истина;
КонецЕсли;
КонеЦЦикла;
Если НЕ Найдено Тогда //
АвансыКЗачету.Удалить(Счетчик);
КоличествоЭлементов = КоличествоЭлементов - 1;
Иначе
Счетчик=Счетчик+1;
КонецЕсли;
КОнецЦикла;
//Конец вставки
Если Не Результаты[3].Пустой() Тогда // Авансы остались незачтенными из-за начисления в окончательный расчет недостаточных сумм.
СтрокиКПогашению = Результаты[3].Выгрузить();
ИндексироватьТаблицу = АвансыКЗачету.Количество() > 100;
ПоляОтбора = "ФизическоеЛицо,ЗарегистрированоПриНачисленииАванса,КатегорияДохода,СтавкаНалогообложенияРезидента,ВидДвижения,ВариантУдержания,Подразделение";
ЗачестьИсчисленныеНалогиВСчетОкончательногоРасчета(Неопределено, СтрокиКПогашению, АвансыКЗачету, ПоляОтбора, ИндексироватьТаблицу);
Если (АвансыКЗачету.Итог("Сумма") > 0 Или АвансыКЗачету.Итог("СуммаСПревышения") > 0) И (СтрокиКПогашению.Итог("Сумма") > 0 Или СтрокиКПогашению.Итог("СуммаСПревышения") > 0) Тогда
ПоляОтбора = "ФизическоеЛицо,ЗарегистрированоПриНачисленииАванса,КатегорияДохода,СтавкаНалогообложенияРезидента,ВидДвижения,ВариантУдержания";
ЗачестьИсчисленныеНалогиВСчетОкончательногоРасчета(Неопределено, СтрокиКПогашению, АвансыКЗачету, ПоляОтбора, ИндексироватьТаблицу);
КонецЕсли;
КонецЕсли;
Процедура ЗачестьАвансовыеДоходыВСчетОкончательногоРасчета(
с самого начала
ДобавлятьЗаписиВДвижения = НаборЗаписей <> Неопределено;
СтруктураОтбора = Новый Структура(ПоляОтбора);
Если ИндексироватьТаблицу Тогда
ДанныеОкончательногоРасчета.Индексы.Добавить(ПоляОтбора);
КонецЕсли;
Для каждого СтрокаАвансов Из АвансыКЗачету Цикл
Если СтрокаАвансов.СуммаДохода = 0 И СтрокаАвансов.СуммаВычета = 0 Тогда
Продолжить;
КонецЕсли;
ЗаполнитьЗначенияСвойств(СтруктураОтбора, СтрокаАвансов); //струкотб приемник!
Для каждого СтрокаОкончательногоРасчета Из ДанныеОкончательногоРасчета.НайтиСтроки(СтруктураОтбора) Цикл
Если СтрокаОкончательногоРасчета.СуммаДохода < 0 И СтрокаОкончательногоРасчета.СуммаВычета < 0 Тогда
Продолжить;
КонецЕсли;
//Начало вставки
Если НЕ СтрокаОкончательногоРасчета.Подразделение=СтрокаАвансов.Подразделение Тогда
Продолжить;
КонецЕсли;
//Конец вставки
СуммаДоходаКЗачету = Мин(СтрокаАвансов.СуммаДохода, СтрокаОкончательногоРасчета.СуммаДохода);
В результате Начисление зарплаты каждого подразделения сторнирует только свое:
И налоги после: