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






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

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

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

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

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

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

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

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

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

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

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

КодРаботыПоПП2024  = СокрЛП(СтрокаКодРаботыПоПП);
Периодичность   = СокрЛП(СтрокаПериодичность);
ИндексФормыПоОКУД  = СокрЛП(СтрокаИндексОКУД);
АктуальнаяВерсия  = СокрЛП(СтрокаВерсия);
ЭлементыФормы.НаименованиеОтчета.Заголовок = СокрЛП(СтрокаНаименование);
КонецЕсли;
КонецПроцедуры

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

&НаКлиенте
Процедура ВыполнитьHTTPЗапрос(ПолныйАдресРесурса)
СтруктураURI = СтруктураURI(ПолныйАдресРесурса);
HTTPСоединение = Новый HTTPСоединение(СтруктураURI.Хост, СтруктураURI.Порт);

HTTPЗапрос = Новый HTTPЗапрос("metod/XML-2024/XML_plan_2024.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;

СтрокаНаименование   = "";
СтрокаВерсия    = "";
СтрокаПериодичность  = "";
СтрокаКодРаботыПоПП  = "";
СтрокаИндексОКУД  = "";

КодРаботыПоПП2024  = СокрЛП(СтрокаКодРаботыПоПП);
Периодичность   = СокрЛП(СтрокаПериодичность);
ИндексФормыПоОКУД  = СокрЛП(СтрокаИндексОКУД);
АктуальнаяВерсия  = СокрЛП(СтрокаВерсия);
ЭлементыФормы.НаименованиеОтчета.Заголовок = СокрЛП(СтрокаНаименование);

Для Импорт_ТекущаяСтрока = 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'>" Тогда //код работы по ПП 2024 года
СтрокаКодРаботыПоПП = СокрЛП(ТекСтрока);
СтрокаКодРаботыПоПП = СокрЛП(СтрЗаменить(СтрокаКодРаботыПоПП,"width:68pt'>",""));
СтрокаКодРаботыПоПП = СокрЛП(СтрЗаменить(СтрокаКодРаботыПоПП,"</td>",""));
Иначе
ТекСтрока = СокрЛП(СтрПолучитьСтроку(ТекстРезультата, Импорт_ТекущаяСтрока-3));
Если Лев(ТекСтрока,12) = "width:68pt'>" Тогда //код работы по ПП 2024 года
СтрокаКодРаботыПоПП = СокрЛП(ТекСтрока);
СтрокаКодРаботыПоПП = СокрЛП(СтрЗаменить(СтрокаКодРаботыПоПП,"width:68pt'>",""));
СтрокаКодРаботыПоПП = СокрЛП(СтрЗаменить(СтрокаКодРаботыПоПП,"</td>",""));
Иначе
ТекСтрока = СокрЛП(СтрПолучитьСтроку(ТекстРезультата, Импорт_ТекущаяСтрока-2));
Если Лев(ТекСтрока,12) = "width:68pt'>" Тогда //код работы по ПП 2024 года
СтрокаКодРаботыПоПП = СокрЛП(ТекСтрока);
СтрокаКодРаботыПоПП = СокрЛП(СтрЗаменить(СтрокаКодРаботыПоПП,"width:68pt'>",""));
СтрокаКодРаботыПоПП = СокрЛП(СтрЗаменить(СтрокаКодРаботыПоПП,"</td>",""));
КонецЕсли;
КонецЕсли;
КонецЕсли;

СтрокаВерсия = "Найдена";
КонецЕсли;
КонецЦикла;
КодРаботыПоПП2024  = СокрЛП(СтрокаКодРаботыПоПП);
Периодичность   = СокрЛП(СтрокаПериодичность);
ИндексФормыПоОКУД  = СокрЛП(СтрокаИндексОКУД);
АктуальнаяВерсия  = СтрокаВерсия;
ЭлементыФормы.НаименованиеОтчета.Заголовок = СокрЛП(СтрокаНаименование);

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

 

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

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

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *