Таможенная декларация на импорт / Модуль объекта

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

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

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

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

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

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

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

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

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

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

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

Процедура ОбработкаУдаленияПроведения(Отказ)
	
	ИнициализироватьПараметрыЗаполненияВидовЗапасовДляПроведения(ЭтотОбъект);
	
	ПроведениеДокументов.ОбработкаУдаленияПроведенияДокумента(ЭтотОбъект, Отказ);
	
	ТаможеннаяДекларацияИмпортЛокализация.ОбработкаУдаленияПроведения(ЭтотОбъект, Отказ);
	
КонецПроцедуры

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

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

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

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

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

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

#Область ПроцедурыЗаполненияЗначенийАвтоподстановкиВидыЗапасовНомераГтд

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

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

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

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

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

// Функция-конструктор параметров раздела
// 
// Возвращаемое значение:
// 	Структура - Описание:
// * СуммаНДС - Число -
// * СуммаПошлины - Число -
// * ТаможеннаяСтоимость - Число -
// * Раздел - СтрокаТабличнойЧасти - 
Функция НоваяСтруктураПараметров()
	
	Результат = Новый Структура;
	Результат.Вставить("Раздел");
	Результат.Вставить("ТаможеннаяСтоимость", 0.);
	Результат.Вставить("СуммаПошлины", 0.);
	Результат.Вставить("СуммаНДС", 0.);
	
	Возврат Результат;
	
КонецФункции

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

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

#КонецЕсли

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