Получение актуальной версии отчета в Росстат по ОКУД с официального сайта Росстата (http://www.gks.ru) (без дальнейшего использования)

Печать - Регламентированная отчетность

Росстат статистическая отчетность HTTP

1
Простая обработка (не управляемая форма) для получения свойств статистического отчета по ОКУД с сайта www.gks.ru/metod/XML-2018/XML_plan_2018.htm . В первую очередь интересовала актуальная версия. Попутно решил собрать и прочие сведения об отчете.

Если вы программист, который в том числе помогает сотрудникам бухгалтерии в формировании и сдаче отчетности, то с уверенностью в 100% могу сказать, что перед выгрузкой отчета сталкивались с предупреждением о том, что Ваша текущая форма отчета более не применяется

Были случаи, когда 1С 15 марта выпускал внешним файлом версию от 14.03, а уже 19.03 форма становилась неактуальной.

Решил попробовать считать данные с официального сайта (http://www.gks.ru):

  • Код работы по ПП 2018 года;
  • Периодичность предоставления в Росстат;
  • Индекс формы по ОКУД;
  • Наименование отчета;
  • Дата актуализации.

При открытии обработки указываете код по ОКУД. И нажимаете "Получить данные".

Обработка открывает сайт, считывает данные и просто поиском по тексту заполняет необходимые параметры в форме обработки. 

Возможно следующим шагом будет подстановка версии в стат.отчет выбранный бухгалтером.

Так как бесплатно выложить не получается, а продавать за SM рука не подымется приходится весь текст (3 процедуры и 1 функцию :) ) выкладывать в описание:

1. Заполняем корректно код по ОКУД и нажимаем на кнопку "Получить данные"

&НаКлиенте
Процедура ПересчитатьДанныеНажатие(Команда)
	//вызывается нажатием на кнопку "Получить данные"
	Если ЗначениеЗаполнено(ОКУД) Тогда
		ВыполнитьHTTPЗапрос("http://gks.ru");
	Иначе	
		СтрокаНаименование 		= "";
		СтрокаВерсия 			= "";
		СтрокаПериодичность		= "";
		СтрокаКодРаботыПоПП		= "";
		СтрокаИндексОКУД		= "";
		
		КодРаботыПоПП2018 	= СокрЛП(СтрокаКодРаботыПоПП);
		Периодичность 		= СокрЛП(СтрокаПериодичность);
		ИндексФормыПоОКУД 	= СокрЛП(СтрокаИндексОКУД);
		АктуальнаяВерсия 	= СокрЛП(СтрокаВерсия);
		ЭлементыФормы.НаименованиеОтчета.Заголовок = СокрЛП(СтрокаНаименование);
	КонецЕсли;	
КонецПроцедуры

2. Получаем содержимое сайта:

&НаКлиенте
Процедура ВыполнитьHTTPЗапрос(ПолныйАдресРесурса)
	СтруктураURI = СтруктураURI(ПолныйАдресРесурса); 
	HTTPСоединение = Новый HTTPСоединение(СтруктураURI.Хост, СтруктураURI.Порт); 
	 
	HTTPЗапрос = Новый HTTPЗапрос("metod/XML-2018/XML_plan_2018.htm"); 
	Попытка
		Результат =  HTTPСоединение.Получить(HTTPЗапрос);
	Исключение
		 // исключение здесь говорит о том, что запрос не дошел до HTTP-Сервера
		 Сообщить("Произошла сетевая ошибка!");
		 ВызватьИсключение;
	 КонецПопытки;
	 
	 // Анализируем фатальные ошибки
	 // В большинстве случаев нужно остановить работу и показать пользователю сообщение об ошибке,
	 // включив в него HTTP-статус
	 
	 // Ошибки 4XX говорят о неправильном запросе - в широком смысле
	 // Может быть неправильный адрес, ошибка аутентификации, плохой формат запроса
	 // Подробнее смотри http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4
	 Если Результат.КодСостояния >= 400 и Результат.КодСостояния < 500  Тогда
	   	 Сообщить("Код статуса больше 4XX, ошибка запроса.  Код статуса: " + Результат.КодСостояния);
	 КонецЕсли;
	 
	 // Ошибки 5XX говорят о проблемах на сервере (возможно, прокси-сервер)
	 // Это может быть программная ошибка, нехватка памяти, ошибка конфигурации и т.д.
	 // Подробнее смотри http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.5
	 Если Результат.КодСостояния >= 500 и Результат.КодСостояния < 600  Тогда
	   	 Сообщить("Код статуса больше 5XX, ошибка сервера. Код статуса: " + Результат.КодСостояния);
	 КонецЕсли;
	 
	 // Обрабатываем перенаправление
	 Если Результат.КодСостояния >= 300 и Результат.КодСостояния < 400  Тогда
	   	 Сообщить("Код статуса больше 3XX, Перенаправление. Код статуса: " + Результат.КодСостояния);
		Если  Результат.КодСостояния = 301 ИЛИ Результат.КодСостояния = 302 Тогда
		    Сообщить("Код статуса 302, Постоянное перенаправление.");
		    АдресРесурса = Результат.Заголовки.Получить("Location");
		    Если АдресРесурса <> Неопределено Тогда
				Сообщить("Выполняю запрос по новому адресу " + АдресРесурса);
		        ВыполнитьHTTPЗапрос(АдресРесурса);
		    Иначе
		        Сообщить("Сервер не сообщил адрес ресурса!");
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;
	 // Статусы 1XX и 2XX считаем хорошими
	Если Результат.КодСостояния < 300 Тогда 
		ПолучитьПоказателиСтраницы(Результат); 
	КонецЕсли; 
КонецПроцедуры
 
&НаКлиенте
Функция СтруктураURI(Знач СтрокаURI) Экспорт
	
	СтрокаURI = СокрЛП(СтрокаURI);
	
	// схема
	Схема = "";
	Позиция = Найти(СтрокаURI, "://");
	Если Позиция > 0 Тогда
		Схема = НРег(Лев(СтрокаURI, Позиция - 1));
		СтрокаURI = Сред(СтрокаURI, Позиция + 3);
	КонецЕсли;

	// строка соединения и путь на сервере
	СтрокаСоединения = СтрокаURI;
	ПутьНаСервере = "";
	Позиция = Найти(СтрокаСоединения, "/");
	Если Позиция > 0 Тогда
		ПутьНаСервере = Сред(СтрокаСоединения, Позиция + 1);
		СтрокаСоединения = Лев(СтрокаСоединения, Позиция - 1);
	КонецЕсли;
		
	// информация пользователя и имя сервера
	СтрокаАвторизации = "";
	ИмяСервера = СтрокаСоединения;
	Позиция = Найти(СтрокаСоединения, "@");
	Если Позиция > 0 Тогда
		СтрокаАвторизации = Лев(СтрокаСоединения, Позиция - 1);
		ИмяСервера = Сред(СтрокаСоединения, Позиция + 1);
	КонецЕсли;
	
	// логин и пароль
	Логин = СтрокаАвторизации;
	Пароль = "";
	Позиция = Найти(СтрокаАвторизации, ":");
	Если Позиция > 0 Тогда
		Логин = Лев(СтрокаАвторизации, Позиция - 1);
		Пароль = Сред(СтрокаАвторизации, Позиция + 1);
	КонецЕсли;
	
	// хост и порт
	Хост = ИмяСервера;
	Порт = "";
	Позиция = Найти(ИмяСервера, ":");
	Если Позиция > 0 Тогда
		Хост = Лев(ИмяСервера, Позиция - 1);
		Порт = Сред(ИмяСервера, Позиция + 1);
	КонецЕсли;
	
	Результат = Новый Структура;
	Результат.Вставить("Схема", Схема);
	Результат.Вставить("Логин", Логин);
	Результат.Вставить("Пароль", Пароль);
	Результат.Вставить("ИмяСервера", ИмяСервера);
	Результат.Вставить("Хост", Хост);
	Результат.Вставить("Порт", ?(Порт <> "", Число(Порт), Неопределено));
	Результат.Вставить("ПутьНаСервере", ПутьНаСервере);
	
	Возврат Результат;
	
КонецФункции

3. Считываем нужные показатели и заполняем ими форму обработки:

&НаКлиенте
Процедура ПолучитьПоказателиСтраницы(СтраницаСтат)
	ТекстРезультата = СтраницаСтат.ПолучитьТелоКакСтроку(КодировкаТекста.ANSI);
	Импорт_КоличествоСтрок = СтрЧислоСтрок(ТекстРезультата);
	Импорт_ТекущаяСтрока = 1;

	СтрокаНаименование 		= "";
	СтрокаВерсия 			= "";
	СтрокаПериодичность		= "";
	СтрокаКодРаботыПоПП		= "";
	СтрокаИндексОКУД		= "";
	
	КодРаботыПоПП2018 	= СокрЛП(СтрокаКодРаботыПоПП);
	Периодичность 		= СокрЛП(СтрокаПериодичность);
	ИндексФормыПоОКУД 	= СокрЛП(СтрокаИндексОКУД);
	АктуальнаяВерсия 	= СокрЛП(СтрокаВерсия);
	ЭлементыФормы.НаименованиеОтчета.Заголовок = СокрЛП(СтрокаНаименование);
	
	Для Импорт_ТекущаяСтрока = 1 По Импорт_КоличествоСтрок Цикл
		ТекСтрока = СокрЛП(СтрПолучитьСтроку(ТекстРезультата, Импорт_ТекущаяСтрока));
		Если СтрокаВерсия = "Найдена" Тогда
			Если Лев(ТекСтрока,12) = "width:73pt'>" Тогда //актуальная версия
				СтрокаВерсия = Сред(ТекСтрока,13,10)+":00.00.00";		
				Прервать;
			КонецЕсли;	
			Если Лев(ТекСтрока,12) = "width:83pt'>" Тогда //периодичность
				СтрокаПериодичность = СокрЛП(ТекСтрока);
				СтрокаПериодичность = СокрЛП(СтрЗаменить(СтрокаПериодичность,"width:83pt'>",""));
				СтрокаПериодичность = СокрЛП(СтрЗаменить(СтрокаПериодичность,"</td>",""));
			КонецЕсли;	
			Если Лев(ТекСтрока,12) = "width:84pt'>" Тогда //индекс по ОКУД
				СтрокаИндексОКУД = СокрЛП(ТекСтрока);
				СтрокаИндексОКУД = СокрЛП(СтрЗаменить(СтрокаИндексОКУД,"width:84pt'>",""));
				СтрокаИндексОКУД = СокрЛП(СтрЗаменить(СтрокаИндексОКУД,"<br>",""));
				Если Прав(СокрЛП(СтрокаИндексОКУД),5) = "</td>" Тогда
					СтрокаИндексОКУД = СокрЛП(СтрЗаменить(СтрокаИндексОКУД,"</td>",""));
				Иначе
					СтрокаИндексОКУД = СтрокаИндексОКУД + " "+СокрЛП(СтрПолучитьСтроку(ТекстРезультата, Импорт_ТекущаяСтрока+1));
					СтрокаИндексОКУД = СокрЛП(СтрЗаменить(СтрокаИндексОКУД,"<br>",""));
					Если Прав(СокрЛП(СтрокаИндексОКУД),5) = "</td>" Тогда
						СтрокаИндексОКУД = СокрЛП(СтрЗаменить(СтрокаИндексОКУД,"</td>",""));
					КонецЕсли;
				КонецЕсли;	
			КонецЕсли;	
			Если Лев(ТекСтрока,13) = "width:159pt'>" Тогда //наименование
				СтрокаНаименование = СокрЛП(ТекСтрока);
				СтрокаНаименование = СокрЛП(СтрЗаменить(СтрокаНаименование,"width:159pt'>",""));
				СтрокаНаименование = СокрЛП(СтрЗаменить(СтрокаНаименование,"<br>",""));
				Если Прав(СокрЛП(СтрокаНаименование),5) = "</td>" ИЛИ Прав(СокрЛП(СтрокаНаименование),5) = "<span" Тогда
					СтрокаНаименование = СокрЛП(СтрЗаменить(СтрокаНаименование,"</td>",""));
					СтрокаНаименование = СокрЛП(СтрЗаменить(СтрокаНаименование,"<span",""));
				Иначе 
					СтрокаНаименование = СтрокаНаименование + " "+СокрЛП(СтрПолучитьСтроку(ТекстРезультата, Импорт_ТекущаяСтрока+1));
					СтрокаНаименование = СокрЛП(СтрЗаменить(СтрокаНаименование,"<br>",""));
					Если Прав(СокрЛП(СтрокаНаименование),5) = "</td>" ИЛИ Прав(СокрЛП(СтрокаНаименование),5) = "<span" Тогда
						СтрокаНаименование = СокрЛП(СтрЗаменить(СтрокаНаименование,"</td>",""));
						СтрокаНаименование = СокрЛП(СтрЗаменить(СтрокаНаименование,"<span",""));
					Иначе 
						СтрокаНаименование = СтрокаНаименование + " "+СокрЛП(СтрПолучитьСтроку(ТекстРезультата, Импорт_ТекущаяСтрока+1));
						СтрокаНаименование = СокрЛП(СтрЗаменить(СтрокаНаименование,"<br>",""));
						Если Прав(СокрЛП(СтрокаНаименование),5) = "</td>" ИЛИ Прав(СокрЛП(СтрокаНаименование),5) = "<span" Тогда
							СтрокаНаименование = СокрЛП(СтрЗаменить(СтрокаНаименование,"</td>",""));
							СтрокаНаименование = СокрЛП(СтрЗаменить(СтрокаНаименование,"<span",""));
						Иначе 
							СтрокаНаименование = СтрокаНаименование + " "+СокрЛП(СтрПолучитьСтроку(ТекстРезультата, Импорт_ТекущаяСтрока+1));
							СтрокаНаименование = СокрЛП(СтрЗаменить(СтрокаНаименование,"<br>",""));
							Если Прав(СокрЛП(СтрокаНаименование),5) = "</td>" ИЛИ Прав(СокрЛП(СтрокаНаименование),5) = "<span" Тогда
								СтрокаНаименование = СокрЛП(СтрЗаменить(СтрокаНаименование,"</td>",""));
								СтрокаНаименование = СокрЛП(СтрЗаменить(СтрокаНаименование,"<span",""));
							КонецЕсли;
						КонецЕсли;
					КонецЕсли;
				КонецЕсли;	
			КонецЕсли;	
		КонецЕсли;
		Если Лев(ТекСтрока,19) = "width:65pt'>"+СокрЛП(ОКУД) Тогда
			ТекСтрока = СокрЛП(СтрПолучитьСтроку(ТекстРезультата, Импорт_ТекущаяСтрока-4));
			Если Лев(ТекСтрока,12) = "width:68pt'>" Тогда //код работы по ПП 2018 года
				СтрокаКодРаботыПоПП = СокрЛП(ТекСтрока);
				СтрокаКодРаботыПоПП = СокрЛП(СтрЗаменить(СтрокаКодРаботыПоПП,"width:68pt'>",""));
				СтрокаКодРаботыПоПП = СокрЛП(СтрЗаменить(СтрокаКодРаботыПоПП,"</td>",""));
			Иначе
				ТекСтрока = СокрЛП(СтрПолучитьСтроку(ТекстРезультата, Импорт_ТекущаяСтрока-3));	
				Если Лев(ТекСтрока,12) = "width:68pt'>" Тогда //код работы по ПП 2018 года
					СтрокаКодРаботыПоПП = СокрЛП(ТекСтрока);
					СтрокаКодРаботыПоПП = СокрЛП(СтрЗаменить(СтрокаКодРаботыПоПП,"width:68pt'>",""));
					СтрокаКодРаботыПоПП = СокрЛП(СтрЗаменить(СтрокаКодРаботыПоПП,"</td>",""));
				Иначе
					ТекСтрока = СокрЛП(СтрПолучитьСтроку(ТекстРезультата, Импорт_ТекущаяСтрока-2));	
					Если Лев(ТекСтрока,12) = "width:68pt'>" Тогда //код работы по ПП 2018 года
						СтрокаКодРаботыПоПП = СокрЛП(ТекСтрока);
						СтрокаКодРаботыПоПП = СокрЛП(СтрЗаменить(СтрокаКодРаботыПоПП,"width:68pt'>",""));
						СтрокаКодРаботыПоПП = СокрЛП(СтрЗаменить(СтрокаКодРаботыПоПП,"</td>",""));
					КонецЕсли;
				КонецЕсли;	
			КонецЕсли;	
			
			СтрокаВерсия = "Найдена";
		КонецЕсли;	
	КонецЦикла;      
	КодРаботыПоПП2018 	= СокрЛП(СтрокаКодРаботыПоПП);
	Периодичность 		= СокрЛП(СтрокаПериодичность);
	ИндексФормыПоОКУД 	= СокрЛП(СтрокаИндексОКУД);
	АктуальнаяВерсия 	= СтрокаВерсия;
	ЭлементыФормы.НаименованиеОтчета.Заголовок = СокрЛП(СтрокаНаименование);
	
КонецПроцедуры

 

Тестировалось на: Управление производственным предприятием, редакция 1.3

Будет работать в любой конфигурации в режиме толстого клиента.

1

Скачать файлы

Наименование Файл Версия Размер
Получить актуальную версию отчета в Росстат по ОКУД с официального сайта Росстата (http://www.gks.ru) (без дальнейшего использования :) ):
.epf 15,10Kb
28.03.18
0
.epf 15,10Kb Скачать

См. также

Избранное Подписка Сортировка: Древо
В этой теме еще нет сообщений.
Оставьте свое сообщение