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

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

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

// Заполняет код вида операции счета-фактуры
//
Процедура ЗаполнитьКодВидаОперации() Экспорт
	
	СчетФактураПолученныйАвансЛокализация.ЗаполнитьКодВидаОперации(ЭтотОбъект);
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Процедура ЗаполнитьЗависимыеРеквизитыКонтрагента()

	Если ЗначениеЗаполнено(Контрагент)
		И ТипЗнч(Контрагент) = Тип("СправочникСсылка.Контрагенты") Тогда
		
		РеквизитыКонтрагента = ПартнерыИКонтрагенты.РеквизитыКонтрагента(Контрагент, Дата);
		ИННКонтрагента       = РеквизитыКонтрагента.ИНН;

	КонецЕсли;
	
КонецПроцедуры

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

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

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

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

#КонецЕсли

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