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

18.07.17

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

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

Скачать исходный код

Наименование Файл Версия Размер
Загрузка ТН ВЭД с сайта nalog.ru
.zip 1,18Mb
53
.zip 1.0 1,18Mb 53 Скачать

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

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

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

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

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

См. также

Перенос данных из Парус 8 в ЗГУ 3

Зарплата Внешние источники данных Бюджетный учет Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактических удержаниях, НДФЛ, вычетах, страховых взносах из базы Парус 8 учреждений в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ) и начать с ней работать с любого месяца года.

84000 руб.

19.08.2020    22663    19    1    

22

Экстрактор данных 1С в BI - выгрузка данных из 1С в BI-аналитику

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

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

15.11.2022    13956    12    SQV0    47    

30

Загрузка файлов грузовых таможенных деклараций из файлов ФТС формата xml (Альта софт, Сигма софт, Декларант +)

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

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

4000 руб.

09.08.2016    79571    295    373    

60

Перенос данных из Парус 10 в ЗГУ ред.3

Внешние источники данных Кадровый учет Файловый обмен (TXT, XML, DBF), FTP Перенос данных 1C Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактических удержаниях, НДФЛ, вычетах, страховых взносах из базы Парус 10 учреждений в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ) и начать с ней работать с любого месяца года.

60000 руб.

05.10.2022    9333    9    8    

11

Автоматический подбор и заполнение ГТД для 1С:Бухгалтерия предприятия 8, редакция 3.0 (платформа 8.2 и 8.3)

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

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

8280 руб.

19.06.2012    137037    251    81    

214

Перенос данных из Парус 7.хх в ЗГУ ред.3

Внешние источники данных Зарплата Бюджетный учет Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактических удержаниях, НДФЛ, вычетах, страховых взносах из базы Парус 7.хх учреждений в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ) и начать с ней работать с любого месяца года.

24000 руб.

24.04.2017    48934    97    163    

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

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

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

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


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

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


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

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

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


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

&НаСервере - добавить . тк это можно делать только на сервере
Процедура ПометитьНаУдалениеЛишниеЭлементыРазделы(МассивЗагружЭлементов
4. lame 70 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 31 24.01.22 18:13 Сейчас в теме
(6)
(5)Спасибо, получилось, но файл почему-то не скачивается с nalog.ru. Создается какой-то 1кб файл.
Пришлось его вручную скачивать. Остальное работает.
10. nirbolz 31 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 31 24.01.22 18:10 Сейчас в теме
(7) это сроки действия кода ТНВЭД
Оставьте свое сообщение