Обновление классификаторов / Форма / Модуль формы

файл
///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2025, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

#Область ОбработчикиСобытийФормы

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	УстановитьУсловноеОформление();
	
	Если ОбщегоНазначения.РазделениеВключено() Тогда
		Элементы.ГруппаСтраницы.ТекущаяСтраница        = Элементы.ГруппаРезультатыОбновления;
		Элементы.ДекорацияОписаниеРезультата.Заголовок =
			НСтр("ru = 'Использование обработки недоступно при работе в модели сервиса.'");
		Элементы.ДекорацияКартинкаРезультат.Картинка   = БиблиотекаКартинок.Ошибка32;
		Элементы.КнопкаНазад.Видимость                 = Ложь;
		Элементы.КнопкаДалее.Видимость                 = Ложь;
	Иначе
		УстановитьОтображениеЭлементовФормы(ЭтотОбъект);
	КонецЕсли;
	
	ИдентификаторыОтбор = Параметры.ИдентификаторыОтбор;
	
	// Загрузка из файла в веб-клиенте не возможна.
	Если ОбщегоНазначения.ЭтоВебКлиент() Тогда
		ИнформацияОДоступныхОбновленияхИзСервиса();
	КонецЕсли;
	
	СообщенияВТехПоддержкуДоступны = ОбщегоНазначения.ПодсистемаСуществует("ИнтернетПоддержкаПользователей.СообщенияВСлужбуТехническойПоддержки");
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовШапкиФормы

&НаКлиенте
Процедура РежимОбновленияПриИзменении(Элемент)
	
	УстановитьОтображениеЭлементовФормы(ЭтотОбъект);
	
КонецПроцедуры

&НаКлиенте
Процедура ФайлОбновленияНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	
	ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
	ДиалогВыбораФайла.Фильтр = НСтр("ru = 'Архив'") + "(*.zip)|*.zip";
	
	ОписаниеОповещения = Новый ОписаниеОповещения(
		"ФайлОбновленияНачалоВыбораЗавершение",
		ЭтотОбъект);
	
	ФайловаяСистемаКлиент.ПоказатьДиалогВыбора(
		ОписаниеОповещения,
		ДиалогВыбораФайла);
	
КонецПроцедуры

&НаКлиенте
Процедура НадписьПоясненияПодключенияАвторизацияОбработкаНавигационнойСсылки(
		Элемент,
		НавигационнаяСсылкаФорматированнойСтроки,
		СтандартнаяОбработка)
	
	Если НавигационнаяСсылкаФорматированнойСтроки = "action:openPortal" Тогда
		СтандартнаяОбработка = Ложь;
		ИнтернетПоддержкаПользователейКлиент.ОткрытьСтраницуИнтегрированногоСайта(
			ИнтернетПоддержкаПользователейКлиентСервер.URLСтраницыСервисаLogin(
				,
				ИнтернетПоддержкаПользователейКлиент.НастройкиСоединенияССерверами()));
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ЛогинПриИзменении(Элемент)
	
	СохранитьДанныеАутентификации = Истина;
	
КонецПроцедуры

&НаКлиенте
Процедура ПарольПриИзменении(Элемент)
	
	СохранитьДанныеАутентификации = Истина;
	ИнтернетПоддержкаПользователейКлиент.ПриИзмененииСекретныхДанных(Элемент);
	
КонецПроцедуры

&НаКлиенте
Процедура ПарольНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	
	ИнтернетПоддержкаПользователейКлиент.ОтобразитьСекретныеДанные(
		ЭтотОбъект,
		Элемент,
		"Пароль");
	
КонецПроцедуры

&НаКлиенте
Процедура ДекорацияПереходВЖурналеРегистрацииОбработкаНавигационнойСсылки(
		Элемент,
		НавигационнаяСсылкаФорматированнойСтроки,
		СтандартнаяОбработка)
	
	Если НавигационнаяСсылкаФорматированнойСтроки = "action:openLog" Тогда
		СтандартнаяОбработка = Ложь;
		Отбор = Новый Структура;
		Отбор.Вставить("Уровень", "Ошибка");
		Отбор.Вставить("СобытиеЖурналаРегистрации", РаботаСКлассификаторамиКлиент.ИмяСобытияЖурналаРегистрации());
		ЖурналРегистрацииКлиент.ОткрытьЖурналРегистрации(Отбор);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ДекорацияТехническаяПоддержкаОбработкаНавигационнойСсылки(
		Элемент,
		НавигационнаяСсылкаФорматированнойСтроки,
		СтандартнаяОбработка)
	
		Если НавигационнаяСсылкаФорматированнойСтроки = "action:support" Тогда
			
			СтандартнаяОбработка = Ложь;
			Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("ИнтернетПоддержкаПользователей.СообщенияВСлужбуТехническойПоддержки") Тогда
				МодульСообщенияВСлужбуТехническойПоддержкиКлиентСервер =
					ОбщегоНазначенияКлиент.ОбщийМодуль("СообщенияВСлужбуТехническойПоддержкиКлиентСервер");
				ДанныеСообщения = МодульСообщенияВСлужбуТехническойПоддержкиКлиентСервер.ДанныеСообщения();
				ДанныеСообщения.Получатель = "webIts";
				ДанныеСообщения.Тема = НСтр("ru = 'Интернет-поддержка. Обновление классификаторов'");
				ДанныеСообщения.Сообщение = СообщениеОбОшибке;
				
				Если ИнформацияОбОшибке <> "" Тогда
					МодульСообщенияВСлужбуТехническойПоддержкиКлиентСервер.ЗаполнитьНастройкиПоискаГотовогоОтвета(
						ИнформацияОбОшибке,
						ДанныеСообщения.НастройкиПоискаГотовогоОтвета);
				КонецЕсли;
				
				МодульСообщенияВСлужбуТехническойПоддержкиКлиент =
					ОбщегоНазначенияКлиент.ОбщийМодуль("СообщенияВСлужбуТехническойПоддержкиКлиент");
				МодульСообщенияВСлужбуТехническойПоддержкиКлиент.ОтправитьСообщение(
					ДанныеСообщения);
			КонецЕсли;
	КонецЕсли;

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

#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормыДанныеКлассификаторов

&НаКлиенте
Процедура ДанныеКлассификаторовПередНачаломДобавления(
		Элемент,
		Отказ,
		Копирование,
		Родитель,
		Группа,
		Параметр)
	
	Отказ = Истина;
	
КонецПроцедуры

&НаКлиенте
Процедура ДанныеКлассификаторовПередУдалением(Элемент, Отказ)
	
	Отказ = Истина;
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиКомандФормы

&НаКлиенте
Процедура Далее(Команда)
	
	ОчиститьСообщения();
	ИнформацияОбОшибке = "";
	СообщениеОбОшибке = "";
	
	Если Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.ГруппаПодключениеКПорталу Тогда
		
		Результат = ИнтернетПоддержкаПользователейКлиентСервер.ПроверитьДанныеАутентификации(
			Новый Структура("Логин, Пароль",
			Логин, Пароль));
		
		Если Результат.Отказ Тогда
			ОбщегоНазначенияКлиент.СообщитьПользователю(
				Результат.СообщениеОбОшибке,
				,
				Результат.Поле);
		КонецЕсли;
		
		Если Результат.Отказ Тогда
			Возврат;
		КонецЕсли;
		
		ПроверитьПодключениеКПорталу1СИТС();
		
	ИначеЕсли Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.ГруппаВыборРежимаОбновления Тогда
		Если РежимОбновления = РежимОбновленияЧерезИнтернет() Тогда
			ИнформацияОДоступныхОбновленияхИзСервиса();
		Иначе
			ИнформацияОДоступныхОбновленияхИзФайла();
		КонецЕсли;
	ИначеЕсли Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.ГруппаВыборКлассификаторов
		Или Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.ГруппаИнформацияОКлассификаторе Тогда
		Если РежимОбновления = РежимОбновленияЧерезИнтернет() Тогда
			НачатьОбновлениеКлассификаторовСервис();
		Иначе
			НачатьОбновлениеКлассификаторовИзФайла();
		КонецЕсли;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура Назад(Команда)
	
	Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.ГруппаВыборРежимаОбновления;
	УстановитьОтображениеЭлементовФормы(ЭтотОбъект);
	Логин = "";
	Пароль = "";
	ИнформацияОбОшибке = "";
	СообщениеОбОшибке = "";
	
КонецПроцедуры

&НаКлиенте
Процедура УстановитьФлажки(Команда)
	
	УстановитьОтметку(Истина);
	
КонецПроцедуры

&НаКлиенте
Процедура СнятьФлажки(Команда)
	
	УстановитьОтметку(Ложь);
	
КонецПроцедуры

&НаКлиенте
Процедура ЗакрытьФорму(Команда)
	
	Закрыть(ИдентификаторыОбновленных.ВыгрузитьЗначения());
	
КонецПроцедуры

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

&НаКлиенте
Процедура ФайлОбновленияНачалоВыбораЗавершение(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
	
	Если ВыбранныеФайлы <> Неопределено И ВыбранныеФайлы.Количество() <> 0 Тогда
		ФайлОбновления = ВыбранныеФайлы[0];
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Процедура ПроверитьПодключениеКПорталу1СИТС()
	
	ПараметрыПолучения = ПодготовитьПараметрыПолученияИнформацииОбОбновлениях();
	
	Если ПараметрыПолучения.Идентификаторы.Количество() = 0 Тогда
		УстановитьОтображениеИнформацииОбОшибке(
			ЭтотОбъект,
			НСтр("ru = 'Отсутствуют классификаторы доступные для обновления.'"),
			Ложь,
			Ложь);
		УстановитьОтображениеЭлементовФормы(ЭтотОбъект);
		Возврат;
	КонецЕсли;
	
	// Получение информации из сервиса классификаторов.
	РезультатОперации = РаботаСКлассификаторами.СлужебнаяДоступныеОбновленияКлассификаторов(
		ПараметрыПолучения.Идентификаторы,
		Новый Структура("Логин, Пароль",
			Логин, Пароль));
	
	Если РезультатОперации.КодОшибки = "НеверныйЛогинИлиПароль" Тогда
		ОбщегоНазначения.СообщитьПользователю(
			РезультатОперации.СообщениеОбОшибке,
			,
			"Логин");
		Возврат;
	КонецЕсли;
	
	ЗаполнитьИнформациюОДоступныхОбновлениях(
		РезультатОперации,
		ПараметрыПолучения.ВерсииКлассификаторов);
	
КонецПроцедуры

&НаСервере
Процедура ИнформацияОДоступныхОбновленияхИзСервиса()
	
	Если Не ИнтернетПоддержкаПользователей.ЗаполненыДанныеАутентификацииПользователяИнтернетПоддержки() Тогда
		Если ИнтернетПоддержкаПользователей.ДоступноПодключениеИнтернетПоддержки() Тогда
			СохранитьДанныеАутентификации = Истина;
			Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.ГруппаПодключениеКПорталу;
			УстановитьОтображениеЭлементовФормы(ЭтотОбъект);
		Иначе
			УстановитьОтображениеИнформацииОбОшибке(
				ЭтотОбъект,
				НСтр("ru = 'Интернет-поддержка пользователей не подключена, обратитесь к администратору.'"),
				Ложь,
				Ложь);
		КонецЕсли;
		Возврат;
	КонецЕсли;
	
	ПараметрыПолучения = ПодготовитьПараметрыПолученияИнформацииОбОбновлениях();
	
	Если ПараметрыПолучения.Идентификаторы.Количество() = 0 Тогда
		УстановитьОтображениеИнформацииОбОшибке(
			ЭтотОбъект,
			НСтр("ru = 'Отсутствуют классификаторы доступные для обновления.'"),
			Ложь,
			Ложь);
		УстановитьОтображениеЭлементовФормы(ЭтотОбъект);
		Возврат;
	КонецЕсли;
	
	// Получение информации из сервиса классификаторов.
	РезультатОперации = РаботаСКлассификаторами.СлужебнаяДоступныеОбновленияКлассификаторов(
		ПараметрыПолучения.Идентификаторы,
		Неопределено);
	ЗаполнитьИнформациюОДоступныхОбновлениях(
		РезультатОперации,
		ПараметрыПолучения.ВерсииКлассификаторов);
	
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьИнформациюОДоступныхОбновлениях(РезультатОперации, ВерсииКлассификаторов)
	
	ИнформацияОбОшибке = РезультатОперации.ИнформацияОбОшибке;
	
	// Обработка ошибок операции.
	Если ЗначениеЗаполнено(РезультатОперации.КодОшибки) Тогда
		Если РезультатОперации.КодОшибки = "НеверныйЛогинИлиПароль" Тогда
			Если ИнтернетПоддержкаПользователей.ДоступноПодключениеИнтернетПоддержки() Тогда
				СохранитьДанныеАутентификации = Истина;
				Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.ГруппаПодключениеКПорталу;
				УстановитьОтображениеЭлементовФормы(ЭтотОбъект);
			Иначе
				УстановитьОтображениеИнформацииОбОшибке(
					ЭтотОбъект,
					НСтр("ru = 'Введен не верный логин или пароль Интернет-поддержки пользователей, обратитесь к администратору.'"),
					Ложь,
					Ложь);
			КонецЕсли;
		Иначе
			// Если авторизация прошла успешно, необходимо очистить реквизиты формы.
			Если СохранитьДанныеАутентификации Тогда
				Логин = "";
				Пароль = "";
				СохранитьДанныеАутентификации = Ложь;
			КонецЕсли;
			УстановитьОтображениеИнформацииОбОшибке(
				ЭтотОбъект,
				РезультатОперации.СообщениеОбОшибке);
			УстановитьОтображениеЭлементовФормы(ЭтотОбъект);
		КонецЕсли;
		Возврат;
	КонецЕсли;
	
	// Если авторизация прошла успешно, необходимо очистить реквизиты формы.
	Если СохранитьДанныеАутентификации Тогда
		
		// Запись данных.
		УстановитьПривилегированныйРежим(Истина);
		ИнтернетПоддержкаПользователей.СлужебнаяСохранитьДанныеАутентификации(
			Новый Структура(
				"Логин, Пароль",
				Логин,
				Пароль));
		УстановитьПривилегированныйРежим(Ложь);
		
		Логин = "";
		Пароль = "";
		СохранитьДанныеАутентификации = Ложь;
		
	КонецЕсли;
	
	// Заполнение таблицы с обновлениями.
	Для Каждого ОписаниеКлассификатора Из ВерсииКлассификаторов Цикл
		
		Для Каждого ОписаниеВерсии Из РезультатОперации.ДоступныеВерсии Цикл
			Если ОписаниеВерсии.Идентификатор = ОписаниеКлассификатора.Идентификатор Тогда
				
				СтрокаКлассификатора = ДанныеКлассификаторов.Добавить();
				ЗаполнитьЗначенияСвойств(
					СтрокаКлассификатора,
					ОписаниеКлассификатора,
					"Идентификатор, Наименование");
				
				СтрокаКлассификатора.КонтрольнаяСумма   = ОписаниеВерсии.ИдентификаторФайла.КонтрольнаяСумма;
				СтрокаКлассификатора.ИдентификаторФайла = ОписаниеВерсии.ИдентификаторФайла.ИдентификаторФайла;
				СтрокаКлассификатора.Версия             = ОписаниеВерсии.Версия;
				СтрокаКлассификатора.ОписаниеВерсии     = ОписаниеВерсии.ОписаниеВерсии;
				СтрокаКлассификатора.Размер             = ОписаниеВерсии.Размер;
				
				Если ОписаниеКлассификатора.Версия >= ОписаниеВерсии.Версия
					И РезультатОперации.ДоступныеВерсии.Количество() > 1 Тогда
					СтрокаКлассификатора.Наименование = ОбновлениеНеТребуется(
						ОписаниеКлассификатора.Наименование);
				КонецЕсли;
				
				Если ОписаниеКлассификатора.Версия >= ОписаниеВерсии.Версия Тогда
					СтрокаКлассификатора.Версия = ОписаниеКлассификатора.Версия;
				Иначе
					СтрокаКлассификатора.ТребуетсяОбновление = Истина;
					СтрокаКлассификатора.Отметка             = Истина;
				КонецЕсли;
				
				Прервать;
				
			КонецЕсли;
		КонецЦикла;
		
	КонецЦикла;
	
	Если ДанныеКлассификаторов.Количество() = 1 Тогда
		Если ДанныеКлассификаторов[0].ТребуетсяОбновление Тогда
			
			Элементы.ДекорацияИнформацияОКлассификаторе.Заголовок = СтроковыеФункции.ФорматированнаяСтрока(
				НСтр("ru = 'Доступна новая версия <b>%1</b> классификатора <b>%2</b>.
					|Нажмите <b>Далее></b> для загрузки новой версии классификатора.'"),
				ДанныеКлассификаторов[0].Версия,
				ДанныеКлассификаторов[0].Наименование);
		Иначе
			Элементы.ДекорацияИнформацияОКлассификаторе.Заголовок = СтроковыеФункции.ФорматированнаяСтрока(
				НСтр("ru = 'Обновление классификатора <b>%1</b> не требуется.
					|Нажмите <b>Далее></b> для загрузки текущей версии классификатора.'"),
				ДанныеКлассификаторов[0].Наименование);
		КонецЕсли;
		Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.ГруппаИнформацияОКлассификаторе;
		УстановитьОтображениеЭлементовФормы(ЭтотОбъект);
	ИначеЕсли ДанныеКлассификаторов.Количество() > 1 Тогда
		ДанныеКлассификаторов.Сортировать("Отметка Убыв, Наименование");
		Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.ГруппаВыборКлассификаторов;
		УстановитьОтображениеЭлементовФормы(ЭтотОбъект);
	Иначе
		УстановитьОтображениеИнформацииОбОшибке(
			ЭтотОбъект,
			НСтр("ru = 'Не найдены доступные обновления классификаторов.'"),
			Ложь,
			Ложь);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ИнформацияОДоступныхОбновленияхИзФайла()
	
	ДанныеКлассификаторов.Очистить();
	
	Если Не ЗначениеЗаполнено(ФайлОбновления) Тогда
		ОбщегоНазначенияКлиент.СообщитьПользователю(
			НСтр("ru = 'Не выбран файл обновления.'"),
			,
			"ФайлОбновления");
		Возврат;
	КонецЕсли;
	
	КомпонентыПути = ОбщегоНазначенияКлиентСервер.РазложитьПолноеИмяФайла(ФайлОбновления);
	Если КомпонентыПути.Расширение <> ".zip" Тогда
		ОбщегоНазначенияКлиент.СообщитьПользователю(
			НСтр("ru = 'Неверный формат файла.'"),
			,
			"ФайлОбновления");
		Возврат;
	КонецЕсли;
	
	ВерсииКлассификаторов = РаботаСКлассификаторамиКлиент.ВерсииКлассификаторовВФайле(
		ФайлОбновления);
	ИнформацияОДоступныхОбновленияхИзФайлаНаСервере(ВерсииКлассификаторов);
	
	Если ДанныеКлассификаторов.Количество() <> 0 Тогда
		ДанныеКлассификаторов.Сортировать("Отметка Убыв, Наименование");
		Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.ГруппаВыборКлассификаторов;
		УстановитьОтображениеЭлементовФормы(ЭтотОбъект);
	Иначе
		УстановитьОтображениеИнформацииОбОшибке(
			ЭтотОбъект,
			НСтр("ru = 'Не найдены доступные обновления классификаторов.'"),
			Ложь,
			Ложь);
	КонецЕсли;
	УстановитьОтображениеЭлементовФормы(ЭтотОбъект);
	
КонецПроцедуры

&НаСервере
Процедура ИнформацияОДоступныхОбновленияхИзФайлаНаСервере(Знач ВерсииКлассификаторов)
	
	// Начальное заполнение номера версии,
	// для новых классификаторов.
	Идентификаторы = ИдентификаторыОтбор.ВыгрузитьЗначения();
	ВерсииКлассификаторовИБ = РаботаСКлассификаторами.ДанныеКлассификаторовДляИнтерактивногоОбновления(
		?(Идентификаторы.Количество() = 0,
			Неопределено,
			Идентификаторы));
	
	Для каждого ОписаниеКлассификатора Из ВерсииКлассификаторов Цикл
		Если ОписаниеКлассификатора.Версия = 0 Тогда
			ОписаниеКлассификатора.Версия = РаботаСКлассификаторами.ОбработатьНачальнуюВерсиюКлассификатора(
				ОписаниеКлассификатора.Идентификатор);
		КонецЕсли;
	КонецЦикла;
	
	Для Каждого ВерсияКлассификатора Из ВерсииКлассификаторов Цикл
		
		ТребуетсяОбновление       = Истина;
		КлассификаторИспользуется = Ложь;
		Для Каждого ВерсияКлассификатораИБ Из ВерсииКлассификаторовИБ Цикл
			Если ВерсияКлассификатораИБ.Идентификатор = ВерсияКлассификатора.Идентификатор Тогда
				КлассификаторИспользуется = Истина;
				Если ВерсияКлассификатораИБ.Версия >= ВерсияКлассификатора.Версия Тогда
					ТребуетсяОбновление = Ложь;
				КонецЕсли;
				Прервать;
			КонецЕсли;
		КонецЦикла;
		
		Если КлассификаторИспользуется Тогда
			СтрокаЗагрузки = ДанныеКлассификаторов.Добавить();
			СтрокаЗагрузки.Отметка             = ТребуетсяОбновление;
			Если ТребуетсяОбновление Тогда
				СтрокаЗагрузки.Наименование = ВерсияКлассификатораИБ.Наименование;
			Иначе
				СтрокаЗагрузки.Наименование = ОбновлениеНеТребуется(ВерсияКлассификатораИБ.Наименование);
			КонецЕсли;
			СтрокаЗагрузки.Версия              = ВерсияКлассификатора.Версия;
			СтрокаЗагрузки.ТребуетсяОбновление = ТребуетсяОбновление;
			СтрокаЗагрузки.Идентификатор       = ВерсияКлассификатора.Идентификатор;
			СтрокаЗагрузки.ИдентификаторФайла  = ВерсияКлассификатора.Имя;
		КонецЕсли;
		
	КонецЦикла;
	
КонецПроцедуры

&НаКлиенте
Процедура НачатьОбновлениеКлассификаторовИзФайлаПослеЗагрузки(ПомещенныеФайлы, ДополнительныеПараметры) Экспорт
	
	Если ПомещенныеФайлы = Неопределено Или ПомещенныеФайлы.Количество() = 0 Тогда
		ОбщегоНазначенияКлиент.СообщитьПользователю(
			НСтр("ru = 'Файл с обновлениями не загружен.'"));
		Возврат;
	КонецЕсли;
	
	ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);
	ПараметрыОжидания.ВыводитьОкноОжидания           = Ложь;
	
	РезультатВыполнения = ИнтерактивноеОбновлениеКлассификаторовИзФайла(
		ПомещенныеФайлы[0].Хранение);
	
	ОповещениеОЗавершении = Новый ОписаниеОповещения(
		"НачатьОбновлениеКлассификаторовЗавершение",
		ЭтотОбъект);
		
	Если РезультатВыполнения.Статус = "Выполнено" Или РезультатВыполнения.Статус = "Ошибка" Тогда
		НачатьОбновлениеКлассификаторовЗавершение(РезультатВыполнения, Неопределено);
		Возврат;
	КонецЕсли;
	
	// Настройка страницы длительной операции.
	Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.ГруппаДлительнаяОперация;
	Элементы.ИндикаторОбновления.Видимость  = Ложь;
	Элементы.ДекорацияСостояние.Заголовок   = НСтр("ru = 'Обработка файлов классификатора на сервере.'");
	УстановитьОтображениеЭлементовФормы(ЭтотОбъект);
	
	ДлительныеОперацииКлиент.ОжидатьЗавершение(
		РезультатВыполнения,
		ОповещениеОЗавершении,
		ПараметрыОжидания);
	
КонецПроцедуры

&НаСервере
Функция ИнтерактивноеОбновлениеКлассификаторовИзФайла(Знач АдресФайла)
	
	Отбор = Новый Структура;
	Отбор.Вставить("Отметка", Истина);
	
	ПараметрыПроцедуры = Новый Структура;
	ПараметрыПроцедуры.Вставить("ДанныеФайла", ПолучитьИзВременногоХранилища(АдресФайла));
	ПараметрыПроцедуры.Вставить("ДанныеКлассификаторов", ДанныеКлассификаторов.Выгрузить(Отбор));
	УдалитьИзВременногоХранилища(АдресФайла);
	
	ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
	ПараметрыВыполнения.НаименованиеФоновогоЗадания = НСтр("ru = 'Обработка файлов классификатора на сервере.'");
	
	РезультатВыполнения = ДлительныеОперации.ВыполнитьВФоне(
		"РаботаСКлассификаторами.ИнтерактивноеОбновлениеКлассификаторовИзФайла",
		ПараметрыПроцедуры,
		ПараметрыВыполнения);
	
	Возврат РезультатВыполнения;
	
КонецФункции

&НаКлиенте
Процедура НачатьОбновлениеКлассификаторовСервис()
	
	ИндикаторОбновления = 0;
	ОповещениеОПрогрессеВыполнения = Новый ОписаниеОповещения(
		"ОбновитьИндикаторЗагрузки",
		ЭтотОбъект);
	
	ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);
	ПараметрыОжидания.ВыводитьОкноОжидания           = Ложь;
	ПараметрыОжидания.ОповещениеОПрогрессеВыполнения = ОповещениеОПрогрессеВыполнения;
	
	РезультатВыполнения = ИнтерактивноеОбновлениеКлассификаторовИзСервиса();
	
	ОповещениеОЗавершении = Новый ОписаниеОповещения(
		"НачатьОбновлениеКлассификаторовЗавершение",
		ЭтотОбъект);
		
	Если РезультатВыполнения.Статус = "Выполнено" Или РезультатВыполнения.Статус = "Ошибка" Тогда
		НачатьОбновлениеКлассификаторовЗавершение(РезультатВыполнения, Неопределено);
		Возврат;
	КонецЕсли;
	
	// Настройка страницы длительной операции.
	Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.ГруппаДлительнаяОперация;
	Элементы.ИндикаторОбновления.Видимость = Истина;
	Элементы.ДекорацияСостояние.Заголовок  = НСтр("ru = 'Выполняется обновление классификаторов. Обновление может занять от
		|нескольких минут до нескольких часов в зависимости от размера обновления.'");
	
	УстановитьОтображениеЭлементовФормы(ЭтотОбъект);
	
	ДлительныеОперацииКлиент.ОжидатьЗавершение(
		РезультатВыполнения,
		ОповещениеОЗавершении,
		ПараметрыОжидания);
	
КонецПроцедуры

&НаСервере
Функция ИнтерактивноеОбновлениеКлассификаторовИзСервиса()
	
	ДанныеКлассификаторовПодготовка = ДанныеКлассификаторов.Выгрузить();
	ДанныеКлассификаторовПодготовка.Колонки.Добавить("ДанныеФайла");
	СтрокиУдалить = Новый Массив;
	
	// В режиме загрузки одного классификатора не поддерживается
	// установка отметок.
	Если ДанныеКлассификаторовПодготовка.Количество() > 1 Тогда
		Для Каждого ОписаниеКлассификатора Из ДанныеКлассификаторовПодготовка Цикл
			Если Не ОписаниеКлассификатора.Отметка Тогда
				СтрокиУдалить.Добавить(ОписаниеКлассификатора);
			КонецЕсли;
		КонецЦикла;
	КонецЕсли;
	
	Для каждого ОписаниеКлассификатора Из СтрокиУдалить Цикл
		ДанныеКлассификаторовПодготовка.Удалить(ОписаниеКлассификатора);
	КонецЦикла;
	
	ПараметрыПроцедуры = Новый Структура;
	ПараметрыПроцедуры.Вставить("ДанныеКлассификаторов", ДанныеКлассификаторовПодготовка);
	ПараметрыПроцедуры.Вставить("РежимОбновления",       РежимОбновления);
	
	ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
	ПараметрыВыполнения.НаименованиеФоновогоЗадания = НСтр("ru = 'Обновление данных классификаторов.'");
	
	РезультатВыполнения = ДлительныеОперации.ВыполнитьВФоне(
		"РаботаСКлассификаторами.ИнтерактивноеОбновлениеКлассификаторовИзСервиса",
		ПараметрыПроцедуры,
		ПараметрыВыполнения);
	
	Возврат РезультатВыполнения;
	
КонецФункции

&НаКлиенте
Процедура НачатьОбновлениеКлассификаторовИзФайла()
	
	ОписаниеОповещения = Новый ОписаниеОповещения(
		"НачатьОбновлениеКлассификаторовИзФайлаПослеЗагрузки",
		ЭтотОбъект);
	
	ОписаниеПередаваемогоФайла = Новый ОписаниеПередаваемогоФайла(ФайлОбновления);
	
	ФайлыОбновлений = Новый Массив;
	ФайлыОбновлений.Добавить(ОписаниеПередаваемогоФайла);
	
	ПараметрыЗагрузки = ФайловаяСистемаКлиент.ПараметрыЗагрузкиФайла();
	ПараметрыЗагрузки.Интерактивно = Ложь;
	
	ФайловаяСистемаКлиент.ЗагрузитьФайлы(
		ОписаниеОповещения,
		ПараметрыЗагрузки,
		ФайлыОбновлений);
	
КонецПроцедуры

&НаКлиенте
Процедура ОбновитьИндикаторЗагрузки(СтатусВыполнения, ДополнительныеПараметры) Экспорт
	
	Если СтатусВыполнения = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Если СтатусВыполнения.Статус <> "Выполняется" Тогда
		Возврат;
	КонецЕсли;
	
	Если СтатусВыполнения.Прогресс <> Неопределено Тогда
		ИндикаторОбновления = СтатусВыполнения.Прогресс.Процент;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура НачатьОбновлениеКлассификаторовЗавершение(Результат, ДополнительныеПараметры) Экспорт
	
	Если Результат = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Если Результат.Статус = "Выполнено" Тогда
		
		РезультатОперации = ПолучитьИзВременногоХранилища(Результат.АдресРезультата);
		Если ЗначениеЗаполнено(РезультатОперации.КодОшибки) Тогда
			ИнформацияОбОшибке = РезультатОперации.ИнформацияОбОшибке;
			УстановитьОтображениеИнформацииОбОшибке(
				ЭтотОбъект,
				РезультатОперации.СообщениеОбОшибке,
				Ложь,
				Ложь);
		Иначе
			УстановитьОтображениеУспешногоЗавершения(ЭтотОбъект);
		КонецЕсли;
		
		// Обновление открытых форм классификаторов.
		Для Каждого СтрокаТаблицы Из ДанныеКлассификаторов Цикл
			Если СтрокаТаблицы.Отметка Тогда
				ИдентификаторыОбновленных.Добавить(СтрокаТаблицы.Идентификатор);
			КонецЕсли;
		КонецЦикла;
		
		Оповестить(
			РаботаСКлассификаторамиКлиент.ИмяСобытияОповещенияОЗагрузки(),
			ИдентификаторыОбновленных.ВыгрузитьЗначения(),
			ЭтотОбъект);
		
	ИначеЕсли Результат.Статус = "Ошибка" Тогда
		ДанныеОшибки = ОбщегоНазначенияКлиентСервер.УточнениеИсключения(
			Результат.ИнформацияОбОшибке,
			НСтр("ru = 'Ошибка загрузки классификаторов.'"));
		ИнформацияОбОшибке = ДанныеОшибки.Текст;
		УстановитьОтображениеИнформацииОбОшибке(
			ЭтотОбъект,
			ИнформацияОбОшибке);
	КонецЕсли;
	
	УстановитьОтображениеЭлементовФормы(ЭтотОбъект);
	
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Процедура УстановитьОтображениеЭлементовФормы(Форма)
	
	Элементы = Форма.Элементы;
	Если Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.ГруппаВыборРежимаОбновления Тогда
		Элементы.КнопкаНазад.Видимость = Ложь;
		Элементы.КнопкаДалее.Видимость = Истина;
	ИначеЕсли Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.ГруппаПодключениеКПорталу
		Или Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.ГруппаВыборКлассификаторов
		Или Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.ГруппаИнформацияОКлассификаторе Тогда
		Элементы.КнопкаНазад.Видимость = Истина;
		Элементы.КнопкаДалее.Видимость = Истина;
	ИначеЕсли Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.ГруппаДлительнаяОперация Тогда
		Элементы.КнопкаНазад.Видимость = Ложь;
		Элементы.КнопкаДалее.Видимость = Ложь;
	ИначеЕсли Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.ГруппаРезультатыОбновления Тогда
		Элементы.КнопкаНазад.Видимость = Истина;
		Элементы.КнопкаДалее.Видимость = Ложь;
	КонецЕсли;
	
	Если Форма.РежимОбновления = 0 Тогда
		Элементы.ФайлОбновления.Доступность = Ложь;
	Иначе
		Элементы.ФайлОбновления.Доступность = Истина;
	КонецЕсли;

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

&НаКлиентеНаСервереБезКонтекста
Процедура УстановитьОтображениеИнформацииОбОшибке(
		Форма,
		ИнформацияОбОшибке,
		Ошибка = Истина,
		ОтображатьЖР = Истина)
	
	Форма.СообщениеОбОшибке = ИнформацияОбОшибке;
	Форма.Элементы.ДекорацияПереходВЖурналеРегистрации.Видимость = ОтображатьЖР;
	Форма.Элементы.ДекорацияТехническаяПоддержка.Видимость = Форма.СообщенияВТехПоддержкуДоступны;
	Форма.Элементы.ГруппаСтраницы.ТекущаяСтраница = Форма.Элементы.ГруппаРезультатыОбновления;
	Форма.Элементы.ДекорацияОписаниеРезультата.Заголовок = ИнформацияОбОшибке;
	Форма.Элементы.ДекорацияКартинкаРезультат.Картинка = ?(
		Ошибка,
		БиблиотекаКартинок.Ошибка32,
		БиблиотекаКартинок.Предупреждение32);
	
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Процедура УстановитьОтображениеУспешногоЗавершения(Форма)
	
	Форма.Элементы.ГруппаСтраницы.ТекущаяСтраница = Форма.Элементы.ГруппаРезультатыОбновления;
	Форма.Элементы.ДекорацияКартинкаРезультат.Картинка = БиблиотекаКартинок.Успешно32;
	Форма.Элементы.ДекорацияОписаниеРезультата.Заголовок = НСтр("ru = 'Обновление классификаторов успешно завершено.'");
	Форма.Элементы.ДекорацияТехническаяПоддержка.Видимость = Ложь;
	Форма.Элементы.ДекорацияПереходВЖурналеРегистрации.Видимость = Ложь;
	
КонецПроцедуры

&НаСервере
Процедура УстановитьУсловноеОформление()
	
	УсловноеОформление.Элементы.Очистить();
	
	Элемент = УсловноеОформление.Элементы.Добавить();
	
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ДанныеКлассификаторовВерсия.Имя);
	
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ДанныеКлассификаторовНаименование.Имя);
	
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ДанныеКлассификаторовОтметка.Имя);
	
	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ДанныеКлассификаторов.ТребуетсяОбновление");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Ложь;
	
	Элемент.Оформление.УстановитьЗначениеПараметра(
		"ЦветТекста",
		Метаданные.ЭлементыСтиля.ЦветНеАктивнойСтроки.Значение);
	
КонецПроцедуры

&НаКлиенте
Процедура УстановитьОтметку(Значение)
	
	Для Каждого СтрокаКлассификатора Из ДанныеКлассификаторов Цикл
		СтрокаКлассификатора.Отметка = Значение;
	КонецЦикла;
	
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Функция РежимОбновленияЧерезИнтернет()
	
	Возврат 0;
	
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Функция ОбновлениеНеТребуется(Наименование)
	
	Возврат СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
		НСтр("ru = '%1 (обновление не требуется)'"),
		Наименование);
	
КонецФункции

&НаСервере
Функция ПодготовитьПараметрыПолученияИнформацииОбОбновлениях()
	
	ДанныеКлассификаторов.Очистить();
	
	Идентификаторы = ИдентификаторыОтбор.ВыгрузитьЗначения();
	ВерсииКлассификаторов = РаботаСКлассификаторами.ДанныеКлассификаторовДляИнтерактивногоОбновления(
		?(Идентификаторы.Количество() = 0,
			Неопределено,
			Идентификаторы));
	
	Идентификаторы = Новый Массив;
	
	Для Каждого ОписаниеКлассификатора Из ВерсииКлассификаторов Цикл
		Идентификаторы.Добавить(ОписаниеКлассификатора.Идентификатор);
	КонецЦикла;
	
	ПараметрыПолучения = Новый Структура;
	ПараметрыПолучения.Вставить("ВерсииКлассификаторов", ВерсииКлассификаторов);
	ПараметрыПолучения.Вставить("Идентификаторы",        Идентификаторы);
	
	Возврат ПараметрыПолучения;
	
КонецФункции

#КонецОбласти

Связанные материалы