Untitled

mail@pastecode.io avatarunknown
plain_text
2 months ago
9.2 kB
1
Indexable
Never
Процедура ОбработкаПроведенияОУ(Отказ)
	
	СтруктураОтбора = Новый Структура("Валюта", Валюта);
	КурсВалюты = РегистрыСведений.КурсыВалют.ПолучитьПоследнее(Дата, СтруктураОтбора).Курс;
	Если КурсВалюты = 0 Тогда
		КурсВалюты = 1;
	КонецЕсли;	       

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