#Область ОписаниеПеременных
&НаКлиенте
Перем ВыполняетсяРезервноеКопирование;
#КонецОбласти
#Область ОбработчикиСобытийФормы
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Не ОбщегоНазначения.ЭтоWindowsКлиент() Тогда
ВызватьИсключение НСтр("ru = 'Резервное копирование и восстановление данных необходимо настроить средствами операционной системы или другими сторонними средствами.'");
КонецЕсли;
Если ОбщегоНазначения.ЭтоВебКлиент() Тогда
ВызватьИсключение НСтр("ru = 'Резервное копирование недоступно в веб-клиенте.'");
КонецЕсли;
Если НЕ ОбщегоНазначения.ИнформационнаяБазаФайловая() Тогда
ВызватьИсключение НСтр("ru = 'В клиент-серверном варианте работы резервное копирование следует выполнять сторонними средствами (средствами СУБД).'");
КонецЕсли;
НастройкиРезервногоКопирования = РезервноеКопированиеИБСервер.НастройкиРезервногоКопирования();
ПарольАдминистратораИБ = НастройкиРезервногоКопирования.ПарольАдминистратораИБ;
Если Параметры.РежимРаботы = "ВыполнитьСейчас" Тогда
Элементы.СтраницыПомощника.ТекущаяСтраница = Элементы.СтраницаИнформацииИВыполненияРезервногоКопирования;
Если Не ПустаяСтрока(Параметры.Пояснение) Тогда
Элементы.ГруппаОжидание.ТекущаяСтраница = Элементы.СтраницаОжиданияВремениЗапуска;
Элементы.НадписьВремяОжиданияРезервногоКопирования.Заголовок = Параметры.Пояснение;
КонецЕсли;
ИначеЕсли Параметры.РежимРаботы = "ВыполнитьПриЗавершенииРаботы" Тогда
Элементы.СтраницыПомощника.ТекущаяСтраница = Элементы.СтраницаИнформацииИВыполненияРезервногоКопирования;
ИначеЕсли Параметры.РежимРаботы = "УспешноВыполнено" Тогда
Элементы.СтраницыПомощника.ТекущаяСтраница = Элементы.СтраницаУспешногоВыполненияКопирования;
ИмяФайлаРезервнойКопии = Параметры.ИмяФайлаРезервнойКопии;
ИначеЕсли Параметры.РежимРаботы = "НеВыполнено" Тогда
Элементы.СтраницыПомощника.ТекущаяСтраница = Элементы.СтраницаОшибокПриКопировании;
КонецЕсли;
АвтоматическоеВыполнение = (Параметры.РежимРаботы = "ВыполнитьСейчас" Или Параметры.РежимРаботы = "ВыполнитьПриЗавершенииРаботы");
Объект.КаталогСРезервнымиКопиями = ?(АвтоматическоеВыполнение,
?(Не ПустаяСтрока(НастройкиРезервногоКопирования.КаталогХраненияРезервныхКопий),
НастройкиРезервногоКопирования.КаталогХраненияРезервныхКопий,
НастройкиРезервногоКопирования.КаталогХраненияРезервныхКопийПриРучномЗапуске),
?(Не ПустаяСтрока(НастройкиРезервногоКопирования.КаталогХраненияРезервныхКопийПриРучномЗапуске),
НастройкиРезервногоКопирования.КаталогХраненияРезервныхКопийПриРучномЗапуске,
НастройкиРезервногоКопирования.КаталогХраненияРезервныхКопий));
Если НастройкиРезервногоКопирования.ДатаПоследнегоРезервногоКопирования = Дата(1, 1, 1) Тогда
ТекстЗаголовка = НСтр("ru = 'Резервное копирование еще ни разу не проводилось'");
Иначе
ТекстЗаголовка = НСтр("ru = 'В последний раз резервное копирование проводилось: %1'");
ДатаПоследнегоКопирования = Формат(НастройкиРезервногоКопирования.ДатаПоследнегоРезервногоКопирования, "ДЛФ=ДДВ");
ТекстЗаголовка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстЗаголовка, ДатаПоследнегоКопирования);
КонецЕсли;
Элементы.НадписьДатаПроведенияПоследнегоРезервногоКопирования.Заголовок = ТекстЗаголовка;
Элементы.ГруппаАвтоматическоеРезервноеКопирование.Видимость = Не НастройкиРезервногоКопирования.ВыполнятьАвтоматическоеРезервноеКопирование;
Элементы.НеДожидатьсяЗавершенияСеансов.Видимость = ОбщегоНазначения.РежимОтладки();
ИнформацияОПользователе = РезервноеКопированиеИБСервер.ИнформацияОПользователе();
ТребуетсяВводПароля = ИнформацияОПользователе.ТребуетсяВводПароля;
Если ТребуетсяВводПароля Тогда
АдминистраторИБ = ИнформацияОПользователе.Имя;
Иначе
Элементы.ГруппаАвторизации.Видимость = Ложь;
ПарольАдминистратораИБ = "";
КонецЕсли;
РучнойЗапуск = (Элементы.СтраницыПомощника.ТекущаяСтраница = Элементы.СтраницаВыполненияРезервногоКопирования);
Если РучнойЗапуск Тогда
Если КоличествоСеансовИнформационнойБазы() > 1 Тогда
Элементы.СтраницыСтатусаКопирования.ТекущаяСтраница = Элементы.СтраницаАктивныеПользователи;
КонецЕсли;
Элементы.Далее.Заголовок = НСтр("ru = 'Сохранить резервную копию'");
КонецЕсли;
РезервноеКопированиеИБСервер.УстановитьЗначениеНастройки("РучнойЗапускПоследнегоРезервногоКопирования", РучнойЗапуск);
КонецПроцедуры
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ПерейтиНаСтраницу(Элементы.СтраницыПомощника.ТекущаяСтраница);
#Если ВебКлиент Тогда
Элементы.НадписьОбновитьВерсиюКомпоненты.Видимость = Ложь;
#КонецЕсли
КонецПроцедуры
&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
ТекущаяСтраница = Элементы.СтраницыПомощника.ТекущаяСтраница;
Если ТекущаяСтраница <> Элементы.СтраницаИнформацииИВыполненияРезервногоКопирования Тогда
Возврат;
КонецЕсли;
ТекстПредупреждения = НСтр("ru = 'Прервать подготовку к резервному копированию данных?'");
ОбщегоНазначенияКлиент.ПоказатьПодтверждениеЗакрытияПроизвольнойФормы(ЭтотОбъект,
Отказ, ЗавершениеРаботы, ТекстПредупреждения, "ЗакрытьФормуБезусловно");
КонецПроцедуры
&НаКлиенте
Процедура ПриЗакрытии(ЗавершениеРаботы)
Если ЗавершениеРаботы Тогда
Возврат;
КонецЕсли;
ОтключитьОбработчикОжидания("ИстечениеВремениОжидания");
ОтключитьОбработчикОжидания("ПроверкаНаЕдинственностьПодключения");
Если ВыполняетсяРезервноеКопирование = Истина Тогда
Возврат;
КонецЕсли;
СоединенияИБКлиент.УстановитьПризнакЗавершитьВсеСеансыКромеТекущего(Ложь);
СоединенияИБКлиент.УстановитьПризнакРаботаПользователейЗавершается(Ложь);
СоединенияИБВызовСервера.РазрешитьРаботуПользователей();
Если ПроцессВыполняется() Тогда
УстановитьПроцессВыполняется(Ложь);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
Если ИмяСобытия = "ЗавершениеРаботыПользователей" И Параметр.КоличествоСеансов <= 1
И ПараметрыПриложения["СтандартныеПодсистемы.ПараметрыРезервногоКопированияИБ"].ПроцессВыполняется Тогда
НачатьРезервноеКопирование();
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиСобытийЭлементовШапкиФормы
&НаКлиенте
Процедура СписокПользователейНажатие(Элемент)
СтандартныеПодсистемыКлиент.ОткрытьСписокАктивныхПользователей(, ЭтотОбъект);
КонецПроцедуры
&НаКлиенте
Процедура ПутьККаталогуАрхивовНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
ВыбранныйПуть = ПолучитьПуть(РежимДиалогаВыбораФайла.ВыборКаталога);
Если Не ПустаяСтрока(ВыбранныйПуть) Тогда
Объект.КаталогСРезервнымиКопиями = ВыбранныйПуть;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ИмяФайлаРезервнойКопииОткрытие(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ФайловаяСистемаКлиент.ОткрытьПроводник(ИмяФайлаРезервнойКопии);
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиКомандФормы
&НаКлиенте
Процедура Далее(Команда)
ОчиститьСообщения();
Если Не ПроверитьЗаполнениеРеквизитов() Тогда
Возврат;
КонецЕсли;
ТекущаяСтраницаПомощника = Элементы.СтраницыПомощника.ТекущаяСтраница;
Если ТекущаяСтраницаПомощника = Элементы.СтраницаВыполненияРезервногоКопирования Тогда
ПерейтиНаСтраницу(Элементы.СтраницаИнформацииИВыполненияРезервногоКопирования);
УстановитьПутьАрхиваСКопиями(Объект.КаталогСРезервнымиКопиями, АвтоматическоеВыполнение);
Иначе
Закрыть();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура Отмена(Команда)
Закрыть();
КонецПроцедуры
&НаКлиенте
Процедура ПерейтиВЖурналРегистрации(Команда)
ОткрытьФорму("Обработка.ЖурналРегистрации.Форма.ЖурналРегистрации", , ЭтотОбъект);
КонецПроцедуры
&НаКлиенте
Процедура НеДожидатьсяЗавершенияСеансов(Команда)
НачатьРезервноеКопирование();
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
&НаКлиенте
Процедура ПерейтиНаСтраницу(НоваяСтраница)
ПерейтиДалее = Истина;
Если НоваяСтраница = Элементы.СтраницаИнформацииИВыполненияРезервногоКопирования Тогда
ПерейтиНаСтраницуИнформацииИВыполненияРезервногоКопирования(ПерейтиДалее);
ИначеЕсли НоваяСтраница = Элементы.СтраницаОшибокПриКопировании
Или НоваяСтраница = Элементы.СтраницаУспешногоВыполненияКопирования Тогда
ПерейтиНаСтраницуРезультатовРезервногоКопирования();
КонецЕсли;
Если Не ПерейтиДалее Тогда
Возврат;
КонецЕсли;
Если НоваяСтраница <> Неопределено Тогда
Элементы.СтраницыПомощника.ТекущаяСтраница = НоваяСтраница;
Иначе
Закрыть();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПерейтиНаСтраницуИнформацииИВыполненияРезервногоКопирования(ПерейтиДалее)
Если Не ПроверитьЗаполнениеРеквизитов() Тогда
Возврат;
КонецЕсли;
ПроверитьНаличиеБлокирующихСеансов();
Оповещение = Новый ОписаниеОповещения(
"ПерейтиНаСтраницуРезервногоКопированияПослеПроверкиДоступаКИнформационнойБазе", ЭтотОбъект);
РезервноеКопированиеИБКлиент.ПроверитьДоступКИнформационнойБазе(ПарольАдминистратораИБ, Оповещение);
КонецПроцедуры
&НаКлиенте
Процедура ПерейтиНаСтраницуРезервногоКопированияПослеПроверкиДоступаКИнформационнойБазе(РезультатПодключения, Контекст) Экспорт
Если РезультатПодключения.ОшибкаПодключенияКомпоненты Тогда
Элементы.СтраницыПомощника.ТекущаяСтраница = Элементы.СтраницаВыполненияРезервногоКопирования;
Элементы.СтраницыСтатусаКопирования.ТекущаяСтраница = Элементы.СтраницаОшибкаПодключения;
ОбнаруженнаяОшибкаПодключения = РезультатПодключения.КраткоеОписаниеОшибки;
Возврат;
КонецЕсли;
УстановитьПараметрыРезервногоКопирования();
УстановитьПроцессВыполняется(Истина);
КоличествоСеансовИнформационнойБазы = ПроверитьНаличиеБлокирующихСеансов();
Элементы.Отмена.Доступность = Истина;
Элементы.Далее.Доступность = Ложь;
УстановитьЗаголовокКнопкиДалее(Истина);
СоединенияИБВызовСервера.УстановитьБлокировкуСоединений(
НСтр("ru = 'Выполняется резервное копирование информационной базы.'"),
"РезервноеКопирование");
Если КоличествоСеансовИнформационнойБазы = 1 Тогда
СоединенияИБКлиент.УстановитьПризнакЗавершитьВсеСеансыКромеТекущего(Истина);
СоединенияИБКлиент.УстановитьПризнакРаботаПользователейЗавершается(Истина);
НачатьРезервноеКопирование();
Иначе
СоединенияИБКлиент.УстановитьРежимЗавершенияРаботыПользователей(Истина);
УстановитьОбработчикОжиданияНачалаРезервногоКопирования();
УстановитьОбработчикОжиданияИстеченияТаймаутаРезервногоКопирования();
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция ПроверитьНаличиеБлокирующихСеансов()
КоличествоСеансовИнформационнойБазы = КоличествоСеансовИнформационнойБазы();
Элементы.КоличествоАктивныхПользователей.Заголовок = КоличествоСеансовИнформационнойБазы;
ИнформацияОБлокирующихСеансах = СоединенияИБ.ИнформацияОБлокирующихСеансах("");
ИмеютсяБлокирующиеСеансы = ИнформацияОБлокирующихСеансах.ИмеютсяБлокирующиеСеансы;
Если ИмеютсяБлокирующиеСеансы Тогда
Элементы.ДекорацияАктивныеСеансы.Заголовок = ИнформацияОБлокирующихСеансах.ТекстСообщения;
КонецЕсли;
Элементы.ДекорацияАктивныеСеансы.Видимость = ИмеютсяБлокирующиеСеансы;
Возврат КоличествоСеансовИнформационнойБазы;
КонецФункции
&НаКлиенте
Процедура ПерейтиНаСтраницуРезультатовРезервногоКопирования()
Элементы.Далее.Видимость = Ложь;
Элементы.Отмена.Заголовок = НСтр("ru = 'Закрыть'");
Элементы.Отмена.КнопкаПоУмолчанию = Истина;
Настройки = НастройкиРезервногоКопирования();
РезервноеКопированиеИБКлиент.ЗаполнитьЗначенияГлобальныхПеременных(Настройки);
СброситьПризнакРезервногоКопирования();
КонецПроцедуры
&НаСервереБезКонтекста
Процедура СброситьПризнакРезервногоКопирования()
РезервноеКопированиеИБСервер.СброситьПризнакРезервногоКопирования();
КонецПроцедуры
&НаСервере
Процедура УстановитьПараметрыРезервногоКопирования()
Настройки = РезервноеКопированиеИБСервер.НастройкиРезервногоКопирования();
Настройки.Вставить("АдминистраторИБ", АдминистраторИБ);
Настройки.Вставить("ПарольАдминистратораИБ", ?(ТребуетсяВводПароля, ПарольАдминистратораИБ, ""));
РезервноеКопированиеИБСервер.УстановитьНастройкиРезервногоКопирования(Настройки);
КонецПроцедуры
&НаСервереБезКонтекста
Функция НастройкиРезервногоКопирования()
Возврат РезервноеКопированиеИБСервер.НастройкиРезервногоКопирования();
КонецФункции
&НаКлиенте
Функция ПроверитьЗаполнениеРеквизитов()
#Если ВебКлиент Тогда
ТекстСообщения = НСтр("ru = 'Создание резервной копии не доступно в веб-клиенте.'");
ОбщегоНазначенияКлиент.СообщитьПользователю(ТекстСообщения);
РеквизитыЗаполнены = Ложь;
#Иначе
РеквизитыЗаполнены = Истина;
Объект.КаталогСРезервнымиКопиями = СокрЛП(Объект.КаталогСРезервнымиКопиями);
Если ПустаяСтрока(Объект.КаталогСРезервнымиКопиями) Тогда
ТекстСообщения = НСтр("ru = 'Не выбран каталог для резервной копии.'");
ОбщегоНазначенияКлиент.СообщитьПользователю(ТекстСообщения,, "Объект.КаталогСРезервнымиКопиями");
РеквизитыЗаполнены = Ложь;
ИначеЕсли НайтиФайлы(Объект.КаталогСРезервнымиКопиями).Количество() = 0 Тогда
ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Указан несуществующий каталог ""%1"".
|Если резервное копирование было настроено на другом компьютере, укажите сетевой каталог, доступный с любого компьютера, где ведется работа в приложении.'"),
Объект.КаталогСРезервнымиКопиями);
ОбщегоНазначенияКлиент.СообщитьПользователю(ТекстСообщения,, "Объект.КаталогСРезервнымиКопиями");
РеквизитыЗаполнены = Ложь;
Иначе
ИмяФайла = "test.test1С";
Попытка
ТестовыйФайл = Новый ЗаписьXML;
ТестовыйФайл.ОткрытьФайл(Объект.КаталогСРезервнымиКопиями + "/" + ИмяФайла);
ТестовыйФайл.ЗаписатьОбъявлениеXML();
ТестовыйФайл.Закрыть();
Исключение
ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Нет прав на запись в каталог с резервными копиями.
|Не удалось создать тестовый файл %1 по причине: %2'"),
ИмяФайла, ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
ОбщегоНазначенияКлиент.СообщитьПользователю(ТекстСообщения,, "Объект.КаталогСРезервнымиКопиями");
РеквизитыЗаполнены = Ложь;
КонецПопытки;
Если РеквизитыЗаполнены Тогда
Попытка
УдалитьФайлы(Объект.КаталогСРезервнымиКопиями, "*.test1С");
Исключение
КонецПопытки;
КонецЕсли;
КонецЕсли;
Если ТребуетсяВводПароля И ПустаяСтрока(ПарольАдминистратораИБ) Тогда
ТекстСообщения = НСтр("ru = 'Не задан пароль администратора.'");
ОбщегоНазначенияКлиент.СообщитьПользователю(ТекстСообщения,, "ПарольАдминистратораИБ");
РеквизитыЗаполнены = Ложь;
КонецЕсли;
#КонецЕсли
Возврат РеквизитыЗаполнены;
КонецФункции
&НаКлиенте
Процедура УстановитьОбработчикОжиданияИстеченияТаймаутаРезервногоКопирования()
ПодключитьОбработчикОжидания("ИстечениеВремениОжидания", 600, Истина);
КонецПроцедуры
&НаКлиенте
Процедура ИстечениеВремениОжидания()
ОтключитьОбработчикОжидания("ПроверкаНаЕдинственностьПодключения");
ТекстВопроса = НСтр("ru = 'Не удалось отключить всех пользователей от базы. Провести резервное копирование? (возможны ошибки при архивации)'");
ТекстПояснения = НСтр("ru = 'Не удалось отключить пользователя.'");
ОписаниеОповещения = Новый ОписаниеОповещения("ИстечениеВремениОжиданияЗавершение", ЭтотОбъект);
ПоказатьВопрос(ОписаниеОповещения, ТекстВопроса, РежимДиалогаВопрос.ДаНет, 30, КодВозвратаДиалога.Нет, ТекстПояснения, КодВозвратаДиалога.Нет);
КонецПроцедуры
&НаКлиенте
Процедура ИстечениеВремениОжиданияЗавершение(Ответ, ДополнительныеПараметры) Экспорт
Если Ответ = КодВозвратаДиалога.Да Тогда
НачатьРезервноеКопирование();
Иначе
ОчиститьСообщения();
СоединенияИБКлиент.УстановитьПризнакЗавершитьВсеСеансыКромеТекущего(Ложь);
ОтменитьПодготовку();
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ОтменитьПодготовку()
Элементы.НадписьНеУдалось.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = '%1.
|Подготовка к резервному копированию отменена. Информационная база разблокирована.'"),
СоединенияИБ.СообщениеОНеотключенныхСеансах());
Элементы.СтраницыПомощника.ТекущаяСтраница = Элементы.СтраницаОшибокПриКопировании;
Элементы.ПерейтиВЖурналРегистрации1.Видимость = Ложь;
Элементы.Далее.Видимость = Ложь;
Элементы.Отмена.Заголовок = НСтр("ru = 'Закрыть'");
Элементы.Отмена.КнопкаПоУмолчанию = Истина;
СоединенияИБ.РазрешитьРаботуПользователей();
КонецПроцедуры
&НаКлиенте
Процедура УстановитьОбработчикОжиданияНачалаРезервногоКопирования()
ПодключитьОбработчикОжидания("ПроверкаНаЕдинственностьПодключения", 5);
КонецПроцедуры
&НаКлиенте
Процедура ПроверкаНаЕдинственностьПодключения()
КоличествоПользователей = КоличествоСеансовИнформационнойБазы();
Элементы.КоличествоАктивныхПользователей.Заголовок = Строка(КоличествоПользователей);
Если КоличествоПользователей = 1 Тогда
НачатьРезервноеКопирование();
Иначе
ПроверитьНаличиеБлокирующихСеансов();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура УстановитьЗаголовокКнопкиДалее(ЭтоКнопкаДалее)
Элементы.Далее.Заголовок = ?(ЭтоКнопкаДалее, НСтр("ru = 'Далее >'"), НСтр("ru = 'Готово'"));
КонецПроцедуры
&НаКлиенте
Функция ПолучитьПуть(РежимДиалога)
Режим = РежимДиалога;
ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим);
Если Режим = РежимДиалогаВыбораФайла.ВыборКаталога Тогда
ДиалогОткрытияФайла.Заголовок= НСтр("ru = 'Выберите каталог'");
Иначе
ДиалогОткрытияФайла.Заголовок= НСтр("ru = 'Выберите файл'");
КонецЕсли;
Если ДиалогОткрытияФайла.Выбрать() Тогда
Если РежимДиалога = РежимДиалогаВыбораФайла.ВыборКаталога Тогда
Возврат ДиалогОткрытияФайла.Каталог;
Иначе
Возврат ДиалогОткрытияФайла.ПолноеИмяФайла;
КонецЕсли;
КонецЕсли;
КонецФункции
&НаКлиенте
Процедура НачатьРезервноеКопирование()
#Если Не ВебКлиент И Не МобильныйКлиент Тогда
РезервноеКопированиеИБКлиент.НеОстанавливатьВыполнениеСценариев();
ИмяГлавногоФайлаСкрипта = СформироватьФайлыСкрипта();
ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(
РезервноеКопированиеИБКлиент.СобытиеЖурналаРегистрации(),
"Информация",
НСтр("ru = 'Выполняется резервное копирование информационной базы:'") + " " + ИмяГлавногоФайлаСкрипта);
Если Параметры.РежимРаботы = "ВыполнитьСейчас" Или Параметры.РежимРаботы = "ВыполнитьПриЗавершенииРаботы" Тогда
РезервноеКопированиеИБКлиент.УдалитьРезервныеКопииПоНастройке();
КонецЕсли;
ВыполняетсяРезервноеКопирование = Истина;
ЗакрытьФормуБезусловно = Истина;
ПараметрыПриложения.Вставить("СтандартныеПодсистемы.ПропуститьПредупреждениеПередЗавершениемРаботыСистемы", Истина);
ПутьКПрограммеЗапуска = СтандартныеПодсистемыКлиент.КаталогСистемныхПриложений() + "mshta.exe";
СтрокаЗапуска = """%1"" ""%2"" [p1]%3[/p1]";
СтрокаЗапуска = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
СтрокаЗапуска,
ПутьКПрограммеЗапуска,
ИмяГлавногоФайлаСкрипта,
РезервноеКопированиеИБКлиент.СтрокаUnicode(ПарольАдминистратораИБ));
ПараметрыЗапускаПрограммы = ФайловаяСистемаКлиент.ПараметрыЗапускаПрограммы();
ПараметрыЗапускаПрограммы.Оповещение = Новый ОписаниеОповещения("ПослеЗапускаСкрипта", ЭтотОбъект);
ПараметрыЗапускаПрограммы.ДождатьсяЗавершения = Ложь;
ФайловаяСистемаКлиент.ЗапуститьПрограмму(СтрокаЗапуска, ПараметрыЗапускаПрограммы);
#КонецЕсли
КонецПроцедуры
&НаКлиенте
Процедура ПослеЗапускаСкрипта(Результат, Контекст) Экспорт
Если Результат.ПриложениеЗапущено Тогда
ПрекратитьРаботуСистемы();
Иначе
ПоказатьПредупреждение(, Результат.ОписаниеОшибки);
КонецЕсли;
КонецПроцедуры
#Область ОбработчикиСобытийФормыНаСервереИИзмененияНастроекРезервногоКопирования
&НаСервереБезКонтекста
Процедура УстановитьПутьАрхиваСКопиями(Знач Путь, Знач АвтоматическоеВыполнение)
НастройкиПути = РезервноеКопированиеИБСервер.НастройкиРезервногоКопирования();
Если АвтоматическоеВыполнение Тогда
НастройкиПути.КаталогХраненияРезервныхКопий = Путь;
Иначе
НастройкиПути.КаталогХраненияРезервныхКопийПриРучномЗапуске = Путь;
КонецЕсли;
РезервноеКопированиеИБСервер.УстановитьНастройкиРезервногоКопирования(НастройкиПути);
КонецПроцедуры
#КонецОбласти
#Область ПроцедурыИФункцииПодготовкиРезервногоКопирования
#Если Не ВебКлиент И Не МобильныйКлиент Тогда
&НаКлиенте
Функция СформироватьФайлыСкрипта()
ПараметрыРезервногоКопирования = РезервноеКопированиеИБКлиент.КлиентскиеПараметрыРезервногоКопирования();
СоздатьКаталог(ПараметрыРезервногоКопирования.КаталогВременныхФайловОбновления);
ПараметрыСкрипта = РезервноеКопированиеИБКлиент.ОбщиеПараметрыСкрипта();
ПараметрыСкрипта.КаталогПрограммы = Параметры.КаталогПрограммы;
ПараметрыСкрипта.ИмяФайлаПрограммы = ПараметрыРезервногоКопирования.ИмяФайлаПрограммы;
ПараметрыСкрипта.СобытиеЖурналаРегистрации = ПараметрыРезервногоКопирования.СобытиеЖурналаРегистрации;
ПараметрыСкрипта.ИмяCOMСоединителя = ОбщегоНазначенияКлиентСервер.ИмяCOMСоединителя();
ПараметрыСкрипта.ПутьКCOMСоединителю = КаталогПрограммы() + "comcntr.dll";
ПараметрыСкрипта.ЭтоБазоваяВерсияКонфигурации = СтандартныеПодсистемыКлиент.ЭтоБазоваяВерсияКонфигурации();
ПараметрыСкрипта.ПараметрыСкрипта = РезервноеКопированиеИБКлиент.ПараметрыАутентификацииАдминистратораОбновления(ПарольАдминистратораИБ);
ПараметрыСкрипта.ПараметрыЗапускаПредприятия = ОбщегоНазначенияСлужебныйКлиент.ПараметрыЗапускаПредприятияИзСкрипта();
Скрипты = СформироватьТекстСкриптов(ПараметрыСкрипта, ПараметрыПриложения["СтандартныеПодсистемы.СообщенияДляЖурналаРегистрации"]);
ФайлСкрипта = Новый ТекстовыйДокумент;
ФайлСкрипта.Вывод = ИспользованиеВывода.Разрешить;
ФайлСкрипта.УстановитьТекст(Скрипты.Скрипт);
ИмяФайлаСкрипта = ПараметрыРезервногоКопирования.КаталогВременныхФайловОбновления + "main.js";
ФайлСкрипта.Записать(ИмяФайлаСкрипта, РезервноеКопированиеИБКлиент.КодировкаФайловПрограммыРезервногоКопированияИБ());
ФайлСкрипта = Новый ТекстовыйДокумент;
ФайлСкрипта.Вывод = ИспользованиеВывода.Разрешить;
ФайлСкрипта.УстановитьТекст(Скрипты.ДопФайлРезервногоКопирования);
ФайлСкрипта.Записать(ПараметрыРезервногоКопирования.КаталогВременныхФайловОбновления + "helpers.js",
РезервноеКопированиеИБКлиент.КодировкаФайловПрограммыРезервногоКопированияИБ());
БиблиотекаКартинок.ЗаставкаВнешнейОперации.Записать(ПараметрыРезервногоКопирования.КаталогВременныхФайловОбновления + "splash.png");
БиблиотекаКартинок.ЗначокЗаставкиВнешнейОперации.Записать(ПараметрыРезервногоКопирования.КаталогВременныхФайловОбновления + "splash.ico");
БиблиотекаКартинок.ДлительнаяОперация48.Записать(ПараметрыРезервногоКопирования.КаталогВременныхФайловОбновления + "progress.gif");
ИмяГлавногоФайлаСкрипта = ПараметрыРезервногоКопирования.КаталогВременныхФайловОбновления + "splash.hta";
ФайлСкрипта = Новый ТекстовыйДокумент;
ФайлСкрипта.Вывод = ИспользованиеВывода.Разрешить;
ФайлСкрипта.УстановитьТекст(Скрипты.ЗаставкаРезервногоКопирования);
ФайлСкрипта.Записать(ИмяГлавногоФайлаСкрипта, РезервноеКопированиеИБКлиент.КодировкаФайловПрограммыРезервногоКопированияИБ());
ФайлЛога = Новый ТекстовыйДокумент;
ФайлЛога.Вывод = ИспользованиеВывода.Разрешить;
ФайлЛога.УстановитьТекст(СтандартныеПодсистемыКлиент.ИнформацияДляПоддержки());
ФайлЛога.Записать(ПараметрыРезервногоКопирования.КаталогВременныхФайловОбновления + "templog.txt", КодировкаТекста.Системная);
Возврат ИмяГлавногоФайлаСкрипта;
КонецФункции
#КонецЕсли
&НаСервере
Функция СформироватьТекстСкриптов(Знач ПараметрыСкрипта, СообщенияДляЖурналаРегистрации)
ЖурналРегистрации.ЗаписатьСобытияВЖурналРегистрации(СообщенияДляЖурналаРегистрации);
Результат = Новый Структура("Скрипт, ДопФайлРезервногоКопирования, ЗаставкаРезервногоКопирования");
Результат.Скрипт = СформироватьТекстСкрипта(ПараметрыСкрипта);
Результат.ДопФайлРезервногоКопирования = Обработки.РезервноеКопированиеИБ.ПолучитьМакет("ДопФайлРезервногоКопирования").ПолучитьТекст();
Результат.ЗаставкаРезервногоКопирования = СформироватьТекстЗаставки();
Возврат Результат;
КонецФункции
&НаСервере
Функция СформироватьТекстСкрипта(ПараметрыСкрипта)
ШаблонСкрипта = Обработки.РезервноеКопированиеИБ.ПолучитьМакет("МакетФайлаРезервногоКопирования");
Скрипт = ШаблонСкрипта.ПолучитьОбласть("ОбластьПараметров");
Скрипт.УдалитьСтроку(1);
Скрипт.УдалитьСтроку(Скрипт.КоличествоСтрок());
Если СтрНачинаетсяС(Скрипт.ПолучитьСтроку(Скрипт.КоличествоСтрок()), "#") Тогда
Скрипт.УдалитьСтроку(Скрипт.КоличествоСтрок());
КонецЕсли;
Текст = ШаблонСкрипта.ПолучитьОбласть("ОбластьРезервногоКопирования");
Текст.УдалитьСтроку(1);
Текст.УдалитьСтроку(Текст.КоличествоСтрок());
Возврат ВставитьПараметрыСкрипта(Скрипт.ПолучитьТекст(), ПараметрыСкрипта)
+ ВставитьПараметрыСкрипта(Текст.ПолучитьТекст(), ПараметрыСкрипта);
КонецФункции
&НаСервере
Функция ВставитьПараметрыСкрипта(Знач Текст, Знач ПараметрыСкрипта)
ИмяКаталога = ПроверитьКаталогНаУказаниеКорневогоЭлемента(Объект.КаталогСРезервнымиКопиями);
ПараметрыТекста = РезервноеКопированиеИБСервер.ПодготовитьОбщиеПараметрыСкрипта(ПараметрыСкрипта);
ПараметрыТекста["[СоздаватьРезервнуюКопию]"] = "true";
ПараметрыТекста["[КаталогРезервнойКопии]"] = РезервноеКопированиеИБСервер.ПодготовитьТекст(ИмяКаталога + "\backup" + СтрокаКаталогаИзДаты());
ПараметрыТекста["[ВосстанавливатьИнформационнуюБазу]"] = "false";
ПараметрыТекста["[ВыполнитьПриЗавершенииРаботы]"] = ?(Параметры.РежимРаботы = "ВыполнитьПриЗавершенииРаботы", "true", "false");
Возврат РезервноеКопированиеИБСервер.ПодставитьПараметрыВТекст(Текст, ПараметрыТекста);
КонецФункции
&НаСервере
Функция СформироватьТекстЗаставки()
ШаблонТекста = Обработки.РезервноеКопированиеИБ.ПолучитьМакет("ЗаставкаРезервногоКопирования").ПолучитьТекст();
ПараметрыТекста = Новый Соответствие;
ПараметрыТекста["[ЗаголовокЗаставки]"] = НСтр("ru = 'Резервное копирование информационной базы...'");
ПараметрыТекста["[ТекстЗаставки]"] =
НСтр("ru = 'Пожалуйста, подождите.
|<br /> Выполняется резервное копирование базы.
|<br /> Не рекомендуется останавливать процесс.'");
ПараметрыТекста["[Шаг1Инициализация]"] = НСтр("ru = 'Инициализация'");
ПараметрыТекста["[Шаг2СозданиеРезервнойКопии]"] = НСтр("ru = 'Создание резервной копии информационной базы'");
ПараметрыТекста["[Шаг3ОжиданиеЗавершения]"] = НСтр("ru = 'Ожидание завершения резервного копирования'");
ПараметрыТекста["[Шаг4РазрешениеПодключений]"] = НСтр("ru = 'Разрешение подключений новых соединений'");
ПараметрыТекста["[Шаг5Завершение]"] = НСтр("ru = 'Завершение'");
ПараметрыТекста["[ПроцессПрерван]"] = НСтр("ru = 'Внимание: процесс резервного копирования был прерван, и информационная база осталась заблокированной.'");
ПараметрыТекста["[ПроцессПрерванПодсказка]"] = НСтр("ru = 'Для разблокирования информационной базы воспользуйтесь консолью кластера серверов или запустите ""1С:Предприятие"".'");
РезервноеКопированиеИБСервер.УстановитьОбщиеПараметрыЗаставки(ПараметрыТекста);
Возврат РезервноеКопированиеИБСервер.ПодставитьПараметрыВТекст(ШаблонТекста, ПараметрыТекста);
КонецФункции
&НаСервере
Функция ПроверитьКаталогНаУказаниеКорневогоЭлемента(СтрокаКаталога)
Если СтрЗаканчиваетсяНа(СтрокаКаталога, ":\") Тогда
Возврат Лев(СтрокаКаталога, СтрДлина(СтрокаКаталога) - 1) ;
Иначе
Возврат СтрокаКаталога;
КонецЕсли;
КонецФункции
&НаСервере
Функция СтрокаКаталогаИзДаты()
СтрокаВозврата = "";
ДатаСейчас = ТекущаяДатаСеанса();
СтрокаВозврата = Формат(ДатаСейчас, "ДФ = гггг_ММ_дд_ЧЧ_мм_сс");
Возврат СтрокаВозврата;
КонецФункции
&НаКлиенте
Процедура НадписьОбновитьВерсиюКомпонентыОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылка, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ОбщегоНазначенияКлиент.ЗарегистрироватьCOMСоединитель();
КонецПроцедуры
&НаСервереБезКонтекста
Функция КоличествоСеансовИнформационнойБазы()
Возврат СоединенияИБ.КоличествоСеансовИнформационнойБазы(Ложь, Ложь);
КонецФункции
&НаКлиенте
Функция ПроцессВыполняется()
Настройки = ПараметрыПриложения["СтандартныеПодсистемы.ПараметрыРезервногоКопированияИБ"];
Если Настройки = Неопределено Тогда
НовыеНастройки = НастройкиРезервногоКопирования();
РезервноеКопированиеИБКлиент.ЗаполнитьЗначенияГлобальныхПеременных(НовыеНастройки);
Настройки = ПараметрыПриложения["СтандартныеПодсистемы.ПараметрыРезервногоКопированияИБ"];
КонецЕсли;
Возврат ?(Настройки.ПроцессВыполняется <> Неопределено, Настройки.ПроцессВыполняется, Ложь);
КонецФункции
&НаКлиенте
Процедура УстановитьПроцессВыполняется(Знач ПроцессВыполняется)
Настройки = ПараметрыПриложения["СтандартныеПодсистемы.ПараметрыРезервногоКопированияИБ"];
Если Настройки = Неопределено Тогда
НовыеНастройки = НастройкиРезервногоКопирования();
РезервноеКопированиеИБКлиент.ЗаполнитьЗначенияГлобальныхПеременных(НовыеНастройки);
Настройки = ПараметрыПриложения["СтандартныеПодсистемы.ПараметрыРезервногоКопированияИБ"];
КонецЕсли;
Настройки.ПроцессВыполняется = ПроцессВыполняется;
РезервноеКопированиеИБВызовСервера.УстановитьЗначениеНастройки("ПроцессВыполняется", ПроцессВыполняется);
КонецПроцедуры
#КонецОбласти
#КонецОбласти