Загрузка ТН ВЭД с сайта nalog.ru

18.07.17

Учетные задачи - Операции по ВЭД

В публикации представлена конфигурация в которой реализована структура по хранению данных классификатора ТН ВЭД и обработка по загрузке из файла TNVED.7z который выложен на сайте nalog.ru

Файлы

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование Скачано Купить файл
(только для физ. лиц)
Загрузка ТН ВЭД с сайта nalog.ru
.zip 1,18Mb ver:1.0
60 1 850 руб. Купить

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

Загрузить классификатор можно на определенную дату. Сейчас в классификаторе содержаться данные начиная с 01.01.2003г.

Сам классификатор можно скачать по ссылке https://www.nalog.ru/rn77/program/5961290/. Также по ссылее доступно описание структуры файлов классификатора.

Как показала практика классификатор ТН ВЭД выложенный на сайте nalog.ru отличается от классификатора который есть например в БП 3.0 в виде макета наличием иерархической структуры и большим количеством элементов.

В архиве содержится конфиграция на управляемых формах (DT), файл с классификатором и описание его структуры. Классификатор актуален на 29.06.2017, на момент публикации это самый актуальный классификатор.

ТНВЭД ТН ВЭД Классификатор Загрузка

См. также

Операции по ВЭД Оптовая торговля Розничная торговля Логистика, склад и ТМЦ Мастера заполнения Бухгалтер 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)

СКАЧАЙТЕ И ПОПРОБУЙТЕ БЕСПЛАТНО! Данная обработка расширяет функционал типовой конфигурации «1С:Бухгалтерия предприятия» и позволяет осуществлять автоматическое заполнение ГТД в документах «Реализация товаров и услуг», «Списание товаров», «Отчет о розничных продажах», «Отчет комиссионера (агента) о продажах», «Требование-накладная», «Возврат товаров от покупателя», «Комплектация номенклатуры», «Безвозмездная передача», «Отчет производства за смену». Обработка предназначена для работы в конфигурации «1С:Бухгалтерия предприятия 8, редакция 3.0» Есть версия обработки оптимизированная для работы в 1CFresh

9600 руб.

19.06.2012    141514    282    81    

240

Розничная торговля Внешние источники данных Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Бухгалтерский учет 1С:Бухгалтерия 3.0 Фармацевтика, аптеки Россия Бухгалтерский учет Платные (руб)

Внешняя обработка загрузки данных из файла-выгрузки, сформированного в программе F3 TAIL версии 3.4 (и выше) или еФарма версии 2.1, в базу конфигурации 1С: Бухгалтерия предприятия 8, ред. 3.0 (базовая, ПРОФ, КОРП, ФРЕШ).

13200 руб.

19.12.2016    49527    101    106    

74

Операции по ВЭД Файловый обмен (TXT, XML, DBF), FTP Программист Бухгалтер 1С v8.3 Бухгалтерский учет 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 Россия Бухгалтерский учет Платные (руб)

Федеральная таможенная служба России давно поддерживает унифицированный формат электронных документов для обмена с информационными системами предприятий. xmlns="urn:customs.ru:Information:ExchangeDocuments:". Структура, утвержденная комиссией Таможенного союза. Осталось только сделать загрузку в 1С из этого формата. На выходе - два документа ГТД по импорту и Поступление (акты, накладные) Обработка актуализирована на начало 2025 года

4800 руб.

09.08.2016    85904    322    375    

84

Внешние источники данных Программист Бизнес-аналитик Пользователь 1С v8.3 Управляемые формы Анализ и прогнозирование 1C:Бухгалтерия Узбекистан Беларусь Кыргызстан Молдова Россия Казахстан Платные (руб)

Готовое решение для автоматической выгрузки данных из 1С 8.3 в базу данных ClickHouse, PostgreSQL или Microsoft SQL для работы с данными 1С в BI-системах. «Экстрактор данных 1С в BI» работает со всеми типовыми и нестандартными конфигурациями 1С 8.3 и упрощает работу бизнес-аналитиков. Благодаря этому решению, специалистам не требуется быть программистами, чтобы легко получать данные из 1С в вашей BI-системе.

28500 руб.

15.11.2022    24984    27    49    

42

Производство готовой продукции (работ, услуг) Внешние источники данных 1С v8.3 1С:Управление нашей фирмой 1.6 Лесное и деревообрабатывающее хозяйство Россия Управленческий учет Платные (руб)

Обработка предназначена для загрузки файлов, выгруженных из системы Базис-мебельщик, в справочник 1С "Спецификации" для последующих процессов учета и диспетчирования полуфабрикатов и изделий.

10200 руб.

24.06.2021    22683    57    55    

40
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. lame 76 07.09.17 12:37 Сейчас в теме
По мелочам если не придираться то работает.
только в файловом варианте.

Косяк в этом месте.

&НаКлиенте
Процедура РаспаковатьФайлКлассификатора()
...	
	Объект.Файл1 = ПутьРаспаковка + "TNVED1.TXT";
	Объект.Файл2 = ПутьРаспаковка + "TNVED2.TXT";
	Объект.Файл3 = ПутьРаспаковка + "TNVED3.TXT";
	Объект.Файл4 = ПутьРаспаковка + "TNVED4.TXT";

КонецПроцедуры
Показать


те распаковал на клиенте

а обрабатываешь этот файл на сервере
&НаСервере
Процедура ОбработатьФайл1()
	ТекстДок = Новый ТекстовыйДокумент();
	ТекстДок.Прочитать(Объект.Файл1, "cp866");
...
конецпроцедуры


А его - файла - на сервере просто нет ...
2. lame 76 07.09.17 12:38 Сейчас в теме
и в файловом варианте косячок ...

программа делает
ЗапуститьПриложение(Объект.Имя7Z + ПараметрыЗапуска);

потом идет далее
те архив еще НЕ распаковался, а программа пошла дальше и пытается этот файл обработать


те поменяй на
ЗапуститьПриложение(Объект.Имя7Z + ПараметрыЗапуска,,истина);
3. lame 76 07.09.17 12:41 Сейчас в теме
ну .. по мелочам ...

&НаСервере - добавить . тк это можно делать только на сервере
Процедура ПометитьНаУдалениеЛишниеЭлементыРазделы(МассивЗагружЭлементов
4. lame 76 07.09.17 17:03 Сейчас в теме
#Область ОбработчикиСобытий



&НаКлиенте
Процедура ПриОткрытии(Отказ)
	КонецПроцедуры

&НаКлиенте
Процедура ПриЗакрытии(ЗавершениеРаботы)
	//удалим из temp файл
	Попытка
	
		УдалитьФайлы(Объект.Имя7Z);
	
	Исключение
		Сообщить("При удалении файла 7za произошла ошибка: " + ОписаниеОшибки(), СтатусСообщения.Важное);
	КонецПопытки;

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

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	//заполним реквизиты
	
	Объект.Имя7Z = ПолучитьИмяВременногоФайла("exe");
	
	Макет7Z = Макет7zВTemp();
	Макет7Z.Записать(Объект.Имя7Z);

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

&НаКлиенте
Процедура ПутьКФайлуТНВЭДНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
	Диалог.ПолноеИмяФайла = "";
	Диалог.МножественныйВыбор = Ложь;
	Диалог.Заголовок = "Выберите архив с классификатором ТН ВЭД";
	Диалог.Фильтр = "Архив 7Z(*.7z)|*.7z";
	
	Если Диалог.Выбрать() тогда
		Объект.ПутьКФайлуТНВЭД = Диалог.ПолноеИмяФайла;	
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ДекорацияСкачатьНажатие(Элемент)
	НачатьЗапускПриложения(Новый ОписаниеОповещения("ДекорацияСкачатьНажатиеЗавершение", ЭтотОбъект), "https://www.nalog.ru/rn77/program//5961290/");
КонецПроцедуры

&НаКлиенте
Процедура ДекорацияСкачатьНажатиеЗавершение(КодВозврата, ДополнительныеПараметры) Экспорт
	
КонецПроцедуры

&НаСервере
Процедура ЗагрузитьКлассификаторНаСервере(лФайл1)
	УспехВыполнения = РаспаковатьИПроверитьФайлКлассификатора(лФайл1);
	
	Если УспехВыполнения = Ложь тогда
		Возврат;
	КонецЕсли;
	
	//идентифицируется запись классификатора по 4-м ключевым полям:
	//1. Раздел
	//2. Группа
	//3. Товарная позиция
	//4. Товарная подпозиция
	
	//обрабатываем файлы
	Сообщить("Обрабатывается файл ""Разделы"" (1 из 4)");
	ОбработатьФайл1();
	
	Сообщить("Обрабатывается файл ""Группы"" (2 из 4)");
	ОбработатьФайл2();
	
	Сообщить("Обрабатывается файл ""Товарные позиции"" (3 из 4)");
	ОбработатьФайл3();
	
	Сообщить("Обрабатывается файл ""Товарные подпозиции"" (4 из 4)");
	ОбработатьФайл4();
	
	Сообщить("Загрузка завершена!");

конецпроцедуры

	
&НаКлиенте
Процедура ЗагрузитьКлассификатор(Команда)
	//распакуем файл и проверим чтобы все прошло удачно
	
	лДвоичДанные1 = Новый ДвоичныеДанные(Объект.ПутьКФайлуТНВЭД);
	лФайл1 = ПоместитьВоВременноеХранилище(лДвоичДанные1);	
	
	
	ЗагрузитьКлассификаторНаСервере(лФайл1);
	Оповестить("ОбновитьТНВЭД");
КонецПроцедуры

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

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

&НаСервере
Функция Макет7zВTemp()
	Возврат РеквизитФормыВЗначение("Объект").ПолучитьМакет("Архиватор7z");
КонецФункции 

&НаСервере
Функция РаспаковатьИПроверитьФайлКлассификатора(лФайл1)
	
	АрхивСДанными = ПолучитьИмяВременногоФайла("rar");
	лДвоичДанныеАрхива = ПолучитьИзВременногоХранилища(лФайл1);
	лДвоичДанныеАрхива.Записать(АрхивСДанными);
	
	
	ФайлКлассификатораСуществует = ПроверитьСуществованиеФайла(АрхивСДанными);
	
	Если не ФайлКлассификатораСуществует тогда
		Сообщение = Новый СообщениеПользователю;
		Сообщение.Текст = "Файл классификатора не существует!";
		Сообщение.Поле = "Объект.ПутьКФайлуТНВЭД";
		Сообщение.Сообщить();
		
		Возврат Ложь;
	КонецЕсли;
	
	//пробуем распаковать файл
	РаспаковатьФайлКлассификатора(АрхивСДанными);
	
	//Если не ПроверитьСуществованиеФайла(Объект.Файл1) или 
	//	не ПроверитьСуществованиеФайла(Объект.Файл2) или
	//	не ПроверитьСуществованиеФайла(Объект.Файл3) или
	//	не ПроверитьСуществованиеФайла(Объект.Файл4) тогда
	//	
	//	Сообщение = Новый СообщениеПользователю;
	//	Сообщение.Текст = "Не удалось распаковать файл классификатора!";
	//	//Сообщение.Поле = "Объект.ПутьКФайлуТНВЭД";
	//	Сообщение.Сообщить();
	//	
	//	Возврат Ложь;
	//КонецЕсли;
	
	Возврат Истина;
КонецФункции

&НаСервере
Функция ПроверитьСуществованиеФайла(ПутьКФайлу)
	Файл = Новый Файл(ПутьКФайлу);
	
	Возврат Файл.Существует();	
КонецФункции

&НаСервере
Процедура РаспаковатьФайлКлассификатора(АрхивСДанными)
	ПутьРаспаковка = КаталогВременныхФайлов();
	
	//сформируем команду
	ПараметрыЗапуска = " e"; //e - extract (Распаковка)
	
	//путь к архиву
	ПараметрыЗапуска = ПараметрыЗапуска + " """ + АрхивСДанными + """";
	
	//путь к папке распаковки
	ПараметрыЗапуска = ПараметрыЗапуска + " -o""" + ПутьРаспаковка + """";
	
	//рекурсивный обход архива
	ПараметрыЗапуска = ПараметрыЗапуска + " -r";
	
	//отвечать на все вопросы yes
	ПараметрыЗапуска = ПараметрыЗапуска + " -y";
	
	//ЧтениеZipФайла = Новый ЧтениеZipФайла(ИмяАрхива);
	//ЧтениеZipФайла.Извлечь(ЧтениеZipФайла.Элементы[0], ПапкаАрхива, РежимВосстановленияПутейФайловZIP.НеВосстанавливать);
	//    ИмяФайла = ПапкаАрхива + "\" + ЧтениеZipФайла.Элементы[0].Имя;
	//    ЧтениеZipФайла.Закрыть();
	
	ЗапуститьПриложение(Объект.Имя7Z + ПараметрыЗапуска,,истина);
	
	Объект.Файл1 = ПутьРаспаковка + "TNVED1.TXT";
	Объект.Файл2 = ПутьРаспаковка + "TNVED2.TXT";
	Объект.Файл3 = ПутьРаспаковка + "TNVED3.TXT";
	Объект.Файл4 = ПутьРаспаковка + "TNVED4.TXT";

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

&НаСервере
Процедура ОбработатьФайл1()
	ТекстДок = Новый ТекстовыйДокумент();
	ТекстДок.Прочитать(Объект.Файл1, "cp866");
	
	МассивЗагружЭлементов = Новый Массив;
	
	НомерСтроки = 1; //начинаем разбор файла со второй строки
	
	Пока НомерСтроки <= 200000 цикл //считаем что в файле с классификатором максимум 200000 строк, прерываем цикл если встречаем пустую строку
		
		НомерСтроки = НомерСтроки + 1;
		
		//структура строк:
		//1. Раздел
		//2. Наименование
		//3. Примечание
		//4. Дата начала действия
		//5. Дата окончания действия
		
		Стр = ТекстДок.ПолучитьСтроку(НомерСтроки);
		
		Если СокрЛП(Стр) = "" тогда
			//дошли до конца файла
			Прервать;
		КонецЕсли;
		
		МассивРазбор = РазложитьСтрокуВМассивПодстрок(Стр, "|");
		
		Раздел = ПреобразоватьСтроку(МассивРазбор[0]);
		Группа = "";
		ТоварнаяПозиция = "";
		ТоварнаяПодпозиция = "";
		НаименованиеПолное = ПреобразоватьСтроку(МассивРазбор[1]);
		Примечение = ПреобразоватьСтроку(МассивРазбор[2]);
		ДатаНачалаДействия = СтрокуВДату(МассивРазбор[3]);
		ДатаОкончанияДействия = СтрокуВДату(МассивРазбор[4]);
		Родитель = Справочники.ТНВЭД.ПустаяСсылка(); //это корневые элементы справочника
		
		Если ЗначениеЗаполнено(ДатаНачалаДействия) и ДатаНачалаДействия > Объект.ДатаАктульности тогда
			//слишком новая строка
			Продолжить;
		КонецЕсли;
		
		Если ЗначениеЗаполнено(ДатаОкончанияДействия) и ДатаОкончанияДействия <= Объект.ДатаАктульности тогда
			//слишком старая строка
			Продолжить;
		КонецЕсли;
		
		Эл = НайтиЭлементКлассификатора(Раздел, Группа, ТоварнаяПозиция, ТоварнаяПодпозиция);
		
		Если ЗначениеЗаполнено(Эл) тогда
			Об = Эл.ПолучитьОбъект();
		Иначе
			Об = Справочники.ТНВЭД.СоздатьЭлемент();
		КонецЕсли;
		
		ЗаполнитьЭлементКлассификатора(Об, Раздел, Группа, ТоварнаяПозиция, ТоварнаяПодпозиция, НаименованиеПолное, Примечение, ДатаНачалаДействия, ДатаОкончанияДействия, Родитель, Истина);
		
		МассивЗагружЭлементов.Добавить(Об.Ссылка);
		
	КонецЦикла;
	
	ПометитьНаУдалениеЛишниеЭлементыРазделы(МассивЗагружЭлементов);
КонецПроцедуры

&НаСервере
Процедура ОбработатьФайл2()
	ТекстДок = Новый ТекстовыйДокумент();
	ТекстДок.Прочитать(Объект.Файл2, "cp866");
	
	МассивЗагружЭлементов = Новый Массив;
	
	НомерСтроки = 1; //начинаем разбор файла со второй строки
	
	Пока НомерСтроки <= 200000 цикл //считаем что в файле с классификатором максимум 200000 строк, прерываем цикл если встречаем пустую строку
		
		НомерСтроки = НомерСтроки + 1;
		
		//структура строк:
		//1. Раздел
		//2. Наименование
		//3. Примечание
		//4. Дата начала действия
		//5. Дата окончания действия
		
		Стр = ТекстДок.ПолучитьСтроку(НомерСтроки);
		
		Если СокрЛП(Стр) = "" тогда
			//дошли до конца файла
			Прервать;
		КонецЕсли;
		
		МассивРазбор = РазложитьСтрокуВМассивПодстрок(Стр, "|");
		
		Раздел = ПреобразоватьСтроку(МассивРазбор[0]);
		Группа = ПреобразоватьСтроку(МассивРазбор[1]);
		ТоварнаяПозиция = "";
		ТоварнаяПодпозиция = "";
		НаименованиеПолное = ПреобразоватьСтроку(МассивРазбор[2]);
		Примечение = ПреобразоватьСтроку(МассивРазбор[3]);
		ДатаНачалаДействия = СтрокуВДату(МассивРазбор[4]);
		ДатаОкончанияДействия = СтрокуВДату(МассивРазбор[5]);
		
		Если ЗначениеЗаполнено(ДатаНачалаДействия) и ДатаНачалаДействия > Объект.ДатаАктульности тогда
			//слишком новая строка
			Продолжить;
		КонецЕсли;
		
		Если ЗначениеЗаполнено(ДатаОкончанияДействия) и ДатаОкончанияДействия <= Объект.ДатаАктульности тогда
			//слишком старая строка
			Продолжить;
		КонецЕсли;
		
		Родитель = НайтиЭлементКлассификатора(Раздел, "", "", "");
		
		Эл = НайтиЭлементКлассификатора(Раздел, Группа, ТоварнаяПозиция, ТоварнаяПодпозиция);
		
		Если ЗначениеЗаполнено(Эл) тогда
			Об = Эл.ПолучитьОбъект();
		Иначе
			Об = Справочники.ТНВЭД.СоздатьЭлемент();
		КонецЕсли;
		
		ЗаполнитьЭлементКлассификатора(Об, Раздел, Группа, ТоварнаяПозиция, ТоварнаяПодпозиция, НаименованиеПолное, Примечение, ДатаНачалаДействия, ДатаОкончанияДействия, Родитель);
		
		МассивЗагружЭлементов.Добавить(Об.Ссылка);
		
	КонецЦикла;
	
	ПометитьНаУдалениеЛишниеЭлементыГруппы(МассивЗагружЭлементов);
КонецПроцедуры

&НаСервере
Процедура ОбработатьФайл3()
	ТекстДок = Новый ТекстовыйДокумент();
	ТекстДок.Прочитать(Объект.Файл3, "cp866");
	
	НомерСтроки = 1; //начинаем разбор файла со второй строки
	
	Пока НомерСтроки <= 200000 цикл //считаем что в файле с классификатором максимум 200000 строк, прерываем цикл если встречаем пустую строку
		
		НомерСтроки = НомерСтроки + 1;
		
		//структура строк:
		//1. Раздел
		//2. Наименование
		//3. Примечание
		//4. Дата начала действия
		//5. Дата окончания действия
		
		Стр = ТекстДок.ПолучитьСтроку(НомерСтроки);
		
		Если СокрЛП(Стр) = "" тогда
			//дошли до конца файла
			Прервать;
		КонецЕсли;
		
		МассивРазбор = РазложитьСтрокуВМассивПодстрок(Стр, "|");
		
		Раздел = "";
		Группа = ПреобразоватьСтроку(МассивРазбор[0]);
		ТоварнаяПозиция = ПреобразоватьСтроку(МассивРазбор[1]);
		ТоварнаяПодпозиция = "";
		НаименованиеПолное = ПреобразоватьСтроку(МассивРазбор[2]);
		Примечение = "";
		ДатаНачалаДействия = СтрокуВДату(МассивРазбор[4]);
		ДатаОкончанияДействия = СтрокуВДату(МассивРазбор[5]);
		
		Если ЗначениеЗаполнено(ДатаНачалаДействия) и ДатаНачалаДействия > Объект.ДатаАктульности тогда
			//слишком новая строка
			Продолжить;
		КонецЕсли;
		
		Если ЗначениеЗаполнено(ДатаОкончанияДействия) и ДатаОкончанияДействия <= Объект.ДатаАктульности тогда
			//слишком старая строка
			Продолжить;
		КонецЕсли;
		
		Родитель = НайтиЭлементКлассификатораБезРаздела(Группа, "", "");
		
		Эл = НайтиЭлементКлассификатора(Раздел, Группа, ТоварнаяПозиция, ТоварнаяПодпозиция);
		
		Если ЗначениеЗаполнено(Эл) тогда
			Об = Эл.ПолучитьОбъект();
		Иначе
			Об = Справочники.ТНВЭД.СоздатьЭлемент();
		КонецЕсли;
		
		ЗаполнитьЭлементКлассификатора(Об, Раздел, Группа, ТоварнаяПозиция, ТоварнаяПодпозиция, НаименованиеПолное, Примечение, ДатаНачалаДействия, ДатаОкончанияДействия, Родитель);
		
		СписокТоварныхПозицийДляПроверки.Добавить(Об.Ссылка);
		
	КонецЦикла;
	
	//ПометитьНаУдалениеЛишниеЭлементыТоварныеПозиции(МассивЗагружЭлементов);
КонецПроцедуры

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


&НаСервере
Функция РазложитьСтрокуВМассивПодстрок(Знач Стр, Разделитель = ",") Экспорт
	МассивСтрок = Новый Массив();
	Если Разделитель = " " Тогда
		Стр = СокрЛП(Стр);
		Пока 1=1 Цикл
			Поз = Найти(Стр,Разделитель);
			Если Поз=0 Тогда
				МассивСтрок.Добавить(Стр);
				Возврат МассивСтрок;
			КонецЕсли;
			МассивСтрок.Добавить(Лев(Стр,Поз-1));
			Стр = СокрЛ(Сред(Стр,Поз));
		КонецЦикла;
	Иначе
		ДлинаРазделителя = СтрДлина(Разделитель);
		Пока 1=1 Цикл
			Поз = Найти(Стр,Разделитель);
			Если Поз=0 Тогда
				МассивСтрок.Добавить(Стр);
				Возврат МассивСтрок;
			КонецЕсли;
			МассивСтрок.Добавить(Лев(Стр,Поз-1));
			Стр = Сред(Стр,Поз+ДлинаРазделителя);
		КонецЦикла;
	КонецЕсли;	
КонецФункции 

&НаСервере
Функция ПреобразоватьСтроку(Стр)
	Стр = СокрЛП(Стр);
	Стр = СтрЗаменить(Стр, Символ(11), "");
	
	Возврат Стр;
КонецФункции

&НаСервере
Функция СтрокуВДату(Стр)
	Стр = СокрЛП(Стр);
	Если Стр = "" тогда
		Возврат Дата("00010101"); //пустая дата
	КонецЕсли;
	
	Возврат Дата(Стр + " 00:00:00");
КонецФункции

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

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


&НаСервере
Функция ArabicToRoman(Знач тЧисло)
   мБуквы = РазложитьСтрокуВМассивПодстрок("I,IV,V,IX,X,XL,L,XC,C,CD,D,CM,M", ",");
   мЦифры = РазложитьСтрокуВМассивПодстрок("1,4,5,9,10,40,50,90,100,400,500,900,1000", ",");
 
   тРимскоеЧисло = "";
 
   Для тСчет = 0 По мБуквы.Количество() - 1 Цикл
   тБуква=мБуквы.Количество() - тСчет - 1;
      Пока тЧисло >= Число(мЦифры[тБуква]) Цикл
         тРимскоеЧисло = тРимскоеЧисло + мБуквы[тБуква];
         тЧисло = тЧисло - Число(мЦифры[тБуква]);
      КонецЦикла;
   КонецЦикла;
 
   Возврат тРимскоеЧисло;
КонецФункции

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

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

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

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

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

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

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

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

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


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


Показать



переделал на уф
все работы делаеются на сервере
5. enter_123 09.10.19 13:03 Сейчас в теме
Низкий поклон автору.
Внесу свои 5 копеек:
На сайте налоговой теперь архив в формате .ARJ и выбирать его по маске *.7z не получается, надо поправить.
Ну и ссылка на скачивание теперь статическая поэтому вот процедура которая скачивает его на клиенте
&НаКлиенте
Процедура ЗагрузитьКлассификаторССайта()
    Если НЕ ЗначениеЗаполнено(Объект.ПутьКФайлуТНВЭД) Тогда
		ИмяФайлаРезультат = ПолучитьИмяВременногоФайла("ARJ");
	
		HTTPСоединение 				= Новый HTTPСоединение("www.nalog.ru",,,,,,Новый ЗащищенноеСоединениеOpenSSL());
		HTTPЗапрос 					= Новый HTTPЗапрос("/html/sites/www.new.nalog.ru/docs/sprav/TNVED.ARJ");
		
		HTTPСоединение.Получить(HTTPЗапрос, ИмяФайлаРезультат);
		
		Объект.ПутьКФайлуТНВЭД = ИмяФайлаРезультат;
	КонецЕсли;
Конецпроцедуры
Показать
9. nirbolz 33 24.01.22 18:13 Сейчас в теме
(6)
(5)Спасибо, получилось, но файл почему-то не скачивается с nalog.ru. Создается какой-то 1кб файл.
Пришлось его вручную скачивать. Остальное работает.
10. nirbolz 33 24.01.22 23:54 Сейчас в теме
(5) В общем покопался - оказывается они изменили адрес файла. Заработало вот так вот:
Процедура ЗагрузитьКлассификаторССайта()
Если НЕ ЗначениеЗаполнено(Объект.ПутьКФайлуТНВЭД) Тогда
ИмяФайлаРезультат = ПолучитьИмяВременногоФайла("ARJ");

HTTPСоединение = Новый HTTPСоединение("data.nalog.ru",,,,,,Новый ЗащищенноеСоединениеOpenSSL());
HTTPЗапрос = Новый HTTPЗапрос("/html/sites/www.new.nalog.ru/docs/sprav/tnved/TNVED.ARJ");

HTTPСоединение.Получить(HTTPЗапрос, ИмяФайлаРезультат);

Объект.ПутьКФайлуТНВЭД = ИмяФайлаРезультат;
КонецЕсли;
Конецпроцедуры
6. enter_123 10.10.19 22:08 Сейчас в теме
Ну и архиватором 7z у меня не получилось открыть архив arj нашел UnArj и сделал с ней. Вот процедура распаковки
&НаКлиенте
Процедура РаспаковатьФайлКлассификатора()
	
	ПутьРаспаковка = КаталогВременныхФайлов() + "TN_VED" + ПолучитьРазделительПути();
	СоздатьКаталог(ПутьРаспаковка);
	
	ФайлПрограммыАрхиватораUnArj = ПолучитьИмяВременногоФайла("exe");
	ПолучитьДвоичнеДанныеПрограммыАрхиватораUnArj().Записать(ФайлПрограммыАрхиватораUnArj);
	
	НаборВыполняемыхКоманд = СтрШаблон("cd ""%1"" && ""%2"" e ""%3""", ПутьРаспаковка, ФайлПрограммыАрхиватораUnArj, Объект.ПутьКФайлуТНВЭД);  
	
	КомандаСистемы(НаборВыполняемыхКоманд);
	
	Объект.Файл1 = ПутьРаспаковка + "TNVED1.TXT";
	Объект.Файл2 = ПутьРаспаковка + "TNVED2.TXT";
	Объект.Файл3 = ПутьРаспаковка + "TNVED3.TXT";
	Объект.Файл4 = ПутьРаспаковка + "TNVED4.TXT";
	
КонецПроцедуры

Показать

ну и сама UnArj прикрепить как макет двоичные данные "АрхиваторArj" к обработке
Прикрепленные файлы:
UnArj.exe
7. makfromkz 35 20.11.20 11:55 Сейчас в теме
в TNVED4.TXT есть такие строки:

11|01|001500|МУКА ПШЕНИЧНАЯ ИЗ МЯГКОЙ ПШЕНИЦЫ И СПЕЛЬТЫ|01.01.2002|31.12.2006|
11|01|001500|МУКА ПШЕНИЧНАЯ ИЗ МЯГКОЙ ПШЕНИЦЫ И СПЕЛЬТЫ|01.01.2007|31.12.2009|
11|01|001500|МУКА ПШЕНИЧНАЯ ИЗ МЯГКОЙ ПШЕНИЦЫ И СПЕЛЬТЫ|01.01.2010|31.12.2011|
11|01|001500|МУКА ПШЕНИЧНАЯ ИЗ МЯГКОЙ ПШЕНИЦЫ И СПЕЛЬТЫ|01.01.2012|22.08.2012|

Подскажите пожалуйста, какую роль играют даты в конце строк с одинаковым кодом ТНВЭД ???
У нас в казахстанском ТНВЭД нету такого.
8. nirbolz 33 24.01.22 18:10 Сейчас в теме
(7) это сроки действия кода ТНВЭД
Оставьте свое сообщение