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

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

#Область ПрограммныйИнтерфейс

// Заполняет код вида операции счета-фактуры
//
Процедура ЗаполнитьКодВидаОперации() Экспорт
	
	Основание = Неопределено;
	Если ДокументыОснования.Количество() > 0 Тогда
		Основание = ДокументыОснования[0].ДокументОснование;
	КонецЕсли;
	
	КодВидаОперации = "01";
	ВерсияКодовВидовОпераций = УчетНДСКлиентСервер.ВерсияКодовВидовОпераций(?(ЗначениеЗаполнено(Дата), Дата, ТекущаяДатаСеанса()));
	
	УстановитьПривилегированныйРежим(Истина);
	
	Запрос = Новый Запрос;
	Запрос.УстановитьПараметр("Основание", Основание);
	Запрос.Текст = "
	|ВЫБРАТЬ
	|	ДанныеОснованийСчетовФактур.ЭтоВозврат
	|ИЗ
	|	РегистрСведений.ДанныеОснованийСчетовФактур КАК ДанныеОснованийСчетовФактур
	|ГДЕ
	|	ДанныеОснованийСчетовФактур.Регистратор = &Основание
	|";
	
	Выборка = Запрос.Выполнить().Выбрать();
	Если Выборка.Следующий() И Выборка.ЭтоВозврат Тогда
		КодВидаОперации = ?(ВерсияКодовВидовОпераций >= 3, "01", "03");
	КонецЕсли;
	
	Если СоставленКомиссионеромОтИмениПродавца И Продавцы.Количество() > 1 Тогда
		КодВидаОперации = "27";
	КонецЕсли;
	
	Если КодВидаОперации = "" Тогда
		КодВидаОперации = "01";
	КонецЕсли;
	
КонецПроцедуры

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

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

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

Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
		
	МассивНепроверяемыхРеквизитов = Новый Массив;

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

Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
	
	Если ОбменДанными.Загрузка Тогда
		Возврат;
	КонецЕсли;

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

Процедура ОбработкаПроведения(Отказ, РежимПроведения)
	
	ПроведениеДокументов.ОбработкаПроведенияДокумента(ЭтотОбъект, Отказ);
	
КонецПроцедуры

Процедура ОбработкаУдаленияПроведения(Отказ)
	
	ПроведениеДокументов.ОбработкаУдаленияПроведенияДокумента(ЭтотОбъект, Отказ);
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

#Область ЗаполнениеСуммДокументовОснований

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

Процедура ЗаполнитьСуммыДокументовОснований(СуммыДокумента) Экспорт
	
	ДокументыОснования.Загрузить(СуммыДокумента);
	РучнаяКорректировкаСуммДокумента = Ложь;
	
КонецПроцедуры

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

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

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

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

Процедура СообщитьОбОшибкеТиповОснований(НомерСтроки, Отказ)
	
	ТекстСообщения = НСтр("ru = 'Запрещено выбирать в качестве оснований документы различных типов.'");
	Поле = ОбщегоНазначенияКлиентСервер.ПутьКТабличнойЧасти("ДокументыОснования", НомерСтроки, "ДокументОснование");
	ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения,,Поле,"Объект",Отказ);
	
КонецПроцедуры

Процедура СообщитьОбОшибкеОснования(НомерСтроки, Отказ)
	
	ТекстСообщения = НСтр("ru = 'Запрещено формировать счет-фактуру полученный для возврата от неплательщиков НДС.'");
	Поле = ОбщегоНазначенияКлиентСервер.ПутьКТабличнойЧасти("ДокументыОснования", НомерСтроки, "ДокументОснование");
	ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения,,Поле,"Объект",Отказ);
	
КонецПроцедуры

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

Процедура СообщитьОбОшибкеВалютыОснований(НомерСтроки, Отказ)
	
	ТекстСообщения = НСтр("ru = 'Запрещено выбирать в качестве оснований документы, оформленные в различной валюте.'");
	Поле = ОбщегоНазначенияКлиентСервер.ПутьКТабличнойЧасти("ДокументыОснования", НомерСтроки, "ДокументОснование");
	ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения,,Поле,"Объект",Отказ);
	
КонецПроцедуры

Процедура СообщитьОбОшибкеНалогообложенияНДСОснований(НомерСтроки, Отказ)
	
	ТекстСообщения = НСтр("ru = 'Запрещено выбирать в качестве оснований документы с типом налогообложения ""Облагается НДС у покупателя"".'");
	Поле = ОбщегоНазначенияКлиентСервер.ПутьКТабличнойЧасти("ДокументыОснования", НомерСтроки, "ДокументОснование");
	ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения,,Поле,"Объект",Отказ);
	
КонецПроцедуры

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

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

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

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

#КонецЕсли

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