Счет-фактура выданный / Зачет авансов / Модуль формы

файл
#Область ОбработчикиСобытийФормы

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	Если Параметры.Свойство("АвтоТест") Тогда // Возврат при получении формы для анализа.
		Возврат;
	КонецЕсли;

	Параметры.Свойство("Организация", Организация);
	Параметры.Свойство("Контрагент",  Контрагент);
	Параметры.Свойство("Договор",     Договор);
	Параметры.Свойство("СчетФактура", СчетФактура);
	Параметры.Свойство("СчетФактураОснование", СчетФактураОснование);
	Параметры.Свойство("Исправление",          Исправление);
	Параметры.Свойство("НомерИсправления",     НомерИсправления);
	Параметры.Свойство("ВалютаВзаиморасчетов",  ВалютаВзаиморасчетов);
	Параметры.Свойство("ДокументОснование",     ДокументОснование);
	Параметры.Свойство("СуммаКОплате",          СуммаВзаиморасчетов);
	Параметры.Свойство("СуммаРучногоВосстановленияАванса",  СуммаРучногоВосстановленияАванса);
	
	Если Параметры.Свойство("АдресВХранилище") Тогда
		ПлатежноРасчетныеДокументы.Загрузить(ПолучитьИзВременногоХранилища(Параметры.АдресВХранилище));
	КонецЕсли;
	
	ВалютаРегламентированногоУчета = ЗначениеНастроекПовтИсп.ВалютаРегламентированногоУчетаОрганизации(Организация);
	
	ЗаполнитьТаблицыЗачетаАвансов();
	
	УправлениеЭлементамиФормы();

	СобытияФорм.ПриСозданииНаСервере(ЭтотОбъект, Отказ, СтандартнаяОбработка);
	
КонецПроцедуры

&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
	
	Если ПринудительноЗакрытьФорму Или ЗавершениеРаботы Тогда
		Возврат;
	КонецЕсли;
	
	Если Модифицированность Тогда 
		
		Отказ = Истина;
			ПоказатьВопрос(
				Новый ОписаниеОповещения("ПередЗакрытиемВопросЗавершение", ЭтотОбъект),
				НСтр("ru = 'Данные зачета авансов были изменены. Сохранить изменения?'"),
				РежимДиалогаВопрос.ДаНетОтмена);
				
			Возврат;
		
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормыЗачтено

&НаКлиенте
Процедура ЗачтеноПередНачаломИзменения(Элемент, Отказ)
	
	ТекущиеДанные = Элементы.Зачтено.ТекущиеДанные;
	СуммаПередРедактированием = ТекущиеДанные.СуммаЗачтено;
	
КонецПроцедуры

&НаКлиенте
Процедура ЗачтеноПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования)
	
	ТекущиеДанные = Элементы.Зачтено.ТекущиеДанные;
	Если ТекущиеДанные.СуммаЗачтено <> СуммаПередРедактированием Тогда
		
		ОчиститьСообщения();
		Отказ = Ложь;
		
		ИзменениеСуммы = СуммаПередРедактированием - ТекущиеДанные.СуммаЗачтено;
		
		Если ИзменениеСуммы < 0 Тогда
			ТекущиеДанные.СуммаЗачтено = СуммаПередРедактированием;
			ТекстПредупреждения = НСтр("ru = 'Зачтенная сумма не может быть увеличена'");
			ПоказатьПредупреждение(, ТекстПредупреждения);
			Возврат;
		КонецЕсли;
		
		СтрокаТаблицы = Элементы.Зачтено.ТекущаяСтрока;
		СоответствиеСписания = Новый Соответствие;
		СоответствиеСписания.Вставить(СтрокаТаблицы, ИзменениеСуммы);
		ОтменитьЗачетНаСервере(СоответствиеСписания, , Отказ);
		
		Если Отказ Тогда
			ТекущиеДанные.СуммаЗачтено = СуммаПередРедактированием;
		КонецЕсли;
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ЗачтеноВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	
	Если Поле.Имя = "ЗачтеноДокументОплаты" И ЗначениеЗаполнено(Элемент.ТекущиеДанные.ДокументОплаты) Тогда
		ПоказатьЗначение(, Элемент.ТекущиеДанные.ДокументОплаты);
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормыАвансы

&НаКлиенте
Процедура АвансыВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	
	Если Поле.Имя = "АвансыДокументОплаты" Тогда
		
		СтрокаТаблицы = Элементы.Авансы.ТекущиеДанные;
		Если СтрокаТаблицы <> Неопределено И ЗначениеЗаполнено(СтрокаТаблицы.ДокументОплаты) Тогда
			ПоказатьЗначение(Неопределено, СтрокаТаблицы.ДокументОплаты);
		КонецЕсли;
		
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиКомандФормы

&НаКлиенте
Процедура ЗачестьОплату(Команда)
	
	ВыполнитьЗачетОплат();
	
КонецПроцедуры

&НаКлиенте
Процедура ЗачестьПлатеж(Команда)
	
	ОчиститьСообщения();
	
	МассивСтрок = Элементы.Авансы.ВыделенныеСтроки;
	Если МассивСтрок.Количество() > 0 Тогда
		
		ОчиститьСообщения();
		ТекстОшибки = НСтр("ru='Сумма к оплате полностью зачтена.'");
		
		Если Недостает <= 0 Тогда
			
			ОбщегоНазначенияКлиент.СообщитьПользователю(ТекстОшибки);
			Возврат;
			
		КонецЕсли;
		
		ЗачестьПлатежНаСервере(МассивСтрок);
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура Обновить(Команда)
	ОбновитьНаСервере();
КонецПроцедуры

&НаКлиенте
Процедура ОтменитьЗачет(Команда)
	
	МассивСтрок = Элементы.Зачтено.ВыделенныеСтроки;
	Если МассивСтрок.Количество() > 0 Тогда
	
		ОчиститьСообщения();
		
		СоответствиеСписания = Новый Соответствие;
		Для Каждого Строка Из МассивСтрок Цикл
			СоответствиеСписания.Вставить(Строка, 0);
		КонецЦикла;
		
		ОтменитьЗачетНаСервере(СоответствиеСписания, Ложь);
		
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

#Область ОбработчикиКоманд

&НаСервере
Процедура ЗачестьПлатежНаСервере(МассивСтрок)
	
	СписокСтрок = Новый СписокЗначений;
	Для Каждого НомерСтроки Из МассивСтрок Цикл
		СтрокаТаблицы = Авансы.НайтиПоИдентификатору(НомерСтроки);
		Если СтрокаТаблицы <> Неопределено Тогда
			СписокСтрок.Добавить(СтрокаТаблицы, Авансы.Индекс(СтрокаТаблицы));
		КонецЕсли;
	КонецЦикла;
	
	СписокСтрок.СортироватьПоПредставлению();
	
	КоличествоОбработанныхДанных = 0;
	Для Каждого Строка Из СписокСтрок Цикл
		
		СтрокаТаблицы = Строка.Значение;
		КоличествоОбработанныхДанных = КоличествоОбработанныхДанных + 1;
		
		СуммаКЗачету     = СтрокаТаблицы.ДоступноКЗачету;
		СуммаКЗачетуРегл = СтрокаТаблицы.ДоступноКЗачетуРегл;
		
		Если Недостает > 0 Тогда 
			
			СуммаБазиса  = СтрокаТаблицы.ДоступноКЗачету;
			СуммаКЗачету = ВзаиморасчетыСервер.СписатьСумму(СтрокаТаблицы.ДоступноКЗачету, Недостает);
			СуммаКЗачетуРегл = ВзаиморасчетыСервер.СписатьСуммуПропорционально(
					СтрокаТаблицы.ДоступноКЗачетуРегл,
					СуммаКЗачету,
					СуммаБазиса);
					
		Иначе
			
			СтрокаТаблицы.ДоступноКЗачету = 0;
			
		КонецЕсли;
		
		Если СуммаКЗачету = 0 Тогда
			Прервать;
		КонецЕсли;
		
		СтруктураПоиска = Новый Структура("ОбъектРасчетов, ДокументОплаты", СтрокаТаблицы.ОбъектРасчетов, СтрокаТаблицы.ДокументОплаты);
		
		ЗачтенныеСтроки = Зачтено.НайтиСтроки(СтруктураПоиска);
		
		Если ЗачтенныеСтроки.Количество() = 0 Тогда
			СтрокаЗачета = Зачтено.Добавить();
			ЗаполнитьЗначенияСвойств(СтрокаЗачета, СтрокаТаблицы);
		Иначе
			СтрокаЗачета = ЗачтенныеСтроки[0];
		КонецЕсли;
		
		СтрокаЗачета.СуммаЗачтено = СтрокаЗачета.СуммаЗачтено + СуммаКЗачету;
		СтрокаЗачета.СуммаЗачтеноРегл = СтрокаЗачета.СуммаЗачтеноРегл + СуммаКЗачетуРегл;
		
		СтрокаЗачета.ДанныеИзменены = Истина;
		
		Если СтрокаТаблицы.ДоступноКЗачету = 0 Тогда
			Авансы.Удалить(СтрокаТаблицы);
		Иначе
			СтрокаТаблицы.ДанныеИзменены = Ложь;
		КонецЕсли;
		
	КонецЦикла;
	
	РассчитатьСуммуЗачета();
	Зачтено.Сортировать("ДокументОплаты");
	
КонецПроцедуры

&НаСервере
Процедура ОбновитьНаСервере()
	
	ЗаполнитьТаблицыЗачетаАвансов();
	
КонецПроцедуры

&НаСервере
Процедура ОтменитьЗачетНаСервере(СоответствиеСтрок, СуммаСтрокиИзменена = Истина, Отказ = Ложь)
	
	МассивСтрок = Новый Массив;
	Для Каждого ЭлементСтроки Из СоответствиеСтрок Цикл
		МассивСтрок.Добавить(ЭлементСтроки.Ключ);
	КонецЦикла;
	
	Для Каждого ЭлементСтроки Из СоответствиеСтрок Цикл
		
		СтрокаТаблицы = Зачтено.НайтиПоИдентификатору(ЭлементСтроки.Ключ);
		
		Если СтрокаТаблицы = Неопределено Тогда
			Продолжить;
		КонецЕсли;
		
		СуммаКОтмене = ЭлементСтроки.Значение;
		СуммаБазиса  = СтрокаТаблицы.СуммаЗачтено + ?(СуммаСтрокиИзменена, СуммаКОтмене, 0);
		
		Если СуммаКОтмене = 0 Тогда
			СуммаКОтмене = СтрокаТаблицы.СуммаЗачтено;
			СтрокаТаблицы.СуммаЗачтено = 0;
		ИначеЕсли Не СуммаСтрокиИзменена Тогда
			СтрокаТаблицы.СуммаЗачтено = СтрокаТаблицы.СуммаЗачтено - СуммаКОтмене;
		КонецЕсли;
		
		СуммаКОтменеРегл = ВзаиморасчетыСервер.СписатьСуммуПропорционально(
					СтрокаТаблицы.СуммаЗачтеноРегл,
					СуммаКОтмене,
					СуммаБазиса);
					
		СтруктураПоиска = Новый Структура("ДокументОплаты, ОбъектРасчетов");
		ЗаполнитьЗначенияСвойств(СтруктураПоиска, СтрокаТаблицы);
		НайденныеСтроки = Авансы.НайтиСтроки(СтруктураПоиска);
		
		Если НайденныеСтроки.Количество() = 0 Тогда
			СтрокаАванса = Авансы.Добавить();
			ЗаполнитьЗначенияСвойств(СтрокаАванса, СтрокаТаблицы);
			РеквизитыОплаты = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(СтрокаАванса.ОбъектРасчетов, "Валюта, Сумма");
			СтрокаАванса.Валюта = РеквизитыОплаты.Валюта;
			СтрокаАванса.СуммаДокумента = РеквизитыОплаты.Сумма;
		Иначе
			СтрокаАванса = НайденныеСтроки[0];
		КонецЕсли;
		
		СтрокаАванса.ДоступноКЗачету     = СтрокаАванса.ДоступноКЗачету + СуммаКОтмене;
		СтрокаАванса.ДоступноКЗачетуРегл = СтрокаАванса.ДоступноКЗачетуРегл + СуммаКОтменеРегл;
		
		СтрокаАванса.НесохраненныеДанные = Истина;
		
		Если СтрокаТаблицы.СуммаЗачтено = 0 Тогда
			Зачтено.Удалить(СтрокаТаблицы);
			СтрокаАванса.ДанныеИзменены = Истина;
		Иначе
			СтрокаТаблицы.ДанныеИзменены = Истина;
			СтрокаАванса.ДанныеИзменены = Ложь;
		КонецЕсли;
		
	КонецЦикла;
	
	РассчитатьСуммуЗачета();
	Авансы.Сортировать("ДокументОплаты");
	
КонецПроцедуры

#КонецОбласти

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

&НаСервере
Процедура ИнициализироватьЗапрос(Запрос)
	
	Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
	
	Запрос.УстановитьПараметр("Организация", Организация);
	Запрос.УстановитьПараметр("Контрагент",  Контрагент);
	Запрос.УстановитьПараметр("Договор",     Договор);
	Запрос.УстановитьПараметр("Валюта",      ВалютаВзаиморасчетов);
	Запрос.УстановитьПараметр("Ссылка",      СчетФактура);
	ПараметрыСчетаФактуры = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(СчетФактура, "Исправление, Корректировочный, СчетФактураОснование, ДокументОснование, Дата");
	ПараметрыСчетаФактуры.Вставить("Период", ПараметрыСчетаФактуры.Дата);
	ПараметрыСчетаФактуры.Удалить("Дата");
	Запрос.УстановитьПараметр("ДатаОтгрузки", Новый Граница(Документы.СчетФактураВыданный.ОпределитьДатуОтгрузки(ПараметрыСчетаФактуры), ВидГраницы.Включая));
	Запрос.УстановитьПараметр("СчетФактураОснование",      СчетФактураОснование);
	Запрос.УстановитьПараметр("Исправление",               Исправление);
	Запрос.УстановитьПараметр("НомерИсправления",          НомерИсправления);
	
	УстановитьПараметрЗапросаИсправляемыйСчетФактура(Запрос);
	
	Запрос.Текст = "ВЫБРАТЬ
	|	АналитикаПоПартнерам.КлючАналитики КАК КлючАналитики,
	|	АналитикаПоПартнерам.Партнер КАК Партнер,
	|	АналитикаПоПартнерам.Организация КАК Организация,
	|	АналитикаПоПартнерам.Контрагент КАК Контрагент,
	|	АналитикаПоПартнерам.Договор КАК Договор
	|ПОМЕСТИТЬ ВтАналитикаУчетаПоПартнерам
	|ИЗ
	|	РегистрСведений.АналитикаУчетаПоПартнерам КАК АналитикаПоПартнерам
	|ГДЕ
	|	АналитикаПоПартнерам.Организация В(&Организация)
	|	И АналитикаПоПартнерам.Договор В(&Договор)
	|	И АналитикаПоПартнерам.Контрагент В(&Контрагент)
	|
	|ИНДЕКСИРОВАТЬ ПО
	|	КлючАналитики";
	
	Запрос.Выполнить();
	
КонецПроцедуры

&НаСервере
Процедура УправлениеЭлементамиФормы()
	
	Элементы.АвансыДоступноКЗачетуРегл.Видимость = ВалютаВзаиморасчетов <> ВалютаРегламентированногоУчета;
	Элементы.ЗачтеноСуммаЗачтеноРегл.Видимость   = ВалютаВзаиморасчетов <> ВалютаРегламентированногоУчета;
	Элементы.СуммаРучногоВосстановленияАванса.Доступность = Исправление Или СуммаВзаиморасчетов < 0;
	
	Элементы.АвансыДоступноКЗачету.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
		НСтр("ru = 'Доступно (%1)'"),
		Строка(ВалютаВзаиморасчетов));
	Элементы.ЗачтеноСуммаЗачтено.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
		НСтр("ru = 'Зачтено (%1)'"),
		Строка(ВалютаВзаиморасчетов));
	
КонецПроцедуры

&НаСервере
Процедура РассчитатьСуммуЗачета()
	
	СуммаЗачета = Зачтено.Итог("СуммаЗачтено");
	
	Если СуммаЗачета < СуммаВзаиморасчетов Тогда
		Недостает = СуммаВзаиморасчетов - СуммаЗачета;
		Превышение = 0;
	ИначеЕсли СуммаЗачета > 0 Тогда 
		Недостает = 0;
		Превышение = СуммаЗачета - СуммаВзаиморасчетов;
	Иначе
		Недостает = 0;
		Превышение = 0;
	КонецЕсли;
	
	СуммаКОплате = ?(СуммаВзаиморасчетов < 0, 0, СуммаВзаиморасчетов);
	
	ОбновитьИнформационнуюНадписьИтогов();
	
КонецПроцедуры

&НаКлиенте
Процедура ВыполнитьЗачетОплат()
	
	ЕстьОшибки = Ложь;
	ОчиститьСообщения();
	ЗаполнитьПлатежноРасчетныеДокументы(ЕстьОшибки);
	
	Если Не ЕстьОшибки Тогда
		Модифицированность = Ложь;
		ПринудительноЗакрытьФорму = Истина;
		Закрыть(ПоместитьПлатежноРасчетныеДокументыВХранилище());
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьПлатежноРасчетныеДокументы(ЕстьОшибки)
	
	ПроверитьЗаполнениеТабличнойЧасти(ЕстьОшибки);
	
	Если Не ЕстьОшибки Тогда
	
		ПлатежноРасчетныеДокументы.Очистить();
	
		Для Каждого СтрокаЗачета Из Зачтено Цикл 
		
			НоваяСтрока = ПлатежноРасчетныеДокументы.Добавить();
			ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаЗачета, "НомерПлатежноРасчетногоДокумента, ДатаПлатежноРасчетногоДокумента, ОбъектРасчетов");
			НоваяСтрока.РасчетныйДокумент  = СтрокаЗачета.ДокументОплаты;
			НоваяСтрока.Сумма              = СтрокаЗачета.СуммаЗачтено;
			НоваяСтрока.СуммаРегл          = СтрокаЗачета.СуммаЗачтеноРегл;
		
		КонецЦикла;
		
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Процедура ПроверитьЗаполнениеТабличнойЧасти(Отказ)
	
	Для ТекИндекс = 0 По Зачтено.Количество()-1 Цикл
		
		Если ПустаяСтрока(Зачтено[ТекИндекс].НомерПлатежноРасчетногоДокумента) Тогда
			ТекстОшибки = НСтр("ru='Не заполнен номер документа в строке %НомерСтроки%'");
			ТекстОшибки = СтрЗаменить(ТекстОшибки,"%НомерСтроки%",ТекИндекс+1);
			ОбщегоНазначения.СообщитьПользователю(
				ТекстОшибки,
				,
				ОбщегоНазначенияКлиентСервер.ПутьКТабличнойЧасти("Зачтено", ТекИндекс+1, "НомерПлатежноРасчетногоДокумента"),
				,
				Отказ);
		КонецЕсли;
		
		Если Зачтено[ТекИндекс].ДатаПлатежноРасчетногоДокумента = Дата('00010101') Тогда
			ТекстОшибки = НСтр("ru='Не заполнена дата документа в строке %НомерСтроки%'");
			ТекстОшибки = СтрЗаменить( ТекстОшибки,"%НомерСтроки%",ТекИндекс+1);
			ОбщегоНазначения.СообщитьПользователю(
				ТекстОшибки ,
				,
				ОбщегоНазначенияКлиентСервер.ПутьКТабличнойЧасти("Зачтено", ТекИндекс+1, "ДатаПлатежноРасчетногоДокумента"),
				,
				Отказ);
		КонецЕсли;
		
	КонецЦикла;
	
КонецПроцедуры

&НаСервере
Функция ПоместитьПлатежноРасчетныеДокументыВХранилище()
	
	СтруктураВозврата = Новый Структура;
	СтруктураВозврата.Вставить("ПлатежноРасчетныеДокументы", ПоместитьВоВременноеХранилище(ПлатежноРасчетныеДокументы.Выгрузить()));
	СтруктураВозврата.Вставить("СуммаРучногоВосстановленияАванса", СуммаРучногоВосстановленияАванса);
	
	Возврат СтруктураВозврата;
	
КонецФункции

&НаСервере
Процедура ОбновитьИнформационнуюНадписьИтогов()

	МассивСтрок = Новый Массив;
	
	МассивСтрок.Добавить(НСтр("ru = '<span style=""color: %1; font: %2"">Сумма к оплате %3.</span>'"));
	МассивСтрок.Добавить(НСтр("ru = '<span style=""color: %1; font: %2"">Зачтено на сумму %4.</span>'"));
	
	ШаблонИнформационнойНадписи = СтрСоединить(МассивСтрок, "   ");
	ИнформационнаяНадпись = СтроковыеФункции.ФорматированнаяСтрока(
			ШаблонИнформационнойНадписи,
			Метаданные.ЭлементыСтиля.ГиперссылкаЦвет.Имя,
			Метаданные.ЭлементыСтиля.ЖирныйШрифт.Имя,
			ФормированиеПечатныхФорм.ФорматСумм(СуммаКОплате, ВалютаВзаиморасчетов, "0,00"),
			ФормированиеПечатныхФорм.ФорматСумм(СуммаЗачета, ВалютаВзаиморасчетов, "0,00"));
	
	Если Недостает > 0 Тогда 
		ШаблонСтрокиПревышение = НСтр("ru = '<span style=""color: %1; font: %2"">Недостает %3.</span>'");
		ИнформационнаяНадписьПревышение = СтроковыеФункции.ФорматированнаяСтрока(
			ШаблонСтрокиПревышение,
			Метаданные.ЭлементыСтиля.ПросроченныеДанныеЦвет.Имя,
			Метаданные.ЭлементыСтиля.ЖирныйШрифт.Имя,
			ФормированиеПечатныхФорм.ФорматСумм(Недостает, ВалютаВзаиморасчетов, "0,00"));
	ИначеЕсли Превышение > 0 Тогда 
		ШаблонСтрокиПревышение = НСтр("ru = '<span style=""color: %1; font: %2"">Превышение на %3.</span>'");
		ИнформационнаяНадписьПревышение = СтроковыеФункции.ФорматированнаяСтрока(
			ШаблонСтрокиПревышение,
			Метаданные.ЭлементыСтиля.ПросроченныеДанныеЦвет.Имя,
			Метаданные.ЭлементыСтиля.ЖирныйШрифт.Имя,
			ФормированиеПечатныхФорм.ФорматСумм(Превышение, ВалютаВзаиморасчетов, "0,00"));
	Иначе
		ИнформационнаяНадписьПревышение = "";
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПередЗакрытиемВопросЗавершение(ОтветНаВопрос, ДополнительныеПараметры) Экспорт
	
	Если ОтветНаВопрос = КодВозвратаДиалога.Да Тогда
		ВыполнитьЗачетОплат();
	ИначеЕсли ОтветНаВопрос = КодВозвратаДиалога.Нет Тогда
		ПринудительноЗакрытьФорму = Истина;
		Закрыть();
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Функция СчетФактураПредыдущееИсправление(СчетФактураОснование, НомерИсправления)
	
	Запрос = Новый Запрос;
	Запрос.Текст =
	"ВЫБРАТЬ
	|	СчетФактура.Ссылка КАК ИсправленныйСчетФактура,
	|	СчетФактура.НомерИсправления КАК НомерИсправления
	|ИЗ
	|	Документ.СчетФактураВыданный КАК СчетФактура
	|ГДЕ
	|	СчетФактура.СчетФактураОснование = &СчетФактураОснование
	|	И СчетФактура.Проведен
	|	И СчетФактура.Исправление
	|	И СчетФактура.НомерИсправления <> &НомерИсправления
	|";
	
	Запрос.УстановитьПараметр("СчетФактураОснование", СчетФактураОснование);
	Запрос.УстановитьПараметр("НомерИсправления", НомерИсправления);
	
	ПредыдущийНомер = 0;
	ИсправленныйСчетФактура = Неопределено;
	НомерИсправленияЧислом = ?(ЗначениеЗаполнено(НомерИсправления),Число(НомерИсправления),1);
	
	Выборка = Запрос.Выполнить().Выбрать();
	Пока Выборка.Следующий() Цикл
		НомерИзВыборки = Число(Выборка.НомерИсправления);
		Если НомерИзВыборки < НомерИсправленияЧислом
			И НомерИзВыборки > ПредыдущийНомер Тогда
			ПредыдущийНомер = НомерИзВыборки;
			ИсправленныйСчетФактура = Выборка.ИсправленныйСчетФактура;
		КонецЕсли;
	КонецЦикла;
	
	Возврат ИсправленныйСчетФактура;
	
КонецФункции

&НаСервере
Процедура УстановитьПараметрЗапросаСчетФактураПредыдущееИсправление(Запрос)
	
	Если Запрос.Параметры.Свойство("СчетФактураПредыдущееИсправление") Тогда
		Возврат;
	КонецЕсли;
	
	Запрос.УстановитьПараметр("СчетФактураПредыдущееИсправление", ?(Запрос.Параметры.Исправление,
		СчетФактураПредыдущееИсправление(Запрос.Параметры.СчетФактураОснование, Запрос.Параметры.НомерИсправления),
		Неопределено));
	
КонецПроцедуры

&НаСервере
Процедура УстановитьПараметрЗапросаИсправляемыйСчетФактура(Запрос)
	
	Если Запрос.Параметры.Свойство("ИсправляемыйСчетФактура") Тогда
		Возврат;
	КонецЕсли;
	
	УстановитьПараметрЗапросаСчетФактураПредыдущееИсправление(Запрос);
	
	Запрос.УстановитьПараметр("ИсправляемыйСчетФактура", ?(
		Не Запрос.Параметры.Свойство("СчетФактураПредыдущееИсправление") Или Запрос.Параметры.СчетФактураПредыдущееИсправление = Неопределено,
		Запрос.Параметры.СчетФактураОснование,
		Запрос.Параметры.СчетФактураПредыдущееИсправление));
	
КонецПроцедуры

#КонецОбласти

Связанные материалы