Классификатор ТН ВЭД / Модуль менеджера

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

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

// Возвращает таблицу справочника.
//
// Параметры:
//	Переменные - Строка - в данном методе не используется, однако является обязательной в случае обращения
//							к другим классификаторам.
//
// Возвращаемое значение:
//		ТаблицаЗначений - таблица классификатора с колонками:
//			* Код					- Строка - строковое представление кода элемента классификатора.
//			* Наименование			- Строка - наименование элемента классификатора.
//			* ЕдиницаИзмеренияКод	- Строка - код единицы измерения по ОКЕИ.
//			* ПрослеживаемыйТовар	- Булево - признак того, что товар подлежит учету в системе прослеживаемости.
//
Функция ТаблицаКлассификатора(Знач Переменные) Экспорт
	
	ТаблицаПоказателей = Новый ТаблицаЗначений;
	
	ТаблицаПоказателей.Колонки.Добавить("Код", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(12)));
	ТаблицаПоказателей.Колонки.Добавить("Наименование",Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(255)));
	ТаблицаПоказателей.Колонки.Добавить("ЕдиницаИзмеренияКод",Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(4)));
	ТаблицаПоказателей.Колонки.Добавить("ПрослеживаемыйТовар",Новый ОписаниеТипов("Булево"));

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

	Возврат ТаблицаПоказателей;
	
КонецФункции

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

Функция ПолучитьСлужебныеЭлементы() Экспорт
	
	СоответствиеКодов = Новый Соответствие;
	СоответствиеКодов.Вставить(Ложь, НайтиПоНаименованию("несырьевой товар"));
	СоответствиеКодов.Вставить(Истина, НайтиПоНаименованию("сырьевой товар"));
	
	Возврат СоответствиеКодов;
	
КонецФункции

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

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

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

	Для Каждого СтрокаДанныхСервиса Из ДанныеСервиса Цикл
		
		// Загружаем только элементы, строки которых не имеют подчиненных элементов.
		Если СтрокаДанныхСервиса.ПотомковИтого > 0 Тогда
			Продолжить;
		КонецЕсли;
		
		СоздатьОбновитьЭлементКлассификатора(СтрокаДанныхСервиса, СуществующиеЭлементыТНВЭД);
		
	КонецЦикла;
	
КонецПроцедуры

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

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

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

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

Функция НормализоватьКодТНВЭД(ПолныйКодТНВЭД) 
	// В сервисе код ТНВЭД указан с пробелами, типа "0101 30 000 0".
	// В конфигурации же используется код без пробелов - "0101300000".
	// Поэтому нужно от пробелов избавиться.
	Возврат СтрЗаменить(ПолныйКодТНВЭД, " ", "");
КонецФункции

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

#КонецЕсли

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