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