#Область ОписаниеПеременных
&НаКлиенте
Перем ПодтверждениеЗакрытияФормы;
&НаКлиенте
Перем ПараметрыФоновойЗагрузкиКлассификатора;
#КонецОбласти
#Область ОбработчикиСобытийФормы
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
УстановитьУсловноеОформление();
Если ОбщегоНазначения.РазделениеВключено() Тогда
Отказ = Истина;
КонецЕсли;
ДоступнаЗагрузкаАдресныхСведенийИзИнтернет = АдресныйКлассификаторСлужебный.ДоступнаЗагрузкаАдресныхСведенийИзИнтернет();
Если ОбщегоНазначения.ПодсистемаСуществует("ИнтернетПоддержкаПользователей")
И ДоступнаЗагрузкаАдресныхСведенийИзИнтернет Тогда
ЗаполнитьЗначенияСвойств(ДоступныеИсточникиЗагрузки.Добавить(), Элементы.ДоступныеИсточникиЗагрузкиСайт.СписокВыбора[0]);
КодИсточникаЗагрузки = "САЙТ";
Иначе
Элементы.ГруппаИсточникиЗагрузки.ОтображатьЗаголовок = Ложь;
Элементы.ГруппаЗагрузкиССайта.Видимость = Ложь;
Элементы.ДоступныеИсточникиЗагрузкиКаталог.Видимость = Ложь;
Элементы.АдресЗагрузки.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Авто;
КодИсточникаЗагрузки = "КАТАЛОГ";
КонецЕсли;
ЗаполнитьЗначенияСвойств(ДоступныеИсточникиЗагрузки.Добавить(), Элементы.ДоступныеИсточникиЗагрузкиКаталог.СписокВыбора[0]);
ИдентификаторыДляОбновления = Новый Массив;
ТаблицаРегионов = АдресныйКлассификаторСлужебный.СведенияОЗагрузкеСубъектовРФ();
ТаблицаРегионов.Колонки.Добавить("Загружать", Новый ОписаниеТипов("Булево"));
ТаблицаРегионов.Колонки.Добавить("РежимРаботы", Новый ОписаниеТипов("Строка"));
Если Параметры.Свойство("ВыборАдресаПоПочтовомуИндексу") И КодИсточникаЗагрузки = "САЙТ" Тогда
РежимРаботы = "ОБНОВЛЕНИЕ";
ПочтовыйИндекс = Параметры.ПочтовыйИндекс;
Элементы.ШагиЗагрузки.ТекущаяСтраница = Элементы.ОбновлениеКлассификатора;
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда
МодульАдресныйКлассификаторСлужебный = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификаторСлужебный");
СведенияОРегионе = МодульАдресныйКлассификаторСлужебный.ОпределитьРегионПоИндексу(ПочтовыйИндекс);
Если СведенияОРегионе <> Неопределено Тогда
ПредставлениеРегиона = " (" + СведенияОРегионе.Представление + ")";
ТекущийКодРегиона = СведенияОРегионе.КодСубъектаРФ;
КонецЕсли;
Элементы.ТекстИндексНеНайден.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Элементы.ТекстИндексНеНайден.Заголовок, ПочтовыйИндекс, ПредставлениеРегиона);
КонецЕсли;
Элементы.ОбновитьКлассификатор.КнопкаПоУмолчанию = Истина;
Иначе
РежимРаботы = "ЗАГРУЗКА";
ТекущийКодРегиона = Неопределено;
Параметры.Свойство("КодРегионаДляЗагрузки", ТекущийКодРегиона);
Если ДоступнаЗагрузкаАдресныхСведенийИзИнтернет Тогда
ДоступныеВерсии = АдресныйКлассификаторСлужебный.ДоступныеВерсииАдресныхСведений();
Фильтр = Новый Структура("Загружено, ДоступноОбновление", Истина, Истина);
ОбновленныеДанные = ДоступныеВерсии.Скопировать(Фильтр);
КоличествоОбновлений = ОбновленныеДанные.Количество();
Если КоличествоОбновлений > 0 Тогда
ДатаОбновления = Формат(ОбновленныеДанные[0].ДатаОбновления, "ДЛФ=DD");
ИнформацияОбОбновление = НСтр("ru = 'Доступно обновление от'") + " " + ДатаОбновления;
ИдентификаторыДляОбновления = ОбновленныеДанные.ВыгрузитьКолонку("Идентификатор");
Иначе
Элементы.ИнформацияОбОбновление.Видимость = Ложь;
Фильтр = Новый Структура("Загружено, ДоступноОбновление", Истина, Ложь);
ОбновленныеДанные = ДоступныеВерсии.Скопировать(Фильтр);
ИдентификаторыДляОбновления = ОбновленныеДанные.ВыгрузитьКолонку("Идентификатор");
КонецЕсли;
КонецЕсли;
КонецЕсли;
ТипТекущегоКодаРегиона = ТипЗнч(ТекущийКодРегиона);
ТипЧисло = Новый ОписаниеТипов("Число");
Если ТипТекущегоКодаРегиона = Тип("Массив") И ТекущийКодРегиона.Количество() > 0 Тогда
Фильтр = Новый Структура("КодСубъектаРФ");
Для Каждого КодРегиона Из ТекущийКодРегиона Цикл
Фильтр.КодСубъектаРФ = ТипЧисло.ПривестиЗначение(КодРегиона);
Кандидаты = ТаблицаРегионов.НайтиСтроки(Фильтр);
Если Кандидаты.Количество() > 0 Тогда
Кандидаты[0].Загружать = Истина;
КонецЕсли;
КонецЦикла;
ТекущийКодРегиона = ТекущийКодРегиона[0];
ИначеЕсли ТипТекущегоКодаРегиона = Тип("Строка") Тогда
ТекущийКодРегиона = ТипЧисло.ПривестиЗначение(ТекущийКодРегиона);
ИначеЕсли ЗначениеЗаполнено(Параметры.НазваниеРегиона) Тогда
ТекущийКодРегиона = АдресныйКлассификатор.КодРегионаПоНаименованию(Параметры.НазваниеРегиона);
КонецЕсли;
Если НЕ ЗначениеЗаполнено(ТекущийКодРегиона) И ИдентификаторыДляОбновления.Количество() > 0 Тогда
Фильтр = Новый Структура("Идентификатор");
Для Каждого Идентификатор Из ИдентификаторыДляОбновления Цикл
Фильтр.Идентификатор = Идентификатор;
Кандидаты = ТаблицаРегионов.НайтиСтроки(Фильтр);
Если Кандидаты.Количество() > 0 Тогда
Кандидаты[0].Загружать = Истина;
КонецЕсли;
КонецЦикла;
КонецЕсли;
ЗначениеВРеквизитФормы(ТаблицаРегионов, "СубъектыРФ");
Если ТекущийКодРегиона <> Неопределено Тогда
Кандидаты = СубъектыРФ.НайтиСтроки(Новый Структура("КодСубъектаРФ", ТекущийКодРегиона));
Если Кандидаты.Количество() > 0 Тогда
ТекущаяСтрока = Кандидаты[0];
ТекущаяСтрока.Загружать = Истина;
Элементы.СубъектыРФ.ТекущаяСтрока = ТекущаяСтрока.ПолучитьИдентификатор();
КонецЕсли;
КонецЕсли;
Если РежимРаботы = "ЗАГРУЗКА" Тогда
Если Элементы.СубъектыРФ.ТекущаяСтрока = Неопределено Тогда
Кандидаты = СубъектыРФ.НайтиСтроки(Новый Структура("Загружать", Истина));
Если Кандидаты.Количество() > 0 Тогда
Элементы.СубъектыРФ.ТекущаяСтрока = Кандидаты[0].ПолучитьИдентификатор();
КонецЕсли;
КонецЕсли;
АутентификацияВыполнена = ДанныеАутентификацииСайтаСохранены();
Элементы.ИнформацияОбОбновление.Видимость = АутентификацияВыполнена;
Элементы.АвторизацияНаСайтеПоддержкиПользователей.Видимость = НЕ Элементы.ИнформацияОбОбновление.Видимость;
СохраняемыеВНастройкахДанныеМодифицированы = Истина;
КонецЕсли;
Элементы.ПроверитьВсеАдреса.Видимость = ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтрольВеденияУчета");
КонецПроцедуры
&НаСервере
Процедура ПередЗагрузкойДанныхИзНастроекНаСервере(Настройки)
КодИсточника = Настройки["КодИсточникаЗагрузки"];
Если ДоступныеИсточникиЗагрузки.НайтиПоЗначению(КодИсточника) = Неопределено Тогда
Настройки.Удалить("КодИсточникаЗагрузки");
Настройки.Удалить("АдресЗагрузки");
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПриОткрытии(Отказ)
Если ПредупреждениеПриОткрытии <> "" Тогда
ПоказатьПредупреждение(, ПредупреждениеПриОткрытии);
Отказ = Истина;
Возврат;
КонецЕсли;
ОбновитьИнтерфейсПоКоличествуЗагружаемых();
ПроверитьДоступностьОбновленияКлиент();
КонецПроцедуры
&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
Если Элементы.ШагиЗагрузки.ТекущаяСтраница <> Элементы.ОжиданиеЗагрузки
Или ПодтверждениеЗакрытияФормы = Истина Тогда
Возврат;
КонецЕсли;
Отказ = Истина;
Если ЗавершениеРаботы Тогда
Возврат;
КонецЕсли;
Оповещение = Новый ОписаниеОповещения("ЗакрытиеФормыЗавершение", ЭтотОбъект);
Текст = НСтр("ru = 'Прервать загрузку адресного классификатора?'");
ПоказатьВопрос(Оповещение, Текст, РежимДиалогаВопрос.ДаНет);
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиСобытийЭлементовШапкиФормы
&НаКлиенте
Процедура АдресЗагрузкиНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
АдресныйКлассификаторКлиент.ВыбратьКаталог(ЭтотОбъект, "АдресЗагрузки",
НСтр("ru = 'Папка с файлами адресного классификатора'"),
СтандартнаяОбработка,
Новый ОписаниеОповещения("ЗавершениеВыбораКаталогаАдресаЗагрузки", ЭтотОбъект));
КонецПроцедуры
&НаКлиенте
Процедура СубъектыРФЗагружатьПриИзменении(Элемент)
ОбновитьИнтерфейсПоКоличествуЗагружаемых();
КонецПроцедуры
&НаКлиенте
Процедура ДоступныеИсточникиЗагрузкиПриИзменении(Элемент)
УстановитьДоступностьИсточниковЗагрузки();
КонецПроцедуры
&НаКлиенте
Процедура АдресЗагрузкиПриИзменении(Элемент)
УстановитьИсточникомЗагрузкиКаталог();
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиСобытийЭлементовТаблицыФормыСубъектыРФ
&НаКлиенте
Процедура СубъектыРФВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Если Поле = Элементы.СубъектыРФПредставление Тогда
ТекущиеДанные = СубъектыРФ.НайтиПоИдентификатору(ВыбраннаяСтрока);
Если ТекущиеДанные <> Неопределено Тогда
ТекущиеДанные.Загружать = Не ТекущиеДанные.Загружать;
ОбновитьИнтерфейсПоКоличествуЗагружаемых();
КонецЕсли
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиКомандФормы
&НаКлиенте
Процедура УстановитьФлажки(Команда)
УстановитьПометкиСпискаРегионов(Истина);
КонецПроцедуры
&НаКлиенте
Процедура СнятьФлажки(Команда)
УстановитьПометкиСпискаРегионов(Ложь);
КонецПроцедуры
&НаКлиенте
Процедура Загрузить(Команда)
Если КодИсточникаЗагрузки = "КАТАЛОГ" Тогда
Текст = НСтр("ru = 'Для загрузки адресного классификатора из папки установите расширение для работы с 1С:Предприятием.'");
КонтрольРасширенияРаботыСФайлами(Текст, КодИсточникаЗагрузки, АдресЗагрузки);
ИначеЕсли КодИсточникаЗагрузки = "САЙТ" Тогда
ЗагрузитьКлассификаторССайта();
Иначе
ОбщегоНазначенияКлиент.СообщитьПользователю( НСтр("ru = 'Не указан вариант загрузки классификатора.'") );
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПрерватьЗагрузку(Команда)
ПодтверждениеЗакрытияФормы = Неопределено;
Закрыть();
КонецПроцедуры
&НаКлиенте
Процедура АвторизацияНаСайтеПоддержкиПользователей(Команда)
Оповещение = Новый ОписаниеОповещения("ПослеВводаЛогинИПароля", ЭтотОбъект);
АдресныйКлассификаторКлиент.АвторизоватьНаСайтеПоддержкиПользователей(Оповещение, ЭтотОбъект);
КонецПроцедуры
&НаКлиенте
Процедура ПослеВводаЛогинИПароля(Результат, Параметр) Экспорт
Если ТипЗнч(Результат) = Тип("Структура") Тогда
Элементы.АвторизацияНаСайтеПоддержкиПользователей.Видимость = Ложь;
Элементы.ИнформацияОбОбновление.Видимость = Истина;
АутентификацияВыполнена = Истина;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ЗакрытьБезПодтверждения(Команда)
ПодтверждениеЗакрытияФормы = Истина;
Закрыть();
КонецПроцедуры
&НаКлиенте
Процедура ОбновитьКлассификатор(Команда)
Если КодИсточникаЗагрузки = "САЙТ" Тогда
ЗагрузитьКлассификаторССайта();
Элементы.ШагиЗагрузки.ТекущаяСтраница = Элементы.ОжиданиеЗагрузки;
Иначе
Элементы.ШагиЗагрузки.ТекущаяСтраница = Элементы.ВыборРегионовЗагрузки;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПроверитьВсеАдреса(Команда)
Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.КонтрольВеденияУчета") Тогда
МодульКонтрольВеденияУчетаСлужебныйКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("КонтрольВеденияУчетаСлужебныйКлиент");
МодульКонтрольВеденияУчетаСлужебныйКлиент.ОткрытьСписокПроверокВеденияУчета();
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
&НаКлиенте
Процедура ПроверитьДоступностьОбновленияКлиент()
Задание = ЗапуститьПроверкуДоступностиОбновления(УникальныйИдентификатор);
НастройкиОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);
НастройкиОжидания.ВыводитьОкноОжидания = Ложь;
Обработчик = Новый ОписаниеОповещения("ПослеПроверкиДоступностиОбновленияКлиент", ЭтотОбъект);
ДлительныеОперацииКлиент.ОжидатьЗавершение(Задание, Обработчик, НастройкиОжидания);
КонецПроцедуры
&НаКлиенте
Процедура ПослеПроверкиДоступностиОбновленияКлиент(Результат, ДополнительныеПараметры) Экспорт
Если Результат = Неопределено Тогда
Возврат;
КонецЕсли;
Если Результат.Статус = "Ошибка" Тогда
СтандартныеПодсистемыКлиент.ВывестиИнформациюОбОшибке(
Результат.ИнформацияОбОшибке);
Возврат;
КонецЕсли;
Если Результат.Статус = "Выполнено" Тогда
Даты = ДатыОбновленияАдресногоКлассификатор(Результат.АдресРезультата);
Если Даты.ДатаОбновления > Даты.ДатаСамойСтаройЗагрузки Тогда
ДатаОбновленияСтрокой = Формат(Даты.ДатаОбновления, "ДЛФ=DD");
ИнформацияОбОбновление = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Доступно обновление от %1'"), ДатаОбновленияСтрокой);
Элементы.ИнформацияОбОбновление.Видимость = НЕ Элементы.АвторизацияНаСайтеПоддержкиПользователей.Видимость;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ЗакрытиеФормыЗавершение(Знач РезультатВопроса, Знач ДополнительныеПараметры) Экспорт
Если РезультатВопроса = КодВозвратаДиалога.Да Тогда
ПодтверждениеЗакрытияФормы = Истина;
ЗавершитьФоновыеЗадания(ИдентификаторЗадания, КаталогВременныФайлов);
Закрыть();
Иначе
ПодтверждениеЗакрытияФормы = Неопределено;
КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Процедура ЗавершитьФоновыеЗадания(ИдентификаторЗадания, КаталогВременныФайлов)
Если ЗначениеЗаполнено(ИдентификаторЗадания) Тогда
ДлительныеОперации.ОтменитьВыполнениеЗадания(ИдентификаторЗадания);
КонецЕсли;
ОчиститьКаталогВременногоХранилищаФайлов(КаталогВременныФайлов);
КонецПроцедуры
&НаКлиенте
Процедура УстановитьРазрешениеЗагрузки(Знач КоличествоЗагружаемых = Неопределено)
Если КоличествоЗагружаемых = Неопределено Тогда
Фильтр = Новый Структура("Загружать", Истина);
КоличествоЗагружаемых = СубъектыРФ.НайтиСтроки(Фильтр).Количество();
КонецЕсли;
Элементы.Загрузить.Доступность = (КоличествоЗагружаемых > 0)
И ДоступныеИсточникиЗагрузки.НайтиПоЗначению(КодИсточникаЗагрузки) <> Неопределено;
КонецПроцедуры
&НаСервереБезКонтекста
Функция ДатыОбновленияАдресногоКлассификатор(АдресРезультата)
Результат = Новый Структура("ДатаСамойСтаройЗагрузки, ДатаОбновления", Дата(1,1,1), Дата(1,1,1));
ИнформацияОбновление = ПолучитьИзВременногоХранилища(АдресРезультата);
Если ЗначениеЗаполнено(ИнформацияОбновление)
И ИнформацияОбновление.Свойство("Таблица")
И ИнформацияОбновление.Таблица.Количество() > 0 Тогда
ДатаОбновления = ИнформацияОбновление.Таблица[0].ДатаОбновления;
Если ТипЗнч(ДатаОбновления) <> Тип("Дата") Тогда
Возврат Ложь;
КонецЕсли;
Результат.ДатаОбновления = НачалоДня(ДатаОбновления);
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ВЫБОР
| КОГДА НАЧАЛОПЕРИОДА(МИНИМУМ(ЗагруженныеВерсииАдресныхСведений.ДатаВерсии), ДЕНЬ) ЕСТЬ NULL
| ТОГДА ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
| ИНАЧЕ НАЧАЛОПЕРИОДА(МИНИМУМ(ЗагруженныеВерсииАдресныхСведений.ДатаВерсии), ДЕНЬ)
| КОНЕЦ КАК ДатаВерсии
|ИЗ
| РегистрСведений.ЗагруженныеВерсииАдресныхСведений КАК ЗагруженныеВерсииАдресныхСведений";
РезультатЗапроса = Запрос.Выполнить().Выбрать();
Если РезультатЗапроса.Следующий() Тогда
Результат.ДатаСамойСтаройЗагрузки = РезультатЗапроса.ДатаВерсии;
Иначе
Результат.ДатаСамойСтаройЗагрузки = Дата(1, 1, 1);
КонецЕсли;
КонецЕсли;
Возврат Результат;
КонецФункции
&НаСервереБезКонтекста
Функция ЗапуститьПроверкуДоступностиОбновления(УникальныйИдентификатор)
ПараметрыВызоваСервера = Новый Массив;
ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
ПараметрыВыполнения.НаименованиеФоновогоЗадания = НСтр("ru = 'Проверка обновления для адресного классификатора'");
ФоновоеЗадание = ДлительныеОперации.ВыполнитьВФоне("АдресныйКлассификаторСлужебный.ДоступныеВерсииАдресныхСведений",
ПараметрыВызоваСервера, ПараметрыВыполнения);
Возврат ФоновоеЗадание;
КонецФункции
&НаКлиенте
Процедура ЗавершениеВыбораКаталогаАдресаЗагрузки(Каталог, ДополнительныеПараметры) Экспорт
УстановитьИсточникомЗагрузкиКаталог();
КонецПроцедуры
&НаКлиенте
Процедура УстановитьИсточникомЗагрузкиКаталог()
КодИсточникаЗагрузки = "КАТАЛОГ";
КонецПроцедуры
&НаКлиенте
Процедура УстановитьДоступностьИсточниковЗагрузки()
Элементы.АдресЗагрузки.Доступность = КодИсточникаЗагрузки = "КАТАЛОГ";
КонецПроцедуры
&НаКлиенте
Процедура УстановитьПометкиСпискаРегионов(Знач Пометка)
ЭлементТаблицы = Элементы.СубъектыРФ;
Для Каждого СтрокаРегиона Из СубъектыРФ Цикл
Если ЭлементТаблицы.ДанныеСтроки( СтрокаРегиона.ПолучитьИдентификатор() ) <> Неопределено Тогда
СтрокаРегиона.Загружать = Пометка;
КонецЕсли;
КонецЦикла;
ОбновитьИнтерфейсПоКоличествуЗагружаемых();
КонецПроцедуры
&НаКлиенте
Процедура ОбновитьИнтерфейсПоКоличествуЗагружаемых()
ВыбраноРегионовДляЗагрузки = СубъектыРФ.НайтиСтроки( Новый Структура("Загружать", Истина) ).Количество();
ТекстОписанияЗагрузки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Загружаются данные по выбранным регионам (%1)'"), ВыбраноРегионовДляЗагрузки);
УстановитьРазрешениеЗагрузки(ВыбраноРегионовДляЗагрузки);
КонецПроцедуры
#Область ЗагрузкаАдресногоКлассификатор
&НаКлиенте
Процедура ЗагрузитьКлассификаторССайта()
КодыРегионов = КодыРегионовДляЗагрузки();
Если НЕ АутентификацияВыполнена Тогда
Оповещение = Новый ОписаниеОповещения("ЗагрузитьКлассификаторССайтаЗапросАутентификации", ЭтотОбъект, Новый Структура);
Оповещение.ДополнительныеПараметры.Вставить("КодыРегионов", КодыРегионов);
АдресныйКлассификаторКлиент.АвторизоватьНаСайтеПоддержкиПользователей(Оповещение, ЭтотОбъект);
Возврат;
КонецЕсли;
ЗагрузитьКлассификаторССайтаАутентификация(КодыРегионов);
КонецПроцедуры
&НаКлиенте
Процедура КонтрольРасширенияРаботыСФайлами(Знач ТекстПредложения, Знач КодИсточника, Знач АдресИсточника)
Оповещение = Новый ОписаниеОповещения("КонтрольРасширенияРаботыСФайламиЗавершение", ЭтотОбъект, Новый Структура);
Оповещение.ДополнительныеПараметры.Вставить("КодИсточникаЗагрузки", КодИсточника);
Оповещение.ДополнительныеПараметры.Вставить("АдресЗагрузки", АдресИсточника);
ФайловаяСистемаКлиент.ПодключитьРасширениеДляРаботы1СПредприятия(Оповещение, ТекстПредложения, Ложь);
КонецПроцедуры
&НаКлиенте
Процедура КонтрольРасширенияРаботыСФайламиЗавершение(Знач Результат, Знач ДополнительныеПараметры) Экспорт
Если Результат <> Истина Тогда
Возврат;
КонецЕсли;
ЗагрузитьКлассификаторИзКаталога(ДополнительныеПараметры.АдресЗагрузки);
КонецПроцедуры
&НаКлиенте
Процедура ЗагрузитьКлассификаторИзКаталога(Знач КаталогДанных)
КодыРегионов = КодыРегионовДляЗагрузки();
ПараметрыЗагрузки = Новый Структура("КодИсточникаЗагрузки, ПолеОшибки", КодИсточникаЗагрузки, "АдресЗагрузки");
ОписаниеОповещения = Новый ОписаниеОповещения("ЗагрузитьКлассификаторИзКаталогаЗавершение", ЭтотОбъект);
АдресныйКлассификаторКлиент.АнализДоступностиФайловКлассификатораВКаталоге(ОписаниеОповещения, КодыРегионов, КаталогДанных, ПараметрыЗагрузки);
КонецПроцедуры
&НаКлиенте
Процедура ЗагрузитьКлассификаторИзКаталогаЗавершение(РезультатАнализа, ДополнительныеПараметры) Экспорт
Если РезультатАнализа.Ошибки <> Неопределено Тогда
ОчиститьСообщения();
ОбщегоНазначенияКлиентСервер.СообщитьОшибкиПользователю(РезультатАнализа.Ошибки);
Возврат;
КонецЕсли;
УдалитьПослеПередачиНаСервер = Новый Массив;
РезультатАнализа.Вставить("УдалитьПослеПередачиНаСервер", УдалитьПослеПередачиНаСервер);
ЗапуститьФоновуюЗагрузкуИзКаталогаКлиента(РезультатАнализа);
КонецПроцедуры
&НаКлиенте
Процедура ЗагрузитьКлассификаторССайтаЗапросАутентификации(Знач Результат, Знач ДополнительныеПараметры) Экспорт
Если ТипЗнч(Результат) = Тип("Структура") Тогда
ЗагрузитьКлассификаторССайтаАутентификация(ДополнительныеПараметры.КодыРегионов);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ЗагрузитьКлассификаторССайтаАутентификация(Знач КодыРегионов)
ОчиститьСообщения();
Элементы.ШагиЗагрузки.ТекущаяСтраница = Элементы.ОжиданиеЗагрузки;
ТекстСостоянияЗагрузки = НСтр("ru = 'Загрузка файлов с Портала 1С:ИТС...'");
ОповещениеОПрогрессеВыполнения = Новый ОписаниеОповещения("ПрогрессВыполнения", ЭтотОбъект);
Задание = ЗапуститьФоновуюЗагрузкуССайтаНаСервере(КодыРегионов, ЗагружатьИсториюИзмененийАдресныхОбъектов, УникальныйИдентификатор,
КаталогВременныФайлов);
ИдентификаторЗадания = Задание.ИдентификаторЗадания;
НастройкиОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);
НастройкиОжидания.ВыводитьОкноОжидания = Ложь;
НастройкиОжидания.ОповещениеОПрогрессеВыполнения = ОповещениеОПрогрессеВыполнения;
Обработчик = Новый ОписаниеОповещения("ПослеФоновойЗагрузкиССайта", ЭтотОбъект);
ДлительныеОперацииКлиент.ОжидатьЗавершение(Задание, Обработчик, НастройкиОжидания);
Элементы.ПрерватьЗагрузку.Доступность = Истина;
КонецПроцедуры
&НаКлиенте
Процедура ПослеФоновойЗагрузкиССайта(Результат, ДополнительныеПараметры) Экспорт
Если Результат = Неопределено Тогда
Возврат;
КонецЕсли;
Статус = Результат.Статус;
Если Статус = "Выполнено" Тогда
Порции = ПолучитьИзВременногоХранилища(Результат.АдресРезультата);
Если ТипЗнч(Порции) = Тип("Соответствие") Тогда
Для Каждого Порция Из Порции Цикл
Если Порция.Значение.Статус = "Ошибка" Тогда
Статус = Порция.Значение.Статус;
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЕсли;
Если Статус = "Ошибка" Тогда
Если СтрНайти(Результат.КраткоеПредставлениеОшибки, "404 Not Found") > 0 ИЛИ СтрНайти(Результат.КраткоеПредставлениеОшибки, "401 Unauthorized") > 0 Тогда
ТекстОшибки = НСтр("ru = 'Не удается загрузить адресные сведения. Возможные причины:
| • Некорректно введен или не введен логин и пароль;
| • Нет подключения к Интернету;
| • На сайте ведутся технические работы, попробуйте повторить загрузку позднее;
| • Брандмауэр или другое промежуточное ПО (антивирусы и т.п.) блокируют попытки приложения подключиться к Интернету;
| • Подключение к Интернету выполняется через прокси-сервер, но его параметры не заданы в приложении.
|
|Техническая информация:'") + Символы.ПС + СтрПолучитьСтроку(Результат.КраткоеПредставлениеОшибки, 1);
Иначе
ТекстОшибки = НСтр("ru = 'Вероятно в данный момент на сайте ведутся технические работы. Попробуйте повторить загрузку позднее.
|Техническая информация:'") + Символы.ПС + Результат.КраткоеПредставлениеОшибки;
КонецЕсли;
Результаты = ПолучитьИзВременногоХранилища(Результат.АдресРезультата);
Если ТипЗнч(Результаты) = Тип("Соответствие") Тогда
Для Каждого РезультатПорции Из Результаты Цикл
Если РезультатПорции.Значение.Статус = "Ошибка" Тогда
ВывестиСообщениеОбОшибке(РезультатПорции.Значение);
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
ИначеЕсли Статус = "Выполнено" Тогда
ЗавершениеЗагрузки();
КонецЕсли;
ОчиститьКаталогВременногоХранилищаФайлов(КаталогВременныФайлов);
КонецПроцедуры
&НаКлиенте
Процедура ЗапуститьФоновуюЗагрузкуИзКаталогаКлиента(Знач ПараметрыЗагрузки)
Если ПараметрыЗагрузки = Неопределено Тогда
Возврат;
КонецЕсли;
ТекстСостоянияЗагрузки = НСтр("ru = 'Передача файла на сервер приложения...'");
ПараметрыФоновойЗагрузкиКлассификатора = Неопределено;
Элементы.ШагиЗагрузки.ТекущаяСтраница = Элементы.ОжиданиеЗагрузки;
ПомещаемыеФайлы = Новый Массив;
Для Каждого КлючЗначение Из ПараметрыЗагрузки.ФайлыПоРегионам Цикл
Если ТипЗнч(КлючЗначение.Значение) = Тип("Массив") Тогда
Для Каждого ИмяФайла Из КлючЗначение.Значение Цикл
ПомещаемыеФайлы.Добавить(Новый ОписаниеПередаваемогоФайла(ИмяФайла));
КонецЦикла;
Иначе
ПомещаемыеФайлы.Добавить(Новый ОписаниеПередаваемогоФайла(КлючЗначение.Значение));
КонецЕсли;
КонецЦикла;
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("ПараметрыЗагрузки", ПараметрыЗагрузки);
ДополнительныеПараметры.Вставить("Позиция", 0);
ОписаниеОповещения = Новый ОписаниеОповещения("ЗапуститьФоновуюЗагрузкуИзКаталогаКлиентаПослеПомещенияФайлов",
ЭтотОбъект, ДополнительныеПараметры);
ПараметрыЗагрузкиФайла = ФайловаяСистемаКлиент.ПараметрыЗагрузкиФайла();
ПараметрыЗагрузкиФайла.ИдентификаторФормы = УникальныйИдентификатор;
ПараметрыЗагрузкиФайла.Интерактивно = Ложь;
ФайловаяСистемаКлиент.ЗагрузитьФайлы(ОписаниеОповещения, ПараметрыЗагрузкиФайла, ПомещаемыеФайлы);
КонецПроцедуры
&НаКлиенте
Процедура ЗапуститьФоновуюЗагрузкуИзКаталогаКлиентаПослеПомещенияФайлов(ПомещенныеФайлы, ДополнительныеПараметры) Экспорт
Позиция = ДополнительныеПараметры.Позиция;
Если Позиция <= ПомещенныеФайлы.ВГраница() Тогда
Описание = ПомещенныеФайлы[Позиция];
ДанныеФайла = Новый Структура("Имя, Хранение");
ЗаполнитьЗначенияСвойств(ДанныеФайла, Описание);
ДополнительныеПараметры.Вставить("ДанныеФайла", ДанныеФайла);
ДополнительныеПараметры.Вставить("ПомещенныеФайлы", ПомещенныеФайлы);
Файл = Новый Файл(Описание.ПолноеИмя);
Файл.НачатьПолучениеУниверсальногоВремениИзменения(Новый ОписаниеОповещения("ЗапуститьФоновуюЗагрузкуИзКаталогаКлиентаПослеПолученияВремениИзменения",
ЭтотОбъект, ДополнительныеПараметры));
Иначе
ОповещениеОПрогрессеВыполнения = Новый ОписаниеОповещения("ПрогрессВыполнения", ЭтотОбъект);
Задание = ЗапуститьФоновуюЗагрузкуНаСервере(ДополнительныеПараметры.ПараметрыЗагрузки.КодыРегионов, ПомещенныеФайлы,
КаталогВременныФайлов, ЗагружатьИсториюИзмененийАдресныхОбъектов, УникальныйИдентификатор);
Если Задание.Статус = "Выполняется" Тогда
ИдентификаторЗадания = Задание.ИдентификаторЗадания;
НастройкиОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);
НастройкиОжидания.ВыводитьОкноОжидания = Ложь;
НастройкиОжидания.ОповещениеОПрогрессеВыполнения = ОповещениеОПрогрессеВыполнения;
Обработчик = Новый ОписаниеОповещения("ПослеФоновойЗагрузкиИзКаталога", ЭтотОбъект, ДополнительныеПараметры);
ДлительныеОперацииКлиент.ОжидатьЗавершение(Задание, Обработчик, НастройкиОжидания);
Элементы.ПрерватьЗагрузку.Доступность = Истина;
Иначе
РезультатыВыполнения = ПолучитьИзВременногоХранилища(Задание.АдресРезультата);
Если ТипЗнч(РезультатыВыполнения) = Тип("Соответствие") Тогда
Для Каждого РезультатВыполнения Из РезультатыВыполнения Цикл
Если РезультатВыполнения.Значение.Статус = "Ошибка" Тогда
ПослеФоновойЗагрузкиИзКаталога(РезультатВыполнения.Значение, Неопределено);
Возврат;
КонецЕсли;
КонецЦикла;
КонецЕсли;
ПослеФоновойЗагрузкиИзКаталога(Задание, Неопределено);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ЗапуститьФоновуюЗагрузкуИзКаталогаКлиентаПослеПолученияВремениИзменения(ВремяИзменения, ДополнительныеПараметры) Экспорт
ДополнительныеПараметры.ДанныеФайла.Вставить("ВремяИзменения", ВремяИзменения);
ДополнительныеПараметры.ПомещенныеФайлы[ДополнительныеПараметры.Позиция] = ДополнительныеПараметры.ДанныеФайла;
ДополнительныеПараметры.Позиция = ДополнительныеПараметры.Позиция + 1;
ЗапуститьФоновуюЗагрузкуИзКаталогаКлиентаПослеПомещенияФайлов(ДополнительныеПараметры.ПомещенныеФайлы, ДополнительныеПараметры);
КонецПроцедуры
&НаКлиенте
Процедура ПослеФоновойЗагрузкиИзКаталога(Результат, ДополнительныеПараметры) Экспорт
Если Результат = Неопределено Тогда
Возврат;
КонецЕсли;
Статус = Результат.Статус;
ТекстОшибки = "";
Если Статус = "Выполнено" Тогда
Порции = ПолучитьИзВременногоХранилища(Результат.АдресРезультата);
ИменаНезагруженныхРегионов = Новый Массив;
Если ТипЗнч(Порции) = Тип("Соответствие") Тогда
Для Каждого Порция Из Порции Цикл
Если Порция.Значение.Статус = "Ошибка" Тогда
Статус = Порция.Значение.Статус;
ИменаНезагруженныхРегионов.Добавить(Порция.Ключ);
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если ИменаНезагруженныхРегионов.Количество() = 1 Тогда
ШаблонТекстаОшибки = НСтр("ru = 'Не удается загрузить адресные сведения из папки для региона ""%1"".
|Подробнее см. в журнале регистрации.'");
ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонТекстаОшибки,
ИменаНезагруженныхРегионов[0]);
ИначеЕсли ИменаНезагруженныхРегионов.Количество() > 1 Тогда
Если ИменаНезагруженныхРегионов.Количество() = 2 Тогда
ШаблонТекстаОшибки = НСтр("ru = 'Не удается загрузить адресные сведения из папки для регионов ""%1"" и ""%2"".
|Подробнее см. в журнале регистрации.'");
Иначе
ШаблонТекстаОшибки = НСтр("ru = 'Не удается загрузить адресные сведения из папки для регионов ""%1"", ""%2"" и др.
|Подробнее см. в журнале регистрации.'");
КонецЕсли;
ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонТекстаОшибки,
ИменаНезагруженныхРегионов[0], ИменаНезагруженныхРегионов[1]);
КонецЕсли;
КонецЕсли;
Если Статус = "Ошибка" Тогда
Если ПустаяСтрока(ТекстОшибки) Тогда
ТекстОшибки = НСтр("ru = 'Не удается загрузить адресные сведения из папки.
|Сохраните файлы с сайта ""1С"" (http://its.1c.ru/download/fias2) на компьютер, а затем загрузить в приложение.
|
|Техническая информация:'") + Символы.ПС + Результат.КраткоеПредставлениеОшибки;
КонецЕсли;
ВывестиСообщениеОбОшибке(Результат);
ИначеЕсли Статус = "Выполнено" Тогда
ЗавершениеЗагрузки();
КонецЕсли;
ОчиститьКаталогВременногоХранилищаФайлов(КаталогВременныФайлов);
КонецПроцедуры
&НаКлиенте
Процедура ВывестиСообщениеОбОшибке(Результат)
СтандартныеПодсистемыКлиент.ВывестиИнформациюОбОшибке(Результат.ИнформацияОбОшибке);
КонецПроцедуры
&НаКлиенте
Процедура ПрогрессВыполнения(Результат, ДополнительныеПараметры) Экспорт
Если Результат.Статус = "Выполняется"
И Результат.Прогресс <> Неопределено Тогда
Прогресс = Результат.Прогресс;
Если Прогресс.Свойство("Процент")
И Прогресс.Свойство("ДополнительныеПараметры")
И Прогресс.ДополнительныеПараметры = "ПрогрессМногопоточногоПроцесса" Тогда
ПрогрессЗагрузки = Прогресс.Процент;
Иначе
ТекстСостоянияЗагрузки = Прогресс.Текст;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Функция КодыРегионовДляЗагрузки()
Результат = Новый СписокЗначений;
Для Каждого Регион Из СубъектыРФ.НайтиСтроки(Новый Структура("Загружать", Истина)) Цикл
Результат.Добавить(Регион.КодСубъектаРФ, Регион.Представление);
КонецЦикла;
Возврат Результат;
КонецФункции
&НаКлиенте
Процедура ЗавершениеЗагрузки()
ОбновитьПовторноИспользуемыеЗначения();
Оповестить("ЗагруженАдресныйКлассификатор", Истина, ЭтотОбъект);
ПодтверждениеЗакрытияФормы = Истина;
Если РежимРаботы = "ОБНОВЛЕНИЕ" Тогда
Закрыть(Истина);
КонецЕсли;
Элементы.ШагиЗагрузки.ТекущаяСтраница = Элементы.УспешноеЗавершение;
ТекстОписанияЗагрузки = НСтр("ru = 'Адресный классификатор успешно загружен.'");
Элементы.Закрыть.КнопкаПоУмолчанию = Истина;
ТекущийЭлемент = Элементы.Закрыть;
КонецПроцедуры
&НаСервереБезКонтекста
Функция ЗапуститьФоновуюЗагрузкуССайтаНаСервере(КодыРегионов, ЗагружатьИсторию, УникальныйИдентификатор, ВременныйКаталог)
ВременныйКаталог = АдресныйКлассификаторСлужебный.КаталогВременногоХранилищаФайлов();
ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
ПараметрыВыполнения.НаименованиеФоновогоЗадания = НСтр("ru = 'Загрузка адресного классификатора с сайта'");
ПараметрыЗагрузки = АдресныйКлассификаторСлужебный.ПараметрыЗагрузкиКлассификатораАдресов();
ПараметрыЗагрузки.ЗагружатьИсториюАдресов = ЗагружатьИсторию;
ПараметрыЗагрузки.КаталогФайлов = ВременныйКаталог;
ПараметрыМетода = Новый Соответствие();
Для Каждого КодРегиона Из КодыРегионов Цикл
ПараметрыВызоваСервера = Новый Массив;
ПараметрыВызоваСервера.Добавить(КодРегиона);
ПараметрыВызоваСервера.Добавить(ПараметрыЗагрузки);
ПараметрыМетода.Вставить(КодРегиона.Представление, ПараметрыВызоваСервера);
КонецЦикла;
ФоновоеЗадание = ДлительныеОперации.ВыполнитьПроцедуруВНесколькоПотоков("АдресныйКлассификаторСлужебный.ЗагрузкаРегионаАдресногоКлассификатораССайта",
ПараметрыВыполнения, ПараметрыМетода);
Если ФоновоеЗадание.Статус = "Ошибка" Тогда
ОчиститьКаталогВременногоХранилищаФайлов(ВременныйКаталог);
КонецЕсли;
Возврат ФоновоеЗадание;
КонецФункции
&НаСервереБезКонтекста
Процедура ОчиститьКаталогВременногоХранилищаФайлов(КаталогВременныФайлов)
Попытка
ПроверкаКаталогВременныФайлов = Новый Файл(КаталогВременныФайлов);
Если ПроверкаКаталогВременныФайлов.Существует() Тогда
УдалитьФайлы(КаталогВременныФайлов);
КонецЕсли;
Исключение
ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Предупреждение,,,
ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
КонецПроцедуры
&НаСервереБезКонтекста
Функция СобытиеЖурналаРегистрации()
Возврат НСтр("ru = 'Адресный классификатор'", ОбщегоНазначения.КодОсновногоЯзыка());
КонецФункции
&НаСервереБезКонтекста
Функция ЗапуститьФоновуюЗагрузкуНаСервере(Знач КодыРегионов, Знач ОписаниеФайловЗагрузки,
КаталогФайлов, Знач ЗагружатьИсториюИзмененийАдресныхОбъектов, Знач УникальныйИдентификатор)
КаталогФайлов = АдресныйКлассификаторСлужебный.КаталогВременногоХранилищаФайлов();
АдресныйКлассификаторСлужебный.ИзвлечьФайлыВКаталог(ОписаниеФайловЗагрузки, КаталогФайлов);
ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
ПараметрыВыполнения.НаименованиеФоновогоЗадания = НСтр("ru = 'Загрузка адресного классификатора с сайта'");
ПараметрыЗагрузки = АдресныйКлассификаторСлужебный.ПараметрыЗагрузкиКлассификатораАдресов();
ПараметрыЗагрузки.ЗагружатьИсториюАдресов = ЗагружатьИсториюИзмененийАдресныхОбъектов;
ПараметрыЗагрузки.КаталогФайлов = КаталогФайлов;
ПараметрыМетода = Новый Соответствие();
Для Каждого КодРегиона Из КодыРегионов Цикл
ПараметрыВызоваСервера = Новый Массив;
ПараметрыВызоваСервера.Добавить(КодРегиона.Значение);
ПараметрыВызоваСервера.Добавить(ПараметрыЗагрузки.КаталогФайлов);
ПараметрыВызоваСервера.Добавить(ПараметрыЗагрузки);
ПараметрыМетода.Вставить(КодРегиона.Представление, ПараметрыВызоваСервера);
КонецЦикла;
ФоновоеЗадание = ДлительныеОперации.ВыполнитьПроцедуруВНесколькоПотоков("АдресныйКлассификаторСлужебный.ЗагрузитьДанныеКлассификатораАдресовИзФайла",
ПараметрыВыполнения, ПараметрыМетода);
Если ФоновоеЗадание.Статус = "Ошибка" Тогда
ОчиститьКаталогВременногоХранилищаФайлов(КаталогФайлов);
КонецЕсли;
Возврат ФоновоеЗадание;
КонецФункции
&НаСервереБезКонтекста
Функция ДанныеАутентификацииСайтаСохранены()
Если ОбщегоНазначения.ПодсистемаСуществует("ИнтернетПоддержкаПользователей") Тогда
МодульИнтернетПоддержкаПользователей = ОбщегоНазначения.ОбщийМодуль("ИнтернетПоддержкаПользователей");
Возврат МодульИнтернетПоддержкаПользователей.ЗаполненыДанныеАутентификацииПользователяИнтернетПоддержки();
КонецЕсли;
Возврат Ложь;
КонецФункции
&НаСервере
Процедура УстановитьУсловноеОформление()
УсловноеОформление.Элементы.Очистить();
Элемент = УсловноеОформление.Элементы.Добавить();
Поля = Элемент.Поля.Элементы;
Поля.Добавить().Поле = Новый ПолеКомпоновкиДанных("СубъектыРФКодСубъектаРФ");
Поля.Добавить().Поле = Новый ПолеКомпоновкиДанных("СубъектыРФПредставление");
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СубъектыРФ.Загружено");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборЭлемента.ПравоеЗначение = Истина;
Элемент.Оформление.УстановитьЗначениеПараметра("Шрифт", ШрифтыСтиля.ВажнаяНадписьШрифт);
КонецПроцедуры
#КонецОбласти
#КонецОбласти