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

файл
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

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

Процедура ПриКопировании(ОбъектКопирования)
	
	ИдентификаторПлатежа = Неопределено;

	ОбщегоНазначенияУТ.ОчиститьИдентификаторыДокумента(ЭтотОбъект);
	
	Автор = Пользователи.ТекущийПользователь();
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

#Область ИнициализацияИЗаполнение

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

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

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

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

Процедура ЗаполнитьИсправлениеПоОснованию(ДанныеЗаполнения)
	
	Если ТипЗнч(ДанныеЗаполнения.ДокументОснование) = Тип("Массив") Тогда
		
		МассивОснований = ДанныеЗаполнения.ДокументОснование;
		Для Каждого ОснованиеЗаполнения Из МассивОснований Цикл
			СтрокаОснования = ДокументыОснования.Добавить();
			СтрокаОснования.ДокументОснование = ОснованиеЗаполнения;
		КонецЦикла;
		ДанныеЗаполнения.ДокументОснование = МассивОснований[0];
		
	Иначе
		СтрокаОснования = ДокументыОснования.Добавить();
		СтрокаОснования.ДокументОснование = ДанныеЗаполнения.ДокументОснование;
	КонецЕсли;
	
	Основание = ДанныеЗаполнения.ДокументОснование;
	
	РеквизитыСчетаФактуры = ИсправляемыйСчетФактураПоОснованию(
		Ссылка,
		Основание,
		?(ДанныеЗаполнения.Свойство("Организация"), ДанныеЗаполнения.Организация, Неопределено));
	ИдентификаторГосКонтракта = РеквизитыСчетаФактуры.ИдентификаторГосКонтракта;
	НачислениеНДСПриОтгрузке  = РеквизитыСчетаФактуры.НачислениеНДСПриОтгрузке;

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

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

Процедура ЗаполнитьКорректировкуПоДокументуОснованию(ДанныеЗаполнения)
	
	ТаблицаОснований = КорректировочныеДокументыПоОснованию(
		ДанныеЗаполнения.ДокументОснование);
	
	Если ТаблицаОснований.Количество() > 0 Тогда
		
		ДанныеЗаполнения.Вставить("ДокументОснование", ТаблицаОснований.ВыгрузитьКолонку("Ссылка"));
		ДанныеЗаполнения.Вставить("Дата", ТаблицаОснований[0].Дата);
		
		ЗаполнитьПоДокументуОснованию(ДанныеЗаполнения);
		
	КонецЕсли;
	
КонецПроцедуры

Процедура ЗаполнитьПризнакСводныйКорректировочный() Экспорт
	
	Если Корректировочный Тогда
		МассивПредыдущихСчетовФактур = Товары.ВыгрузитьКолонку("ПредыдущийСчетФактура");
		МассивПредыдущихСчетовФактур = ОбщегоНазначенияКлиентСервер.СвернутьМассив(МассивПредыдущихСчетовФактур);
		
		СводныйКорректировочный = МассивПредыдущихСчетовФактур.Количество() > 1;
	Иначе
		СводныйКорректировочный = ЛОЖЬ;
	КонецЕсли;
	
КонецПроцедуры

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

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

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

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

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

#Область ЗаполнениеТаблицыТоваров

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

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

Процедура ЗаполнитьНомераСтрокПриПечати()
	
	// Для перевыставленных СФ может быть только один документ-основание, но несколько счетов-полученных - сводный.
	// Распределяем по полученным счетам-фактурам.
	Если Перевыставленный И ДокументыОснования.Количество() > 0 Тогда
		
		ДокументыОснования.Сортировать("СчетФактураПолученныйОтПродавца");
		
		СтруктураОтбора = Новый Структура();
		СтруктураОтбора.Вставить("СчетФактураПолученныйОтПродавца");
		
		СоответствиеНомеровИДокументов = Новый ТаблицаЗначений();
		СоответствиеНомеровИДокументов.Колонки.Добавить("СчетФактура");
		СоответствиеНомеровИДокументов.Колонки.Добавить("ДокументОснование");
		СоответствиеНомеровИДокументов.Колонки.Добавить("НомерСтрокиСФ");
	
		Для Каждого СтрокаТоваров Из Товары Цикл
			ЗаполнитьЗначенияСвойств(СтруктураОтбора, СтрокаТоваров);
			СтрокиОснований = ДокументыОснования.НайтиСтроки(СтруктураОтбора);
			Для Каждого СтрокаОснований Из СтрокиОснований Цикл
				СтрокаНомера = СоответствиеНомеровИДокументов.Добавить();
				СтрокаНомера.СчетФактура = Ссылка;
				СтрокаНомера.ДокументОснование = СтрокаОснований.СчетФактураПолученныйОтПродавца;
				СтрокаНомера.НомерСтрокиСФ = СтрокаТоваров.НомерСтрокиПриПечати;
			КонецЦикла;
		КонецЦикла;
		
		ТаблицаИнтервалов = Документы.СчетФактураВыданный.ПолучитьПорядковыеНомераСтрок(СоответствиеНомеровИДокументов);
		Для Каждого СтрокаИнтервала Из ТаблицаИнтервалов Цикл
			Для Каждого СтрокаТЧ Из ДокументыОснования Цикл
				Если СтрокаТЧ.СчетФактураПолученныйОтПродавца = СтрокаИнтервала.ДокументОснование Тогда
					СтрокаТЧ.ПорядковыеНомераСтрок = СтрокаИнтервала.НомерСтрокиСФ;
				КонецЕсли;
			КонецЦикла;
		КонецЦикла;
		
	Иначе
	
		ГруппировкиПечати = Документы.СчетФактураВыданный.ГруппировкиПечатиСчетаФактуры();
		ГруппировкиПечати = ГруппировкиПечати + ",Цена";
		
		ТЧТовары = Товары.Выгрузить();
		ТЧТовары.Колонки.Добавить("Цена", Новый ОписаниеТипов("Число"));
		Для Каждого Стр Из ТЧТовары Цикл
			Стр.Цена = Окр(Стр.Сумма/?(Стр.Количество = 0, 1, Стр.Количество), 2, РежимОкругления.Окр15как20);
		КонецЦикла;
		
		ТЧСвернуто = ТЧТовары.Скопировать(,ГруппировкиПечати);
		ТЧСвернуто.Свернуть(ГруппировкиПечати);
		
		Для Каждого СтрокаПечати Из ТЧСвернуто Цикл
			СтруктураОтбора = ОбщегоНазначения.СтрокаТаблицыЗначенийВСтруктуру(СтрокаПечати);
			СтрокиТоваров = ТЧТовары.НайтиСтроки(СтруктураОтбора);
			Для Каждого СтрокаТоваров Из СтрокиТоваров Цикл
				Товары[ТЧТовары.Индекс(СтрокаТоваров)].НомерСтрокиПриПечати = ТЧСвернуто.Индекс(СтрокаПечати) + 1;
			КонецЦикла;
		КонецЦикла;
		
		// Не пытаемся угадать соответствие строк документам отгрузки после ручной корректировки.
		Если РучнаяКорректировкаСуммДокумента И ДокументыОснования.Количество() > 0 Тогда
			ДокументыОснования[0].ПорядковыеНомераСтрок = "1-" + ТЧСвернуто.Количество();
		ИначеЕсли Исправление И Не Корректировочный И Не Перевыставленный И Не РучнаяКорректировкаСуммДокумента Тогда
			
			СоответствиеНомеровИДокументов = Новый ТаблицаЗначений();
			СоответствиеНомеровИДокументов.Колонки.Добавить("СчетФактура");
			СоответствиеНомеровИДокументов.Колонки.Добавить("ДокументОснование");
			СоответствиеНомеровИДокументов.Колонки.Добавить("НомерСтрокиСФ");
			
			Для Каждого СтрокаТоваров Из Товары Цикл
				СтрокаНомера = СоответствиеНомеровИДокументов.Добавить();
				СтрокаНомера.СчетФактура       = Ссылка;
				СтрокаНомера.ДокументОснование = ДокументОснование;
				СтрокаНомера.НомерСтрокиСФ     = СтрокаТоваров.НомерСтрокиПриПечати;
			КонецЦикла;
			
			ТаблицаИнтервалов = Документы.СчетФактураВыданный.ПолучитьПорядковыеНомераСтрок(СоответствиеНомеровИДокументов);
			Для Каждого СтрокаИнтервала Из ТаблицаИнтервалов Цикл
				Для Каждого СтрокаТЧ Из ДокументыОснования Цикл
					Если СтрокаТЧ.ДокументОснование = СтрокаИнтервала.ДокументОснование Тогда
						СтрокаТЧ.ПорядковыеНомераСтрок = СтрокаИнтервала.НомерСтрокиСФ;
					КонецЕсли;
				КонецЦикла;
			КонецЦикла;
		КонецЕсли;
	
	КонецЕсли;
	
КонецПроцедуры

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

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

#Область Прочее

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

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

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

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

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

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

КонецФункции

Процедура ПроверитьСчетФактурыПоОтчетуКомитентуОЗакупках(Отказ)

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

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

Процедура ПроверитьСуммуЗачтенныхАвансов(Отказ)
	
	СуммаЗачтенныхАвансовВалютная = ПлатежноРасчетныеДокументы.Итог("Сумма");
	Если Корректировочный Тогда 
		СуммаПоСчетуФактуреВалютная = Товары.Итог("СуммаБезНДСВалУвеличение") - Товары.Итог("СуммаБезНДСВалУменьшение");
	Иначе
		СуммаПоСчетуФактуреВалютная = Товары.Итог("СуммаБезНДСВал");
	КонецЕсли;
	
	Если СуммаЗачтенныхАвансовВалютная > 0
		И СуммаЗачтенныхАвансовВалютная > СуммаПоСчетуФактуреВалютная Тогда 
		ТекстОшибки = СтрШаблон(НСтр("ru = 'Сумма зачтенных авансов %1 %2 превышает сумму по счету-фактуре %3 %2.'", ОбщегоНазначения.КодОсновногоЯзыка()), СуммаЗачтенныхАвансовВалютная, ВалютаВзаиморасчетов, СуммаПоСчетуФактуреВалютная);
		ОбщегоНазначения.СообщитьПользователю(ТекстОшибки, , , , Отказ);
	КонецЕсли;
	
КонецПроцедуры

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

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

#КонецЕсли

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