Untitled

mail@pastecode.io avatar
unknown
plain_text
a year ago
5.2 kB
1
Indexable
Never
Процедура ОбработкаПроведенияОУ(Отказ)
	
	// ДВИЖЕНИЯ ПО РЕГИСТРУ ВЗАИМОРАСЧЕТЫ
	
	Движения.Взаиморасчеты.Записывать = Истина;
	Движения.Взаиморасчеты.Записать();
	
	ПроектАванс = Справочники.Проекты.Аванс;
	
	// Установка блокировки данных в регистре Взаиморасчеты по контрагенту документа и проекту - авансу
	Блокировка = Новый БлокировкаДанных;
	ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.Взаиморасчеты");
	ЭлементБлокировки.УстановитьЗначение("Контрагент", Контрагент);
	ЭлементБлокировки.УстановитьЗначение("Проект", ПроектАванс);
	ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
	Блокировка.Заблокировать();
	
	// В первом запросе пакета определяем курс валюты проекта, указанного в документе
	// Во втором запросе пакета получаем имеющийся аванс контрагента
	Запрос = Новый Запрос;
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	КурсыВалютСрезПоследних.Курс КАК Курс
	|ИЗ
	|	РегистрСведений.КурсыВалют.СрезПоследних(&ДатаСреза, Валюта = ВЫРАЗИТЬ(&Проект КАК Справочник.Проекты).Валюта) КАК КурсыВалютСрезПоследних
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	-ВзаиморасчетыОстатки.СуммаВРубляхОстаток КАК СуммаАванс,
	|	ВзаиморасчетыОстатки.Контрагент КАК Контрагент
	|ИЗ
	|	РегистрНакопления.Взаиморасчеты.Остатки(
	|			&МоментВремени,
	|			Контрагент = &Контрагент
	|				И Проект = &Аванс) КАК ВзаиморасчетыОстатки";
	
	Запрос.УстановитьПараметр("МоментВремени", МоментВремени());
	Запрос.УстановитьПараметр("ДатаСреза", Дата);
	Запрос.УстановитьПараметр("Контрагент", Контрагент);
	Запрос.УстановитьПараметр("Аванс", ПроектАванс);
	Запрос.УстановитьПараметр("Проект", Проект);
	
	МассивРезультатов = Запрос.ВыполнитьПакет();
	
	РезультатКурсПроекта = МассивРезультатов[0];
	КурсПроекта = 0;
	Если Не РезультатКурсПроекта.Пустой() Тогда
		Данные = РезультатКурсПроекта.Выбрать();
		Данные.Следующий();
		КурсПроекта = Данные.Курс;
	КонецЕсли;
	
	РезультатОсновной = МассивРезультатов[1];
	ГасимИзАванса = 0;
	Если Не РезультатОсновной.Пустой() Тогда
		// Если аванс есть, то гасим сумму долга по документу из аванса
		Данные = РезультатОсновной.Выбрать();
		Данные.Следующий();
		СуммаАванса = Данные.СуммаАванс;
		ГасимИзАванса = Мин (СуммаАванса, СуммаПоДокументу);
		
		Движение = Движения.Взаиморасчеты.ДобавитьПриход();
		Движение.Период = Дата;
		Движение.Контрагент = Контрагент;
		Движение.Проект = ПроектАванс;
		Движение.СуммаВРублях = ГасимИзАванса;
	КонецЕсли;
	
	// Если сумма документа не была полностью погашена авансом, отражаем остаток долга в регистре
	ОстатокДолга = СуммаПоДокументу - ГасимИзАванса;
	Если ОстатокДолга <> 0 Тогда     			
		Движение = Движения.Взаиморасчеты.ДобавитьПриход();
		Движение.Период = Дата;
		Движение.Контрагент = Контрагент;
		Движение.Проект = Проект;
		Движение.СуммаВРублях = ОстатокДолга;
		Движение.СуммаВВалюте = ?(КурсПроекта = 0, 0, ОстатокДолга / КурсПроекта);
	КонецЕсли;
	
КонецПроцедуры