Доступные версии адресных сведений. Проверяет наличие обновлений адресного классификатора на веб сервере
// Проверяет наличие обновлений адресного классификатора на веб сервере
// для тех объектов, которые ранее уже загружались.
//
// Возвращаемое значение - ТаблицаЗначений - Описание добавленных и измененных субъектов. Содержит Колонки.
// * КодСубъектаРФ - Число - Код субъекта РФ.
// * Наименование - Строка - Наименование субъекта РФ.
// * Сокращение - Строка - Сокращение субъекта РФ.
// * Индекс - Число - Почтовый индекс.
// * Идентификатор - УникальныйИдентификатор - Идентификатор субъекта.
// * Адрес - Строка - Адрес для скачивания файла данных региона.
// * ДоступноОбновление - Булево - Флаг доступности обновления для данного региона.
// * Загружено - Булево - Флаг того, что данные хоть раз загружались.
// * ДатаОбновления - Дата - Дата обновления адресных сведений.
//
Функция ДоступныеВерсииАдресныхСведений(ПараметрыВыгрузки = Неопределено, АдресВоВременномХранилище = Неопределено) Экспорт
Результат = Новый ТаблицаЗначений;
ТипСтрока = Новый ОписаниеТипов("Строка");
ТипЧисло = Новый ОписаниеТипов("Число");
ТипБулево = Новый ОписаниеТипов("Булево");
ТипДата = Новый ОписаниеТипов("Дата");
Колонки = Результат.Колонки;
Колонки.Добавить("КодСубъектаРФ", ТипЧисло);
Колонки.Добавить("Наименование", ТипСтрока);
Колонки.Добавить("Сокращение", ТипСтрока);
Колонки.Добавить("Индекс", ТипЧисло);
Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("УникальныйИдентификатор") );
Колонки.Добавить("Адрес", ТипСтрока);
Колонки.Добавить("ДоступноОбновление", ТипБулево);
Колонки.Добавить("Загружено", ТипБулево);
Колонки.Добавить("ДатаОбновления", ТипДата);
Результат.Индексы.Добавить("КодСубъектаРФ");
Если НЕ ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПолучениеФайловИзИнтернета") Тогда
Возврат Результат;
КонецЕсли;
МодульПолучениеФайловИзИнтернета = ОбщегоНазначения.ОбщийМодуль("ПолучениеФайловИзИнтернета");
АдресОписания = АдресИнтернетаВключаяПорт(АдресФайлаОписанияДоступныхВерсий());
РезультатПолученияФайла = МодульПолучениеФайловИзИнтернета.СкачатьФайлНаСервере(АдресОписания.Адрес);
Если Не РезультатПолученияФайла.Статус Тогда
Возврат Результат;
КонецЕсли;
// Получен zip, внутри которого xml.
КаталогДляРаспаковки = ПолучитьИмяВременногоФайла();
Архив = Новый ЧтениеZipФайла(РезультатПолученияФайла.Путь);
Архив.ИзвлечьВсе(КаталогДляРаспаковки);
ФайлОписания = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(КаталогДляРаспаковки) + "version.xml";
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(ФайлОписания);
ДоступныеДанные = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML, ФабрикаXDTO.Тип( ПространствоИмен(), "Publications") );
ЧтениеXML.Закрыть();
ФайловаяСистема.УдалитьВременныйФайл(КаталогДляРаспаковки);
ФайловаяСистема.УдалитьВременныйФайл(РезультатПолученияФайла.Путь);
ДатаПоследнейВерсии = '00000000';
ПоследняяПубликация = Неопределено;
Для Каждого Публикация Из ДоступныеДанные.ПолучитьСписок("Publication") Цикл
Если Публикация.UpdateDate > ДатаПоследнейВерсии Тогда
ДатаПоследнейВерсии = Публикация.UpdateDate - 86400;
ПоследняяПубликация = Публикация;
КонецЕсли;
КонецЦикла;
Если ПоследняяПубликация = Неопределено Тогда
// Нет данных совсем
Возврат Результат;
КонецЕсли;
// Сравниваем то что в регистре, и то что прочитали.
ТекущиеСубъекты = СведенияОЗагрузкеСубъектовРФ();
Для Каждого ЗаписьРегиона Из ПоследняяПубликация.ПолучитьСписок("Region") Цикл
Идентификатор = УникальныйИдентификаторИзДвоичныхДанных(ЗаписьРегиона.AOGUID);
ТекущийСубъект = ТекущиеСубъекты.Найти(Идентификатор, "Идентификатор");
Если ТекущийСубъект = Неопределено Тогда
Продолжить;
КонецЕсли;
СтрокаРегиона = Результат.Добавить();
СтрокаРегиона.КодСубъектаРФ = ЗаписьРегиона.REGIONCODE;
СтрокаРегиона.Наименование = ЗаписьРегиона.FORMALNAME;
СтрокаРегиона.Сокращение = ЗаписьРегиона.SHORTNAME;
СтрокаРегиона.Индекс = ЗаписьРегиона.POSTALCODE;
СтрокаРегиона.Идентификатор = Идентификатор;
СтрокаРегиона.Адрес = ЗаписьРегиона.Url;
СтрокаРегиона.Загружено = ТекущийСубъект <> Неопределено И ТекущийСубъект.Загружено;
СтрокаРегиона.ДатаОбновления = ДатаПоследнейВерсии;
Если ЗначениеЗаполнено(ТекущийСубъект.ДатаВерсии) Тогда
СтрокаРегиона.ДоступноОбновление = ТекущийСубъект = Неопределено // Новый регион
Или ТекущийСубъект.ДатаВерсии < ДатаПоследнейВерсии // Обновленный регион
Или (ТекущийСубъект.КодСубъектаРФ <> ЗаписьРегиона.REGIONCODE);// Обновленные данные существующего субъекта.
КонецЕсли;
КонецЦикла;
Если АдресВоВременномХранилище <> Неопределено Тогда
Ответ = Новый Структура("Отказ, Таблица");
Ответ.Отказ = Ложь;
Ответ.Таблица = Результат;
ПоместитьВоВременноеХранилище(Ответ, АдресВоВременномХранилище);
КонецЕсли;
Возврат Результат;
КонецФункции
///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////
СведенияОДоступностиАдресныхСведений (БСП)
СведенияОДоступностиАдресногоКлассификатора (БСП)
ДоступнаЗагрузкаАдресныхСведенийИзИнтернет (БСП)
АдресныйКлассификаторЗагружен (БСП)
ОткрытьСведенияОбАдресномКлассификаторе (БСП)
ЕстьПравоДобавлениеИзменениеАдресныхСведений (БСП)