Если вы программист, который в том числе помогает сотрудникам бухгалтерии в формировании и сдаче отчетности, то с уверенностью в 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
Будет работать в любой конфигурации в режиме толстого клиента.