Files
2025-08-29 13:24:00 +03:00

778 lines
53 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2024, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////
#Область ОписаниеПеременных
&НаКлиенте
Перем ВыполняетсяРезервноеКопирование;
#КонецОбласти
#Область ОбработчикиСобытийФормы
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Не ОбщегоНазначения.Это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'"),
ИмяФайла, ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
ОбщегоНазначенияКлиент.СообщитьПользователю(ТекстСообщения,, "Объект.КаталогСРезервнымиКопиями");
РеквизитыЗаполнены = Ложь;
КонецПопытки;
Если РеквизитыЗаполнены Тогда
// АПК:280-выкл Исключение не обрабатываем т.к. на этом шаге не происходит удаления файлов.
Попытка
УдалитьФайлы(Объект.КаталогСРезервнымиКопиями, "*.test1С");
Исключение
КонецПопытки;
// АПК:280-вкл
КонецЕсли;
КонецЕсли;
Если ТребуетсяВводПароля И ПустаяСтрока(ПарольАдминистратораИБ) Тогда
ТекстСообщения = НСтр("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.
ФайлСкрипта = Новый ТекстовыйДокумент;
ФайлСкрипта.Вывод = ИспользованиеВывода.Разрешить;
ФайлСкрипта.УстановитьТекст(Скрипты.Скрипт);
ИмяФайлаСкрипта = ПараметрыРезервногоКопирования.КаталогВременныхФайловОбновления + "main.js";
ФайлСкрипта.Записать(ИмяФайлаСкрипта, РезервноеКопированиеИБКлиент.КодировкаФайловПрограммыРезервногоКопированияИБ());
// Вспомогательный файл helpers.js.
ФайлСкрипта = Новый ТекстовыйДокумент;
ФайлСкрипта.Вывод = ИспользованиеВывода.Разрешить;
ФайлСкрипта.УстановитьТекст(Скрипты.ДопФайлРезервногоКопирования);
ФайлСкрипта.Записать(ПараметрыРезервногоКопирования.КаталогВременныхФайловОбновления + "helpers.js",
РезервноеКопированиеИБКлиент.КодировкаФайловПрограммыРезервногоКопированияИБ());
БиблиотекаКартинок.ЗаставкаВнешнейОперации.Записать(ПараметрыРезервногоКопирования.КаталогВременныхФайловОбновления + "splash.png");
БиблиотекаКартинок.ЗначокЗаставкиВнешнейОперации.Записать(ПараметрыРезервногоКопирования.КаталогВременныхФайловОбновления + "splash.ico");
БиблиотекаКартинок.ДлительнаяОперация48.Записать(ПараметрыРезервногоКопирования.КаталогВременныхФайловОбновления + "progress.gif");
// Главный файл заставки splash.hta.
ИмяГлавногоФайлаСкрипта = ПараметрыРезервногоКопирования.КаталогВременныхФайловОбновления + "splash.hta";
ФайлСкрипта = Новый ТекстовыйДокумент;
ФайлСкрипта.Вывод = ИспользованиеВывода.Разрешить;
ФайлСкрипта.УстановитьТекст(Скрипты.ЗаставкаРезервногоКопирования);
ФайлСкрипта.Записать(ИмяГлавногоФайлаСкрипта, РезервноеКопированиеИБКлиент.КодировкаФайловПрограммыРезервногоКопированияИБ());
ФайлЛога = Новый ТекстовыйДокумент;
ФайлЛога.Вывод = ИспользованиеВывода.Разрешить;
ФайлЛога.УстановитьТекст(СтандартныеПодсистемыКлиент.ИнформацияДляПоддержки());
ФайлЛога.Записать(ПараметрыРезервногоКопирования.КаталогВременныхФайловОбновления + "templog.txt", КодировкаТекста.Системная);
Возврат ИмяГлавногоФайлаСкрипта;
КонецФункции
#КонецЕсли
&НаСервере
Функция СформироватьТекстСкриптов(Знач ПараметрыСкрипта, СообщенияДляЖурналаРегистрации)
ЖурналРегистрации.ЗаписатьСобытияВЖурналРегистрации(СообщенияДляЖурналаРегистрации);
Результат = Новый Структура("Скрипт, ДопФайлРезервногоКопирования, ЗаставкаРезервногоКопирования");
Результат.Скрипт = СформироватьТекстСкрипта(ПараметрыСкрипта);
Результат.ДопФайлРезервногоКопирования = Обработки.РезервноеКопированиеИБ.ПолучитьМакет("ДопФайлРезервногоКопирования").ПолучитьТекст();
Результат.ЗаставкаРезервногоКопирования = СформироватьТекстЗаставки();
Возврат Результат;
КонецФункции
&НаСервере
Функция СформироватьТекстСкрипта(ПараметрыСкрипта)
// Файл обновления конфигурации: main.js.
ШаблонСкрипта = Обработки.РезервноеКопированиеИБ.ПолучитьМакет("МакетФайлаРезервногоКопирования");
Скрипт = ШаблонСкрипта.ПолучитьОбласть("ОбластьПараметров");
Скрипт.УдалитьСтроку(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Соединитель();
КонецПроцедуры
&НаСервереБезКонтекста
Функция КоличествоСеансовИнформационнойБазы()
Возврат СоединенияИБ.КоличествоСеансовИнформационнойБазы(Ложь, Ложь);
КонецФункции
&НаКлиенте
Функция ПроцессВыполняется()
Настройки = ПараметрыПриложения["СтандартныеПодсистемы.ПараметрыРезервногоКопированияИБ"];
Если Настройки = Неопределено Тогда
НовыеНастройки = НастройкиРезервногоКопирования();
РезервноеКопированиеИБКлиент.ЗаполнитьЗначенияГлобальныхПеременных(НовыеНастройки);
Настройки = ПараметрыПриложения["СтандартныеПодсистемы.ПараметрыРезервногоКопированияИБ"];
КонецЕсли;
Возврат ?(Настройки.ПроцессВыполняется <> Неопределено, Настройки.ПроцессВыполняется, Ложь);
КонецФункции
&НаКлиенте
Процедура УстановитьПроцессВыполняется(Знач ПроцессВыполняется)
Настройки = ПараметрыПриложения["СтандартныеПодсистемы.ПараметрыРезервногоКопированияИБ"];
Если Настройки = Неопределено Тогда
НовыеНастройки = НастройкиРезервногоКопирования();
РезервноеКопированиеИБКлиент.ЗаполнитьЗначенияГлобальныхПеременных(НовыеНастройки);
Настройки = ПараметрыПриложения["СтандартныеПодсистемы.ПараметрыРезервногоКопированияИБ"];
КонецЕсли;
Настройки.ПроцессВыполняется = ПроцессВыполняется;
РезервноеКопированиеИБВызовСервера.УстановитьЗначениеНастройки("ПроцессВыполняется", ПроцессВыполняется);
КонецПроцедуры
#КонецОбласти
#КонецОбласти