В 1С:Бухгалтерия 3.0 документы - "Корректировка поступления" и "Корректировка реализации" создают проводки аванса - 60.02 или 62.02 соответственно.
Это происходит в ситуации, когда корректируемый документ оплачен, но есть задолженности по этому договору, но по другим документам.
Расширение позволяет автоматически зачесть эту сумму "аванса" на задолженность других документов.
Т.е. при проведении "Корректировка поступления" и "Корректировка реализации" будет проводка взаимозачёта долга по другим документам этого договора, а не проводка аванса.
Работает в случае учёта на счетах 60/62 по субконто:
Контрагент / Договор / Документы расчетов
На данный момент отключить субконто "Документы расчетов с контрагентом" нельзя, это связано с учётом налогов. Из-за этого и возникают такие "авансы" !
Ниже решение, код которого можно использовать в Расширении.
Либо можно скачать готовое расширение во вложенном файле и установить в вашей базе Бухгалтерия 3.0.
Разрабатывалось и тестировалось на последней версии 1С:Бухгалтерия 3.0.161.хх
// Корректировка поступления
// перехватываем таблицу с данными, делаем зачёт денег по другим документам
&Перед("СформироватьДвиженияВыделениеАванса")
Процедура Корр_СформироватьДвиженияВыделениеАванса(ТаблицаВзаиморасчеты, ТаблицаРеквизиты, Движения, Отказ, ЭтоОтложенноеПроведение) Экспорт
Если Не ЗначениеЗаполнено(ТаблицаВзаиморасчеты)
Или Не ЗначениеЗаполнено(ТаблицаРеквизиты) Тогда
Возврат;
КонецЕсли;
Реквизиты = ТаблицаРеквизиты[0];
Если Реквизиты.СпособЗачетаАвансов = Перечисления.СпособыЗачетаАвансов.НеЗачитывать Тогда
Возврат;
КонецЕсли;
Если Не ЭтоОтложенноеПроведение
И ПроведениеСервер.ИспользуетсяОтложенноеПроведение(Реквизиты.Организация, Реквизиты.Период)
И Реквизиты.ВалютаВзаиморасчетов = ОбщегоНазначенияБПВызовСервераПовтИсп.ПолучитьВалютуРегламентированногоУчета()
И Не УчетВзаиморасчетов.ЭтоВидДоговораРасчетыПоКомиссии(Реквизиты.ВидДоговора) Тогда
// При включенном отложенном проведении в момент оперативного проведения остатки по рублевым взаиморасчетам не получаем,
// они будут актуализированы при выполнении отложенных расчетов.
Возврат;
КонецЕсли;
//Параметры = ПодготовитьПараметрыДвиженияВыделениеАванса(ТаблицаВзаиморасчеты, ТаблицаРеквизиты);
//Реквизиты = Параметры.Реквизиты[0];
Реквизиты = ТаблицаРеквизиты[0];
тзнОстаткиПоДоговору_6001 = ПолучитьОстатокЗадолженности_ПоДоговору(Реквизиты);
// по аналогии с типовым кодом - создаём Проводки зачёта суммы по задолженностям Договора
ОтражатьВНалоговомУчете = УчетнаяПолитика.ПлательщикНалогаНаПрибыль(Реквизиты.Организация, Реквизиты.Период);
ПрименениеПБУ18 = УчетнаяПолитика.ПоддержкаПБУ18(Реквизиты.Организация, Реквизиты.Период);
Проводки = Движения.Хозрасчетный;
// Для каждого СтрокаВзаиморасчетов Из Параметры.Взаиморасчеты Цикл
Для каждого СтрокаВзаиморасчетов Из ТаблицаВзаиморасчеты Цикл
Если СтрокаВзаиморасчетов.ДокументРасчетов = Реквизиты.Регистратор Тогда
////////////////////////////////////////////////////////////
СуммаДока_Осталось = СтрокаВзаиморасчетов.СуммаРуб;
СуммаВал_Осталось = СтрокаВзаиморасчетов.СуммаВзаиморасчетов;
Если СуммаДока_Осталось <= 0 Тогда
Продолжить;
КонецЕсли;
////////////////////////////////////////////////////////////
// наш цикл внутри, пока хватит сумм
// при этом мы уменьшим сумму цикла выше - СтрокаВзаиморасчетов
Для каждого СтрокаОстатки Из тзнОстаткиПоДоговору_6001 Цикл
Если СуммаДока_Осталось<=0 Тогда
Прервать;
КонецЕсли;
Если СтрокаОстатки.СуммаРуб<=0 Тогда
Продолжить;
КонецЕсли;
СписатьСумму = Мин(СуммаДока_Осталось, СтрокаОстатки.СуммаРуб);
СписатьСумму_Вал = Мин(СуммаВал_Осталось, СтрокаОстатки.СуммаВзаиморасчетов);
// корректируем остатки, если циклов будет несколько
СтрокаОстатки.СуммаРуб = СтрокаОстатки.СуммаРуб - СписатьСумму;
СуммаДока_Осталось = СуммаДока_Осталось - СписатьСумму;
СтрокаОстатки.СуммаВзаиморасчетов = СтрокаОстатки.СуммаВзаиморасчетов - СписатьСумму_Вал;
СуммаВал_Осталось = СуммаВал_Осталось - СписатьСумму_Вал;
////////////////////////////////////////////////////////////
Проводка = Проводки.Добавить();
Проводка.Период = Реквизиты.период;
Проводка.Организация = Реквизиты.Организация;
Проводка.Содержание = "Взаимозачет"; //Зачет аванса
Проводка.Сумма = СписатьСумму;
//СчетАванса = ?(ЗначениеЗаполнено(Реквизиты.СчетУчетаРасчетовПоАвансам),
// Реквизиты.СчетУчетаРасчетовПоАвансам,
// Реквизиты.СчетУчетаРасчетовСКонтрагентом);
//Проводка.СчетДт = СчетАванса;
Проводка.СчетДт = СтрокаОстатки.Счет;
БухгалтерскийУчет.УстановитьСубконто(Проводка.СчетДт, Проводка.СубконтоДт, "Контрагенты", Реквизиты.Контрагент);
//БухгалтерскийУчет.УстановитьСубконто(Проводка.СчетДт, Проводка.СубконтоДт, "Договоры", Реквизиты.ДоговорКонтрагента);
//БухгалтерскийУчет.УстановитьСубконто(Проводка.СчетДт, Проводка.СубконтоДт, "ДокументыРасчетовСКонтрагентами", Реквизиты.Регистратор);
БухгалтерскийУчет.УстановитьСубконто(Проводка.СчетДт, Проводка.СубконтоДт, "Договоры", СтрокаОстатки.ДоговорКонтрагента);
БухгалтерскийУчет.УстановитьСубконто(Проводка.СчетДт, Проводка.СубконтоДт, "ДокументыРасчетовСКонтрагентами", СтрокаОстатки.ДокументРасчетов);
Проводка.СчетКт = Реквизиты.СчетУчетаРасчетовСКонтрагентом;
БухгалтерскийУчет.УстановитьСубконто(Проводка.СчетКт, Проводка.СубконтоКт, "Контрагенты", Реквизиты.Контрагент);
БухгалтерскийУчет.УстановитьСубконто(Проводка.СчетКт, Проводка.СубконтоКт, "Договоры", Реквизиты.ДоговорКонтрагента);
БухгалтерскийУчет.УстановитьСубконто(Проводка.СчетКт, Проводка.СубконтоКт, "ДокументыРасчетовСКонтрагентами", Реквизиты.ДокументПоступленияСсылка);
СвойстваСчетаДт = БухгалтерскийУчетВызовСервераПовтИсп.ПолучитьСвойстваСчета(Проводка.СчетДт);
СвойстваСчетаКт = БухгалтерскийУчетВызовСервераПовтИсп.ПолучитьСвойстваСчета(Проводка.СчетКт);
Если СвойстваСчетаДт.Валютный Тогда
Проводка.ВалютаДт = Реквизиты.ВалютаВзаиморасчетов;
//Проводка.ВалютнаяСуммаДт = СтрокаВзаиморасчетов.СуммаВзаиморасчетов;
Проводка.ВалютнаяСуммаДт = СписатьСумму_Вал;
КонецЕсли;
Если СвойстваСчетаКт.Валютный Тогда
Проводка.ВалютаКт = Реквизиты.ВалютаВзаиморасчетов;
//Проводка.ВалютнаяСуммаКт = СтрокаВзаиморасчетов.СуммаВзаиморасчетов;
Проводка.ВалютнаяСуммаКт = СписатьСумму_Вал;
КонецЕсли;
Если СвойстваСчетаДт.УчетПоПодразделениям Тогда
Проводка.ПодразделениеДт = Реквизиты.Подразделение;
КонецЕсли;
Если СвойстваСчетаКт.УчетПоПодразделениям Тогда
Проводка.ПодразделениеКт = Реквизиты.Подразделение;
КонецЕсли;
Если ОтражатьВНалоговомУчете Тогда
//НалоговыйУчет.ЗаполнитьНалоговыеСуммыПроводки(СтрокаВзаиморасчетов.СуммаРуб, СтрокаВзаиморасчетов.СуммаРуб,,,,,
// Проводка, ПрименениеПБУ18);
НалоговыйУчет.ЗаполнитьНалоговыеСуммыПроводки(Проводка.Сумма, Проводка.Сумма,,,,,
Проводка, ПрименениеПБУ18);
КонецЕсли;
КонецЦикла; //остатки
// корректируем основоную таблицу, для будущих процедур
СтрокаВзаиморасчетов.СуммаРуб = СуммаДока_Осталось;
СтрокаВзаиморасчетов.СуммаВзаиморасчетов = СуммаВал_Осталось;
КонецЕсли;
КонецЦикла;
//удаляем нулевые
МассивСтрокУдалить = ТаблицаВзаиморасчеты.НайтиСтроки( Новый Структура("СуммаРуб", 0));
Для Каждого СтрокаУдалить Из МассивСтрокУдалить Цикл
ТаблицаВзаиморасчеты.Удалить(СтрокаУдалить);
КонецЦикла
КонецПроцедуры
Функция ПолучитьОстатокЗадолженности_ПоДоговору( Реквизиты )
Текст = "
|ВЫБРАТЬ
| Счет,
| Субконто1 КАК Контрагент,
| Субконто2 КАК ДоговорКонтрагента,
| Субконто3 КАК ДокументРасчетов,
| -СуммаОстаток КАК СуммаРуб,
| -ВалютнаяСуммаОстаток КАК СуммаВзаиморасчетов
//| ,ДоговорыКонтрагентов.ВалютаВзаиморасчетов КАК ВалютаВзаиморасчетов,
//| ДоговорыКонтрагентов.РасчетыВУсловныхЕдиницах КАК РасчетыВУсловныхЕдиницах
|ИЗ
| РегистрБухгалтерии.Хозрасчетный.Остатки(
| &Момент,
| Счет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.РасчетыСПоставщиками), //60.01
| &ВидыСубконтоСДокументами,
| Организация = &Организация И Субконто1 = &Контрагент И Субконто2 = &Договор И Субконто3 <> &ДокПоступления) // кроме дока в Корректировке
| КАК ХозрасчетныйОстатки
//| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
//| ПО Субконто2 = ДоговорыКонтрагентов.Ссылка
|ГДЕ
| СуммаОстаток < 0
|";
Запрос = Новый Запрос(Текст);
ВидыСубконтоСДокументами = Новый Массив();
ВидыСубконтоСДокументами.Добавить(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Контрагенты);
ВидыСубконтоСДокументами.Добавить(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Договоры);
ВидыСубконтоСДокументами.Добавить(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.ДокументыРасчетовСКонтрагентами);
// Установка параметров.
Запрос.УстановитьПараметр("ВидыСубконтоСДокументами", ВидыСубконтоСДокументами);
Запрос.УстановитьПараметр("Организация", Реквизиты.Организация);
Запрос.УстановитьПараметр("Контрагент", Реквизиты.Контрагент);
Запрос.УстановитьПараметр("Договор", Реквизиты.ДоговорКонтрагента);
Запрос.УстановитьПараметр("ДокПоступления", Реквизиты.ДокументПоступленияСсылка);
Запрос.УстановитьПараметр("Момент", Реквизиты.Регистратор.МоментВремени() );
Возврат Запрос.Выполнить().Выгрузить();
КонецФункции
// КорректировкаРеализации
// перехватываем таблицу с данными, делаем зачёт денег по другим документам
&Перед("СформироватьДвиженияВыделениеАванса")
Процедура КоррПост_СформироватьДвиженияВыделениеАванса(ТаблицаВзаиморасчеты, ТаблицаРеквизиты, Движения, Отказ, ЭтоОтложенноеПроведение)
#Область ТиповойКусок
Если Не ЗначениеЗаполнено(ТаблицаВзаиморасчеты)
Или Не ЗначениеЗаполнено(ТаблицаРеквизиты) Тогда
Возврат;
КонецЕсли;
Реквизиты = ТаблицаРеквизиты[0];
Если Реквизиты.СпособЗачетаАвансов = Перечисления.СпособыЗачетаАвансов.НеЗачитывать Тогда
Возврат;
КонецЕсли;
Если ПроведениеСервер.ИспользуетсяОтложенноеПроведение(Реквизиты.Организация, Реквизиты.Период)
И НЕ ЭтоОтложенноеПроведение
И Реквизиты.ВалютаВзаиморасчетов = ОбщегоНазначенияБПВызовСервераПовтИсп.ПолучитьВалютуРегламентированногоУчета()
И НЕ УчетВзаиморасчетов.ЭтоВидДоговораРасчетыПоКомиссии(Реквизиты.ВидДоговора) Тогда
// При включенном отложенном проведении в момент оперативного проведения остатки по рублевым взаиморасчетам не получаем,
// они будут актуализированы при выполнении отложенных расчетов.
Возврат;
КонецЕсли;
//Параметры = ПодготовитьПараметрыДвиженияВыделениеАванса(ТаблицаВзаиморасчеты, ТаблицаРеквизиты);
//Реквизиты = Параметры.Реквизиты[0];
#КонецОбласти
Реквизиты = ТаблицаРеквизиты[0];
тзнОстаткиПоДоговору_6201 = ПолучитьОстатокЗадолженности_ПоДоговору(Реквизиты);
ОтражатьВНалоговомУчете = УчетнаяПолитика.ПлательщикНалогаНаПрибыль(Реквизиты.Организация, Реквизиты.Период);
ПрименениеПБУ18 = УчетнаяПолитика.ПоддержкаПБУ18(Реквизиты.Организация, Реквизиты.Период);
Проводки = Движения.Хозрасчетный;
// Для каждого СтрокаВзаиморасчетов Из Параметры.Взаиморасчеты Цикл
Для каждого СтрокаВзаиморасчетов Из ТаблицаВзаиморасчеты Цикл
Если СтрокаВзаиморасчетов.ДокументРасчетов = Реквизиты.Регистратор Тогда
////////////////////////////////////////////////////////////
СуммаДока_Осталось = СтрокаВзаиморасчетов.СуммаРуб;
СуммаВал_Осталось = СтрокаВзаиморасчетов.СуммаВзаиморасчетов;
Если СуммаДока_Осталось <= 0 Тогда
Продолжить;
КонецЕсли;
////////////////////////////////////////////////////////////
// наш цикл внутри, пока хватит сумм
// при этом мы уменьшим сумму цикла выше - СтрокаВзаиморасчетов
Для каждого СтрокаОстатки Из тзнОстаткиПоДоговору_6201 Цикл
Если СуммаДока_Осталось<=0 Тогда
Прервать;
КонецЕсли;
Если СтрокаОстатки.СуммаРуб<=0 Тогда
Продолжить;
КонецЕсли;
СписатьСумму = Мин(СуммаДока_Осталось, СтрокаОстатки.СуммаРуб);
СписатьСумму_Вал = Мин(СуммаВал_Осталось, СтрокаОстатки.СуммаВзаиморасчетов);
// корректируем остатки, если циклов будет несколько
СтрокаОстатки.СуммаРуб = СтрокаОстатки.СуммаРуб - СписатьСумму;
СуммаДока_Осталось = СуммаДока_Осталось - СписатьСумму;
СтрокаОстатки.СуммаВзаиморасчетов = СтрокаОстатки.СуммаВзаиморасчетов - СписатьСумму_Вал;
СуммаВал_Осталось = СуммаВал_Осталось - СписатьСумму_Вал;
////////////////////////////////////////////////////////////
// типовой код
Проводка = Проводки.Добавить();
Проводка.Период = Реквизиты.период;
Проводка.Организация = Реквизиты.Организация;
// Проводка.Содержание = "Выделение аванса покупателя";
// Проводка.Сумма = СтрокаВзаиморасчетов.СуммаРуб;
// Доработка
Проводка.Содержание = "Взаимозачет";
Проводка.Сумма = СписатьСумму;
//СчетАванса = ?(ЗначениеЗаполнено(Реквизиты.СчетУчетаРасчетовПоАвансам),
//Реквизиты.СчетУчетаРасчетовПоАвансам,
//Реквизиты.СчетУчетаРасчетовСКонтрагентом);
Проводка.СчетДт = Реквизиты.СчетУчетаРасчетовСКонтрагентом;
БухгалтерскийУчет.УстановитьСубконто(Проводка.СчетДт, Проводка.СубконтоДт, "Контрагенты", Реквизиты.Контрагент);
БухгалтерскийУчет.УстановитьСубконто(Проводка.СчетДт, Проводка.СубконтоДт, "Договоры", Реквизиты.ДоговорКонтрагента);
БухгалтерскийУчет.УстановитьСубконто(Проводка.СчетДт, Проводка.СубконтоДт, "ДокументыРасчетовСКонтрагентами", Реквизиты.ДокументРеализацииСсылка);
//Проводка.СчетКт = СчетАванса;
//БухгалтерскийУчет.УстановитьСубконто(Проводка.СчетКт, Проводка.СубконтоКт, "Контрагенты", Реквизиты.Контрагент);
//БухгалтерскийУчет.УстановитьСубконто(Проводка.СчетКт, Проводка.СубконтоКт, "Договоры", Реквизиты.ДоговорКонтрагента);
//БухгалтерскийУчет.УстановитьСубконто(Проводка.СчетКт, Проводка.СубконтоКт, "ДокументыРасчетовСКонтрагентами", Реквизиты.Регистратор);
// Доработка
Проводка.СчетКт = СтрокаОстатки.Счет;
БухгалтерскийУчет.УстановитьСубконто(Проводка.СчетКт, Проводка.СубконтоКт, "Контрагенты", Реквизиты.Контрагент);
БухгалтерскийУчет.УстановитьСубконто(Проводка.СчетКт, Проводка.СубконтоКт, "Договоры", СтрокаОстатки.ДоговорКонтрагента);
БухгалтерскийУчет.УстановитьСубконто(Проводка.СчетКт, Проводка.СубконтоКт, "ДокументыРасчетовСКонтрагентами", СтрокаОстатки.ДокументРасчетов);
СвойстваСчетаДт = БухгалтерскийУчетВызовСервераПовтИсп.ПолучитьСвойстваСчета(Проводка.СчетДт);
СвойстваСчетаКт = БухгалтерскийУчетВызовСервераПовтИсп.ПолучитьСвойстваСчета(Проводка.СчетКт);
Если СвойстваСчетаДт.Валютный Тогда
Проводка.ВалютаДт = Реквизиты.ВалютаВзаиморасчетов;
// Проводка.ВалютнаяСуммаДт = СтрокаВзаиморасчетов.СуммаВзаиморасчетов;
// Доработка
Проводка.ВалютнаяСуммаДт = СписатьСумму_Вал;
КонецЕсли;
Если СвойстваСчетаКт.Валютный Тогда
Проводка.ВалютаКт = Реквизиты.ВалютаВзаиморасчетов;
// Проводка.ВалютнаяСуммаКт = СтрокаВзаиморасчетов.СуммаВзаиморасчетов;
// Доработка
Проводка.ВалютнаяСуммаКт = СписатьСумму_Вал;
КонецЕсли;
Если СвойстваСчетаДт.УчетПоПодразделениям Тогда
Проводка.ПодразделениеДт = Реквизиты.Подразделение;
КонецЕсли;
Если СвойстваСчетаКт.УчетПоПодразделениям Тогда
Проводка.ПодразделениеКт = Реквизиты.Подразделение;
КонецЕсли;
Если ОтражатьВНалоговомУчете Тогда
// НалоговыйУчет.ЗаполнитьНалоговыеСуммыПроводки(СтрокаВзаиморасчетов.СуммаРуб, СтрокаВзаиморасчетов.СуммаРуб,,,,,
// Проводка, ПрименениеПБУ18);
// Доработка
НалоговыйУчет.ЗаполнитьНалоговыеСуммыПроводки(Проводка.Сумма, Проводка.Сумма,,,,,
Проводка, ПрименениеПБУ18);
КонецЕсли;
// Доработка
КонецЦикла; //остатки
// Доработка
// корректируем основоную таблицу, для будущих процедур
СтрокаВзаиморасчетов.СуммаРуб = СуммаДока_Осталось;
СтрокаВзаиморасчетов.СуммаВзаиморасчетов = СуммаВал_Осталось;
КонецЕсли;
КонецЦикла;
// Доработка
// удаляем нулевые строки, по сути зачтённые авансы
МассивСтрокУдалить = ТаблицаВзаиморасчеты.НайтиСтроки( Новый Структура("СуммаРуб", 0));
Для Каждого СтрокаУдалить Из МассивСтрокУдалить Цикл
ТаблицаВзаиморасчеты.Удалить(СтрокаУдалить);
КонецЦикла
КонецПроцедуры
Функция ПолучитьОстатокЗадолженности_ПоДоговору( Реквизиты )
Текст = "
|ВЫБРАТЬ
| Счет,
| Субконто1 КАК Контрагент,
| Субконто2 КАК ДоговорКонтрагента,
| Субконто3 КАК ДокументРасчетов,
| СуммаОстаток КАК СуммаРуб,
| ВалютнаяСуммаОстаток КАК СуммаВзаиморасчетов
//| ,ДоговорыКонтрагентов.ВалютаВзаиморасчетов КАК ВалютаВзаиморасчетов,
//| ДоговорыКонтрагентов.РасчетыВУсловныхЕдиницах КАК РасчетыВУсловныхЕдиницах
|ИЗ
| РегистрБухгалтерии.Хозрасчетный.Остатки(
| &Момент,
| Счет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.РасчетыСПокупателями), //62.01
| &ВидыСубконтоСДокументами,
| Организация = &Организация И Субконто1 = &Контрагент И Субконто2 = &Договор И Субконто3 <> &ДокСсылка) // кроме дока в Корректировке
| КАК ХозрасчетныйОстатки
|ГДЕ
| СуммаОстаток > 0
|УПОРЯДОЧИТЬ ПО Субконто3 АВТОУПОРЯДОЧИВАНИЕ
|";
Запрос = Новый Запрос(Текст);
ВидыСубконтоСДокументами = Новый Массив();
ВидыСубконтоСДокументами.Добавить(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Контрагенты);
ВидыСубконтоСДокументами.Добавить(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Договоры);
ВидыСубконтоСДокументами.Добавить(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.ДокументыРасчетовСКонтрагентами);
// Установка параметров.
Запрос.УстановитьПараметр("ВидыСубконтоСДокументами", ВидыСубконтоСДокументами);
Запрос.УстановитьПараметр("Организация", Реквизиты.Организация);
Запрос.УстановитьПараметр("Контрагент", Реквизиты.Контрагент);
Запрос.УстановитьПараметр("Договор", Реквизиты.ДоговорКонтрагента);
Запрос.УстановитьПараметр("ДокСсылка", Реквизиты.ДокументРеализацииСсылка);
Запрос.УстановитьПараметр("Момент", Реквизиты.Регистратор.МоментВремени() );
Возврат Запрос.Выполнить().Выгрузить();
КонецФункции
Проверено на следующих конфигурациях и релизах:
- Бухгалтерия предприятия, редакция 3.0, релизы 3.0.161.22