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

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

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

// Заполняет код вида операции счета-фактуры
//
Процедура ЗаполнитьКодВидаОперации() Экспорт
	
	КодВидаОперации = "42";
	
КонецПроцедуры

// Заполняет признак СводныйКорректировочный
//
Процедура ЗаполнитьПризнакСводныйКорректировочный() Экспорт
	
	КоличествоКорректировокПоступлений = 0;
	Если Корректировочный Тогда
		
		Основания = ДокументыОснования.Выгрузить(,"ДокументОснование");
		Основания.Свернуть("ДокументОснование");
		
		Для каждого СтрокаОснование Из Основания Цикл
			Если ТипЗнч(СтрокаОснование.ДокументОснование) = Тип("ДокументСсылка.КорректировкаПриобретения") Тогда
				КоличествоКорректировокПоступлений = КоличествоКорректировокПоступлений + 1;
			КонецЕсли;
			Если КоличествоКорректировокПоступлений > 1 Тогда //Если корректировок несколько, то СФ сводный.
				СводныйКорректировочный = ИСТИНА;
				Прервать;
			КонецЕсли;
		КонецЦикла;
		Если КоличествоКорректировокПоступлений <= 1 Тогда
			СводныйКорректировочный = ЛОЖЬ;
		КонецЕсли;
	Иначе
		СводныйКорректировочный = ЛОЖЬ;
	КонецЕсли;
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

#КонецЕсли

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