ДоступныеВерсииАдресныхСведений

Автор: 1С
ОбщийМодуль.АдресныйКлассификаторСлужебный
БСП

Проверяет наличие обновлений адресного классификатора на веб сервере

// Проверяет наличие обновлений адресного классификатора на веб сервере
// для тех объектов, которые ранее уже загружались.
//
// Возвращаемое значение - ТаблицаЗначений - Описание добавленных и измененных субъектов. Содержит Колонки.
//     * КодСубъектаРФ      - Число                   - Код субъекта РФ.
//     * Наименование       - Строка                  - Наименование субъекта РФ.
//     * Сокращение         - Строка                  - Сокращение субъекта РФ.
//     * Индекс             - Число                   - Почтовый индекс.
//     * Идентификатор      - УникальныйИдентификатор - Идентификатор субъекта.
//     * Адрес              - Строка                  - Адрес для скачивания файла данных региона.
//     * ДоступноОбновление - Булево                  - Флаг доступности обновления для данного региона.
//     * Загружено          - Булево                  - Флаг того, что данные хоть раз загружались.
//     * ДатаОбновления     - Дата                    - Дата обновления адресных сведений.
//
Функция ДоступныеВерсииАдресныхСведений(ПараметрыВыгрузки = Неопределено, АдресВоВременномХранилище = Неопределено) Экспорт
	
	Результат = Новый ТаблицаЗначений;
	
	ТипСтрока = Новый ОписаниеТипов("Строка");
	ТипЧисло  = Новый ОписаниеТипов("Число");
	ТипБулево = Новый ОписаниеТипов("Булево");
	ТипДата   = Новый ОписаниеТипов("Дата");
	Колонки   = Результат.Колонки;
	
	Колонки.Добавить("КодСубъектаРФ",      ТипЧисло);
	Колонки.Добавить("Наименование",       ТипСтрока);
	Колонки.Добавить("Сокращение",         ТипСтрока);
	Колонки.Добавить("Индекс",             ТипЧисло);
	Колонки.Добавить("Идентификатор",      Новый ОписаниеТипов("УникальныйИдентификатор") );
	Колонки.Добавить("Адрес",              ТипСтрока);
	Колонки.Добавить("ДоступноОбновление", ТипБулево);
	Колонки.Добавить("Загружено",          ТипБулево);
	Колонки.Добавить("ДатаОбновления",      ТипДата);
	
	Результат.Индексы.Добавить("КодСубъектаРФ");
	
	Если НЕ ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПолучениеФайловИзИнтернета") Тогда
		Возврат Результат;
	КонецЕсли;
	
	МодульПолучениеФайловИзИнтернета = ОбщегоНазначения.ОбщийМодуль("ПолучениеФайловИзИнтернета");
	
	АдресОписания = АдресИнтернетаВключаяПорт(АдресФайлаОписанияДоступныхВерсий());
	РезультатПолученияФайла = МодульПолучениеФайловИзИнтернета.СкачатьФайлНаСервере(АдресОписания.Адрес);
	Если Не РезультатПолученияФайла.Статус Тогда
		Возврат Результат;
	КонецЕсли;
	
	// Получен 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
///////////////////////////////////////////////////////////////////////////////////////////////////////
OneTracker - трекер учета рабочего времени программиста 1С

Похожие публикации

СведенияОДоступностиАдресныхСведений (БСП)

СведенияОДоступностиАдресногоКлассификатора (БСП)

ДоступнаЗагрузкаАдресныхСведенийИзИнтернет (БСП)

АдресныйКлассификаторЗагружен (БСП)

ОткрытьСведенияОбАдресномКлассификаторе (БСП)