Номера ГТД / Модуль объекта

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

#КонецЕсли

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