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

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

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

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

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

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

Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
	
	ТипОснования = Метаданные.Документы.ТаможеннаяДекларацияЭкспорт.Реквизиты.ДокументОснование.Тип;
	Если ДанныеЗаполнения <> Неопределено И ТипОснования.СодержитТип(ТипЗнч(ДанныеЗаполнения)) Тогда

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

Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
	
	ПроверитьТаблицуОснований(Отказ);
	ПровестиФЛКНомераДекларации(Отказ);
	ПроверитьСопроводительныеДокументы(Отказ);
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

#Область ОбработчикиПроверкиЗаполнения

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

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

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

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

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

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

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

#КонецЕсли

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