Untitled

mail@pastecode.io avatar
unknown
plain_text
a year ago
7.3 kB
3
Indexable
Never
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
	
	// ДВИЖЕНИЯ ПО РЕГИСТРУ УПРАВЛЕНЧЕСКИЙ

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

	ОсталосьСписать = СуммаОплаты;
	
	Выборка = ВыборкаИтоги.Выбрать();	
	Пока Выборка.Следующий() И ОсталосьСписать <> 0 Цикл
		Если ОсталосьСписать >= Выборка.ВалютныйОстатокВРублях Тогда 
			// списывается вся валютная сумма
			СписываемВВалюте = Выборка.ВалютныйОстаток;
			СписываемВРублях = Выборка.ВалютныйОстатокВРублях;			
		Иначе // списывается часть валютной суммы
			СписываемВРублях = ОсталосьСписать;
			СписываемВВалюте = ? (Выборка.Курс = 0, 0, СписываемВРублях / Выборка.Курс);
		КонецЕсли;
		
		ОсталосьСписать = ОсталосьСписать - СписываемВРублях;
		
		// Проводка отражения поступления денег от контрагента
		Проводка = Движения.Управленческий.Добавить();
		Проводка.Период = Дата;
		Проводка.СчетДт = ПланыСчетов.Управленческий.Касса;
		Проводка.СчетКт = ПланыСчетов.Управленческий.Покупатели;
		Проводка.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Контрагенты] = Контрагент;
		Проводка.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Договоры] = Выборка.Договор;
		Проводка.СуммаВалютнаяКт = СписываемВВалюте;
		Проводка.Сумма = СписываемВРублях;
	КонецЦикла;
	
КонецПроцедуры