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