Счет-фактура выданный / Форма рабочее место для оформления исправленных счетов фактур по отгрузкам / Модуль формы

файл

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

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

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

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

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

&НаКлиенте
Процедура ОрганизацияПриИзменении(Элемент)
	
	ЗаполнитьРаспоряженияНаОформленияСчетовФактур();
	РазвернутьСтрокиРаспоряжений();
	
КонецПроцедуры

&НаКлиенте
Процедура КонтрагентПриИзменении(Элемент)
	
	ЗаполнитьРаспоряженияНаОформленияСчетовФактур();
	РазвернутьСтрокиРаспоряжений();
	
КонецПроцедуры

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

#Область ОбработчикиСобытийЭлементовТаблицыФормыРаспоряженияНаОформленияСчетовФактур

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

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

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

&НаКлиенте
Процедура Обновить(Команда)
	
	ЗаполнитьРаспоряженияНаОформленияСчетовФактур();
	
	РазвернутьСтрокиРаспоряжений();
	
КонецПроцедуры

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

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

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

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

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

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

&НаСервере
Процедура ЗаполнитьРаспоряженияНаОформленияСчетовФактур()
	
	УстановитьТекстЗапросаРаспоряженияНаОформленияСчетовФактур();

КонецПроцедуры

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

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

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

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

	Документы.СчетФактураВыданный.РассчитатьСуммуНДСРеглПриОтгрузке(ТоварыСФ, ПараметрыЗаполнения);
	
	Возврат ОбщегоНазначения.ТаблицаЗначенийВМассив(ТоварыСФ);
	
КонецФункции

&НаКлиенте
Процедура ОформитьКорректировочныйСчетФактуруЗавершение(Результат, ДополнительныеПараметры) Экспорт 
	
	ЗаполнитьРаспоряженияНаОформленияСчетовФактур();
	
	РазвернутьСтрокиРаспоряжений();
	
КонецПроцедуры

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

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

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