├── .gitignore
├── Distr
├── Perezalivator-2018.05.18.ospx
└── install.bat
├── Perezalivator.ico
├── Perezalivator.os
├── Perezalivator_Run.bat
├── Perezalivator_Run_Test.bat
├── README.md
├── Screenshots
├── Perezalivator1.png
├── Perezalivator2.png
├── Perezalivator3.png
├── Perezalivator4.png
└── Perezalivator5.png
└── packagedef
/.gitignore:
--------------------------------------------------------------------------------
1 | _Logs
2 | package-build.bat
3 | package-build.os
4 | Perezalivator_Params.json
--------------------------------------------------------------------------------
/Distr/Perezalivator-2018.05.18.ospx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Tavalik/Perezalivator/3c58143746382857fc53a6be547debb7f30f8980/Distr/Perezalivator-2018.05.18.ospx
--------------------------------------------------------------------------------
/Distr/install.bat:
--------------------------------------------------------------------------------
1 | @echo off
2 |
3 | setlocal
4 |
5 | set file="%~dp0\Perezalivator-2018.05.10.ospx"
6 |
7 | call opm install -f %file%
8 |
9 | pause
--------------------------------------------------------------------------------
/Perezalivator.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Tavalik/Perezalivator/3c58143746382857fc53a6be547debb7f30f8980/Perezalivator.ico
--------------------------------------------------------------------------------
/Perezalivator.os:
--------------------------------------------------------------------------------
1 | ///////////////////////////////////////////////////////////////////////
2 | // ПРОГРАММА ДЛЯ "ПЕРЕЗАЛИВКИ" БАЗ
3 | // Автор: Онянов Виталий (Tavalik.ru)
4 | // Версия от 15.08.2017
5 | //
6 |
7 | #Использовать json
8 | #Использовать gui
9 | #Использовать TLog
10 | #Использовать TRun1C
11 | #Использовать TMSSQL
12 | #Использовать TMail
13 |
14 | Перем Логирование, УправлениеЭП;
15 | Перем УправляемыйИнтерфейс, ФормаВыбораНастроек;
16 | Перем ТаблицаБазаИсточник, ТаблицаБазаПриемник, ТаблицаПользователи;
17 | Перем КонтрольАктивныхСеансовПройден, ИндексБазыИсточник, ИндексБазыПриемник;
18 | Перем РежимОтладки, РежимТестирования;
19 |
20 | //******************************************************************
21 | Процедура Инициализация()
22 |
23 | ////////////////////////////////////////
24 | // Обнулим глобальные перменные
25 | КонтрольАктивныхСеансовПройден = Ложь;
26 | ИндексБазыИсточник = 0;
27 | ИндексБазыПриемник = 0;
28 | РежимОтладки = Ложь;
29 | РежимТестирования = Ложь;
30 |
31 |
32 | ////////////////////////////////////////
33 | // Каталог для хранения логов
34 | ИдентификаторЗадания = "Perezalivator";
35 | КаталогХраненияЛогов = ".\_Logs\";
36 | Логирование = Новый ТУправлениеЛогированием(); //TLog
37 | Логирование.ДатаВремяВКаждойСтроке = Истина;
38 | Логирование.ВыводитьСообщенияПриЗаписи = Истина;
39 | Логирование.СоздатьФайлЛога(ИдентификаторЗадания,КаталогХраненияЛогов);
40 |
41 |
42 | ////////////////////////////////////////
43 | // Настройка электорнной почты
44 | УправлениеЭП = Новый ТУправлениеЭлектроннойПочтой();
45 |
46 |
47 | ////////////////////////////////////////
48 | // Прочитаем параметры
49 |
50 | // Заполняем источники
51 | ТаблицаБазаИсточник = Новый ТаблицаЗначений;
52 | ТаблицаБазаИсточник.Колонки.Добавить("Имя");
53 | ТаблицаБазаИсточник.Колонки.Добавить("АдресСервераSQL");
54 | ТаблицаБазаИсточник.Колонки.Добавить("ИмяПользователяSQL");
55 | ТаблицаБазаИсточник.Колонки.Добавить("ПарольПользователяSQL");
56 | ТаблицаБазаИсточник.Колонки.Добавить("ИмяБазыДанныхSQL");
57 |
58 | // Заполняем приемники
59 | ТаблицаБазаПриемник = Новый ТаблицаЗначений;
60 | ТаблицаБазаПриемник.Колонки.Добавить("Имя");
61 | ТаблицаБазаПриемник.Колонки.Добавить("ПутьКПлатформе1С");
62 | ТаблицаБазаПриемник.Колонки.Добавить("ТипБазы");
63 | ТаблицаБазаПриемник.Колонки.Добавить("ВерсияCOMConnector");
64 | ТаблицаБазаПриемник.Колонки.Добавить("ИмяБазы");
65 | ТаблицаБазаПриемник.Колонки.Добавить("АдресКластера");
66 | ТаблицаБазаПриемник.Колонки.Добавить("ПортКластера");
67 | ТаблицаБазаПриемник.Колонки.Добавить("ПортАгента");
68 | ТаблицаБазаПриемник.Колонки.Добавить("ИмяПользователяАдминистратораКластера");
69 | ТаблицаБазаПриемник.Колонки.Добавить("ПарольПользователяАдминистратораКластера");
70 | ТаблицаБазаПриемник.Колонки.Добавить("ИмяПользователя");
71 | ТаблицаБазаПриемник.Колонки.Добавить("ПарольПользователя");
72 | ТаблицаБазаПриемник.Колонки.Добавить("АдресХранилища");
73 | ТаблицаБазаПриемник.Колонки.Добавить("ИмяПользователяХранилища");
74 | ТаблицаБазаПриемник.Колонки.Добавить("ПарольПользователяХранилища");
75 | ТаблицаБазаПриемник.Колонки.Добавить("АдресСервераSQL");
76 | ТаблицаБазаПриемник.Колонки.Добавить("ИмяПользователяSQL");
77 | ТаблицаБазаПриемник.Колонки.Добавить("ПарольПользователяSQL");
78 | ТаблицаБазаПриемник.Колонки.Добавить("ИмяБазыДанныхSQL");
79 |
80 | // Прочитаем путь к файлу настроек из командной строки
81 | МассивФайловНастроек = Новый Массив;
82 | Для Сч = 0 По АргументыКоманднойСтроки.Количество()-1 Цикл
83 | Аргумент = АргументыКоманднойСтроки.Получить(Сч);
84 | Если Лев(Аргумент,1) = "-" Тогда
85 | // Специальные параметры
86 | Если СокрЛП(Аргумент) = "-debug" Тогда
87 | РежимОтладки = Истина;
88 | Сообщить("--------------------------------------------");
89 | Сообщить("ЗАПУСК В РЕЖИМЕ ОТЛАДКИ");
90 | Сообщить("--------------------------------------------");
91 | КонецЕсли;
92 | Если СокрЛП(Аргумент) = "-test" Тогда
93 | РежимТестирования = Истина;
94 | Сообщить("--------------------------------------------");
95 | Сообщить("ЗАПУСК В РЕЖИМЕ ТЕСТИРОВАНИЯ НАСТРОЕК");
96 | Сообщить("--------------------------------------------");
97 | КонецЕсли;
98 | Иначе
99 | // Файл с настройками
100 | МассивФайловНастроек.Добавить(СокрЛП(Аргумент));
101 | КонецЕсли;
102 | КонецЦикла;
103 |
104 | // Обработаем файлы настроек
105 | Сч = 0;
106 | Пока Истина Цикл
107 |
108 | ПутьКФайлуНастроек = МассивФайловНастроек.Получить(Сч);
109 | Файл = Новый Файл(ПутьКФайлуНастроек);
110 | Если файл.Существует() Тогда
111 |
112 | // Получим текст файла
113 | ЧтениеТекста = Новый ЧтениеТекста(ПутьКФайлуНастроек, КодировкаТекста.UTF8);
114 | ТекстФайлаНастроек = ЧтениеТекста.Прочитать();
115 | ЧтениеТекста.Закрыть();
116 | Сообщить("Прочитан файл настроек: " + Файл.ПолноеИмя);
117 |
118 | Попытка
119 | ЧтениеJSON = Новый ПарсерJSON;
120 | ПараметрыИзФайла = ЧтениеJSON.ПрочитатьJSON(ТекстФайлаНастроек,,,Истина);
121 | ПрочитатьПараметрыРекурсивно(ПараметрыИзФайла);
122 | Исключение
123 | Сообщить(ОписаниеОшибки());
124 | ЗавершитьРаботу(1);
125 | КонецПопытки;
126 |
127 | Сч = Сч + 1;
128 | Иначе
129 | Сообщить("Не найден файл настроек по пути: " + ПутьКФайлуНастроек);
130 | МассивФайловНастроек.Удалить(Сч);
131 | КонецЕсли;
132 |
133 | Если Сч = МассивФайловНастроек.Количество() Тогда
134 | Прервать;
135 | КонецЕсли;
136 |
137 | КонецЦикла;
138 |
139 | // Если файл не бы передан в параметрах, найдем его в каталоге
140 | Если МассивФайловНастроек.Количество() = 0 Тогда
141 | // Попробуем найти файл настроек в текущем каталоге
142 | ПутьКФайлуНастроек = ОбъединитьПути(ТекущийСценарий().Каталог,"Perezalivator_Params.json");
143 | Файл = Новый Файл(ПутьКФайлуНастроек);
144 | Если Не файл.Существует() Тогда
145 | Если СоздатьШаблонФайлаНастроек(ПутьКФайлуНастроек) Тогда
146 | МассивФайловНастроек.Добавить(ПутьКФайлуНастроек);
147 | Сообщить("Создан шаблон файла настроек. Заполните файл и перезапустите программу.");
148 | ЗавершитьРаботуСПаузой();
149 | Иначе
150 | ЗавершитьРаботу(1);
151 | КонецЕсли;
152 | КонецЕсли;
153 | МассивФайловНастроек.Добавить(ПутьКФайлуНастроек);
154 | КонецЕсли;
155 |
156 | Если РежимТестирования Тогда
157 | ВыполнитьТестНастроек();
158 | Возврат;
159 | КонецЕсли;
160 |
161 | ////////////////////////////////////////
162 | // Загружаем внешнюю компоненту oscript-gui.dll
163 | УправляемыйИнтерфейс = Новый УправляемыйИнтерфейс();
164 | ФормаВыбораНастроек = УправляемыйИнтерфейс.СоздатьФорму();
165 | ФормаВыбораНастроек.УстановитьДействие(ЭтотОбъект, "ПриОткрытии", "ПриОткрытииФормы");
166 | ФормаВыбораНастроек.Показать();
167 |
168 | КонецПроцедуры
169 |
170 | //******************************************************************
171 | Процедура ЗавершитьРаботуСПаузой()
172 |
173 | Сообщить("Для продолжения нажмите любую клавишу...");
174 | Консоль = Новый Консоль();
175 | ОбщееОжидание = 0;
176 | Пока Не Консоль.НажатаКлавиша И ОбщееОжидание < 60000 Цикл
177 | Приостановить(100);
178 | ОбщееОжидание = ОбщееОжидание + 100;
179 | КонецЦикла;
180 | ЗавершитьРаботу(1);
181 |
182 | КонецПроцедуры
183 |
184 | //******************************************************************
185 | Процедура ПрочитатьПараметрыРекурсивно(Параметры, СтруктураЗначений = "")
186 |
187 | Для Каждого Параметр Из Параметры Цикл
188 |
189 | //Сообщить("- " + ТипЗнч(Параметр.Значение) + ", " + Строка(Параметр.Ключ) + ", " + Строка(Параметр.Значение));
190 |
191 | Если ТипЗнч(Параметр.Значение) = Тип("Структура")
192 | ИЛИ ТипЗнч(Параметр.Значение) = Тип("Соответствие") Тогда
193 |
194 | Если Параметр.Ключ = "НастройкиSMTP" Тогда
195 | СтруктураЗначений = УправлениеЭП.УчетнаяЗаписьЭП;
196 | ИначеЕсли Параметр.Ключ = "ПолучателиСообщений" Тогда
197 | СтруктураЗначений = УправлениеЭП.СтруктураСообщения;
198 | КонецЕсли;
199 | ПрочитатьПараметрыРекурсивно(Параметр.Значение, СтруктураЗначений);
200 |
201 | ИначеЕсли ТипЗнч(Параметр.Значение) = Тип("Массив") Тогда
202 |
203 | Для Каждого ЭлементМассива Из Параметр.Значение Цикл
204 | Если Параметр.Ключ = "Источники" Тогда
205 | СтруктураЗначений = ТаблицаБазаИсточник.Добавить();
206 | ИначеЕсли Параметр.Ключ = "Приемники" Тогда
207 | СтруктураЗначений = ТаблицаБазаПриемник.Добавить();
208 | КонецЕсли;
209 | ПрочитатьПараметрыРекурсивно(ЭлементМассива, СтруктураЗначений)
210 | КонецЦикла;
211 |
212 | Иначе
213 | СтруктураЗначений[Параметр.Ключ] = Параметр.Значение;
214 | КонецЕсли;
215 |
216 | КонецЦикла;
217 |
218 | КонецПроцедуры
219 |
220 | //******************************************************************
221 | Функция СоздатьШаблонФайлаНастроек(ПутьКФайлуНастроек)
222 |
223 | Попытка
224 | ЗаписьТекста = Новый ЗаписьТекста();
225 | ЗаписьТекста.Открыть(ПутьКФайлуНастроек,КодировкаТекста.UTF8);
226 | ЗаписьТекста.ЗаписатьСтроку(
227 | "{
228 | | ""Источники"":
229 | | [
230 | | {
231 | | ""Имя"" : ""Пример_База_Источник"",
232 | | ""АдресСервераSQL"" : """",
233 | | ""ИмяПользователяSQL"" : """",
234 | | ""ПарольПользователяSQL"" : """",
235 | | ""ИмяБазыДанныхSQL"" : """"
236 | | }
237 | | ],
238 | | ""Приемники"":
239 | | [
240 | | {
241 | | ""Имя"" : ""Пример_База_Применик1"",
242 | | ""ПутьКПлатформе1С"" : ""C:\\Program Files (x86)\\1cv8\\8.3.х.хххх\\bin\\1cv8.exe"",
243 | | ""ТипБазы"" : ""S"",
244 | | ""ВерсияCOMConnector"" : ""83"",
245 | | ""ИмяБазы"" : """",
246 | | ""АдресКластера"" : """",
247 | | ""ПортКластера"" : ""1541"",
248 | | ""ПортАгента"" : ""1540"",
249 | | ""ИмяПользователя"" : """",
250 | | ""ПарольПользователя"" : """",
251 | | ""АдресХранилища"" : """",
252 | | ""ИмяПользователяХранилища"" : """",
253 | | ""ПарольПользователяХранилища"" : """",
254 | | ""АдресСервераSQL"" : """",
255 | | ""ИмяПользователяSQL"" : """",
256 | | ""ПарольПользователяSQL"" : """",
257 | | ""ИмяБазыДанныхSQL"" : """"
258 | | },
259 | | {
260 | | ""Имя"" : ""Пример_База_Применик2"",
261 | | ""ПутьКПлатформе1С"" : ""C:\\Program Files (x86)\\1cv8\\8.3.х.хххх\\bin\\1cv8.exe"",
262 | | ""ТипБазы"" : ""S"",
263 | | ""ВерсияCOMConnector"" : ""83"",
264 | | ""ИмяБазы"" : """",
265 | | ""АдресКластера"" : """",
266 | | ""ПортКластера"" : ""1541"",
267 | | ""ПортАгента"" : ""1540"",
268 | | ""ИмяПользователя"" : """",
269 | | ""ПарольПользователя"" : """",
270 | | ""АдресХранилища"" : """",
271 | | ""ИмяПользователяХранилища"" : """",
272 | | ""ПарольПользователяХранилища"" : """",
273 | | ""АдресСервераSQL"" : """",
274 | | ""ИмяПользователяSQL"" : """",
275 | | ""ПарольПользователяSQL"" : """",
276 | | ""ИмяБазыДанныхSQL"" : """"
277 | | }
278 | | ],
279 | | ""ЭлектроннаяПочта"":
280 | | {
281 | | ""НастройкиSMTP"":
282 | | {
283 | | ""АдресSMTP"" : ""smtp.domen.ru"",
284 | | ""ПортSMTP"" : 465,
285 | | ""ПользовательSMTP"" : """",
286 | | ""ПарольSMTP"" : """",
287 | | ""ИспользоватьSSL"" : true
288 | | },
289 | | ""ПолучателиСообщений"":
290 | | {
291 | | ""АдресЭлектроннойПочтыПолучателя"" : ""myname@domen.ru;""
292 | | }
293 | | }
294 | |}");
295 | ЗаписьТекста.Закрыть();
296 | Исключение
297 | Возврат Ложь;
298 | Сообщить(ОписаниеОшибки());
299 | КонецПопытки;
300 |
301 | Возврат Истина;
302 |
303 | КонецФункции
304 |
305 | //******************************************************************
306 | Процедура ПриОткрытииФормы() Экспорт
307 |
308 | ФормаВыбораНастроек.Заголовок = "ПЕРЕЗАЛИВАТОР v1.0";
309 | ФормаВыбораНастроек.Высота = 480;
310 | ФормаВыбораНастроек.Ширина = 680;
311 |
312 | // ПолеСоСпискомИсточник
313 | Данные = Новый Соответствие; Сч = 0;
314 | Для Каждого СтрокаТаблицы Из ТаблицаБазаИсточник Цикл
315 | Данные.Вставить(СтрокаТаблицы.Имя, Сч); Сч = Сч + 1;
316 | КонецЦикла;
317 | ПолеФормы = ФормаВыбораНастроек.Элементы.Добавить("ПолеСоСпискомИсточник", "ПолеФормы", Неопределено);
318 | ПолеФормы.Заголовок = "База источник: ";
319 | ПолеФормы.Вид = ФормаВыбораНастроек.ВидПоляФормы.ПолеСоСписком;
320 | ПолеФормы.СписокВыбора = Данные;
321 | ПолеФормы.Значение = 0;
322 | ПолеФормы.УстановитьДействие(ЭтотОбъект, "ПриИзменении", "ПриИзменииПолеСоСпискомИсточник");
323 |
324 | // ПолеСоСпискомПриемник
325 | Данные = Новый Соответствие; Сч = 0;
326 | Для Каждого СтрокаТаблицы Из ТаблицаБазаПриемник Цикл
327 | Данные.Вставить(СтрокаТаблицы.Имя, Сч); Сч = Сч + 1;
328 | КонецЦикла;
329 | ПолеФормы = ФормаВыбораНастроек.Элементы.Добавить("ПолеСоСпискомПриемник", "ПолеФормы", Неопределено);
330 | ПолеФормы.Заголовок = "База назначения:";
331 | ПолеФормы.Вид = ФормаВыбораНастроек.ВидПоляФормы.ПолеСоСписком;
332 | ПолеФормы.СписокВыбора = Данные;
333 | ПолеФормы.Значение = 0;
334 | ПолеФормы.УстановитьДействие(ЭтотОбъект, "ПриИзменении", "ПриИзменииПолеСоСпискомПриемник");
335 |
336 | // Дата
337 | ПолеФормы = ФормаВыбораНастроек.Элементы.Добавить("Дата", "ПолеФормы", Неопределено);
338 | ПолеФормы.Заголовок = "Перезаливать на дату:";
339 | ПолеФормы.Вид = ФормаВыбораНастроек.ВидПоляФормы.ПолеКалендаря;
340 | ПолеФормы.Значение = ТекущаяДата();
341 |
342 | // ПолеЛог
343 | ПолеФормы = ФормаВыбораНастроек.Элементы.Добавить("ПолеЛог", "ПолеФормы", Неопределено);
344 | ПолеФормы.Вид = ФормаВыбораНастроек.ВидПоляФормы.ПолеНадписи;
345 | ПолеФормы.Заголовок = "Лог выполнения обработки:";
346 | ПолеФормы.ПоложениеЗаголовка = УправляемыйИнтерфейс.ПоложениеЗаголовка.Верх;
347 | ПолеФормы.Высота = 220;
348 | ПолеФормы.Закрепление = УправляемыйИнтерфейс.СтильЗакрепления.Верх;
349 |
350 | // ПолеПользователи
351 | ПолеФормы = ФормаВыбораНастроек.Элементы.Добавить("ПолеПользователи", "ТаблицаФормы", Неопределено);
352 | ПолеФормы.Заголовок = "ВНИМАНИЕ! Имеются активые соединения с базой приемником:";
353 | ПолеФормы.ПоложениеЗаголовка = УправляемыйИнтерфейс.ПоложениеЗаголовка.Верх;
354 | ПолеФормы.Закрепление = УправляемыйИнтерфейс.СтильЗакрепления.Заполнение;
355 |
356 | Группа = ФормаВыбораНастроек.Элементы.Добавить("ГруппаКнопки", "ГруппаФормы", Неопределено);
357 | Группа.Вид = УправляемыйИнтерфейс.ВидГруппыФормы.ОбычнаяГруппа;
358 | Группа.Закрепление = УправляемыйИнтерфейс.СтильЗакрепления.Низ;
359 |
360 | Кнопка = ФормаВыбораНастроек.Элементы.Добавить("КнопкаВыполнить", "КнопкаФормы", Группа);
361 | Кнопка.Заголовок = "Перезалить базу";
362 | Кнопка.УстановитьДействие(ЭтотОбъект, "Нажатие", "ПриНажатииНаКнопкуВыполнить");
363 |
364 | Кнопка = ФормаВыбораНастроек.Элементы.Добавить("КнопкаОбновить", "КнопкаФормы", Группа);
365 | Кнопка.Заголовок = "Обновить";
366 | Кнопка.УстановитьДействие(ЭтотОбъект, "Нажатие", "ПриНажатииНаКнопкуОбновить");
367 |
368 | Кнопка = ФормаВыбораНастроек.Элементы.Добавить("КнопкаЗакрыть", "КнопкаФормы", Группа);
369 | Кнопка.Заголовок = "Закрыть";
370 | Кнопка.УстановитьДействие(ЭтотОбъект, "Нажатие", "ПриНажатииНаКнопкуЗакрыть");
371 |
372 | УправлениеДиалогом(0);
373 |
374 | КонецПроцедуры
375 |
376 | //******************************************************************
377 | Процедура УправлениеДиалогом(Этап = 0)
378 |
379 | Если Этап = 0 Тогда
380 | ТекстКнопкиВыполнить = "Перезалить базу";
381 | ДоступностьНастроек = Истина;
382 | ДоступностьОбновитьОтмена = Ложь;
383 | ВидимостьПолеПользователи = Ложь;
384 | ИначеЕсли Этап = 1 Тогда
385 | Если ТаблицаПользователи <> Неопределено И ТаблицаПользователи.Количество() = 0 Тогда
386 | ТекстКнопкиВыполнить = "Перезалить базу";
387 | Иначе
388 | ТекстКнопкиВыполнить = "ЗАВЕРШИТЬ ВСЕ СЕАНСЫ И ПРОДОЛЖИТЬ";
389 | КонецЕсли;
390 | ДоступностьНастроек = Ложь;
391 | ДоступностьОбновитьОтмена = Истина;
392 | ВидимостьПолеПользователи = Истина;
393 | Иначе
394 | ТекстКнопкиВыполнить = "Перезалить базу";
395 | ДоступностьНастроек = Истина;
396 | ДоступностьОбновитьОтмена = Ложь;
397 | ВидимостьПолеПользователи = Ложь;
398 | КонецЕсли;
399 |
400 | ФормаВыбораНастроек.Элементы.Найти("ПолеСоСпискомИсточник").Доступность = ДоступностьНастроек;
401 | ФормаВыбораНастроек.Элементы.Найти("ПолеСоСпискомПриемник").Доступность = ДоступностьНастроек;
402 | ФормаВыбораНастроек.Элементы.Найти("Дата").Доступность = ДоступностьНастроек;
403 |
404 | ПолеПользователи = ФормаВыбораНастроек.Элементы.Найти("ПолеПользователи");
405 | ПолеЛог = ФормаВыбораНастроек.Элементы.Найти("ПолеЛог");
406 | Если ВидимостьПолеПользователи Тогда
407 | Если ТаблицаПользователи <> Неопределено Тогда
408 | ПровайдерТЗ = Новый Провайдер;
409 | ПровайдерТЗ.Источник = ТаблицаПользователи;
410 | ПолеПользователи.ПутьКДанным = ПровайдерТЗ;
411 | КонецЕсли;
412 | ПолеЛог.Видимость = Ложь;
413 | ПолеПользователи.Видимость = Истина;
414 | Иначе
415 | ПолеПользователи.Видимость = Ложь;
416 | ПолеЛог.Видимость = Истина;
417 | КонецЕсли;
418 |
419 | ГруппаКнопки = ФормаВыбораНастроек.Элементы.Найти("ГруппаКнопки");
420 | ГруппаКнопки.Элементы.Найти("КнопкаВыполнить").Заголовок = ТекстКнопкиВыполнить;
421 | ГруппаКнопки.Элементы.Найти("КнопкаОбновить").Доступность = ДоступностьОбновитьОтмена;
422 |
423 | КонецПроцедуры
424 |
425 | //******************************************************************
426 | Процедура ПриИзменииПолеСоСпискомИсточник() Экспорт
427 |
428 | ИндексБазыИсточник = ФормаВыбораНастроек.Элементы.Найти("ПолеСоСпискомИсточник").Значение;
429 |
430 | КонецПроцедуры
431 |
432 | //******************************************************************
433 | Процедура ПриИзменииПолеСоСпискомПриемник() Экспорт
434 |
435 | ИндексБазыПриемник = ФормаВыбораНастроек.Элементы.Найти("ПолеСоСпискомПриемник").Значение;
436 |
437 | КонецПроцедуры
438 |
439 | //******************************************************************
440 | Процедура ПриНажатииНаКнопкуЗакрыть() Экспорт
441 |
442 | ФормаВыбораНастроек.Закрыть();
443 |
444 | КонецПроцедуры
445 |
446 | //******************************************************************
447 | Процедура ПриНажатииНаКнопкуОбновить() Экспорт
448 |
449 | Если Не ПолучитьСписокАктивныхСеансов() Тогда
450 | УправляемыйИнтерфейс.СтандартныеДиалоги.Предупреждение("Не удалось проверить список активных пользователей базы приемника!",,"Ошибка!");
451 | Возврат;
452 | КонецЕсли;
453 | УправлениеДиалогом(1);
454 |
455 | КонецПроцедуры
456 |
457 | //******************************************************************
458 | Процедура ПриНажатииНаКнопкуВыполнить() Экспорт
459 |
460 | // Проверим, что все поля заполнены
461 | Если ИндексБазыИсточник = -1 Тогда
462 | УправляемыйИнтерфейс.СтандартныеДиалоги.Предупреждение("Не выбрана база источник!",,"Внимание!");
463 | Возврат;
464 | КонецЕсли;
465 | Если ИндексБазыПриемник = -1 Тогда
466 | УправляемыйИнтерфейс.СтандартныеДиалоги.Предупреждение("Не выбрана база приемник!",,"Внимание!");
467 | Возврат;
468 | КонецЕсли;
469 |
470 | // Проверим, есть ли активные сеансты с базой приемником
471 | ВыполнитьОбработку = Ложь;
472 | НетДоступаККонсолиКластера = Ложь;
473 | Если Не КонтрольАктивныхСеансовПройден Тогда
474 |
475 | Если Не ПолучитьСписокАктивныхСеансов() Тогда
476 | Ответ = УправляемыйИнтерфейс.СтандартныеДиалоги.Вопрос("Не удалось проверить список активных пользователей базы приемника! Продолжить?",РежимДиалогаВопрос.ДаНет,,,"Все равно продолжить операцию?");
477 | Если Ответ = КодВозвратаДиалога.Да Тогда
478 | НетДоступаККонсолиКластера = Истина;
479 | ВыполнитьОбработку = Истина;
480 | Иначе
481 | Возврат;
482 | КонецЕсли;
483 | КонецЕсли;
484 |
485 | Если Не НетДоступаККонсолиКластера Тогда
486 |
487 | Если ТаблицаПользователи = Неопределено Тогда
488 | Возврат;
489 | КонецЕсли;
490 |
491 | // Если есть активные соединения, покажим их
492 | Если ТаблицаПользователи.Количество() = 0 Тогда
493 | ВыполнитьОбработку = Истина;
494 | Иначе
495 | УправлениеДиалогом(1);
496 | КонтрольАктивныхСеансовПройден = Истина;
497 | КонецЕсли;
498 |
499 | КонецЕсли;
500 |
501 | Иначе
502 | ВыполнитьОбработку = Истина;
503 | КонецЕсли;
504 |
505 | // Можно выполнить обработку
506 | Если ВыполнитьОбработку Тогда
507 |
508 | Ответ = УправляемыйИнтерфейс.СтандартныеДиалоги.Вопрос("Вы уверены что хотите перезалить базу?",РежимДиалогаВопрос.ДаНет,,,"Последнее предупреждение!");
509 | Если Ответ = КодВозвратаДиалога.Да Тогда
510 |
511 | УправлениеДиалогом(0);
512 | Если ВыполнитьОбработку(НетДоступаККонсолиКластера) Тогда
513 | УправляемыйИнтерфейс.СтандартныеДиалоги.Предупреждение("Обработка выполнена успешно!",,"Успех!");
514 | Иначе
515 | УправляемыйИнтерфейс.СтандартныеДиалоги.Предупреждение("ОБРАБОТКА НЕ ВЫПОЛНЕНА!",,"ОШИБКА!");
516 | КонецЕсли;
517 |
518 | КонецЕсли;
519 | КонецЕсли;
520 |
521 | КонецПроцедуры
522 |
523 | //******************************************************************
524 | Функция ПолучитьСписокАктивныхСеансов()
525 |
526 | // База применик из таблицы
527 | БазаПриемник = ТаблицаБазаПриемник.Получить(ИндексБазыПриемник);
528 |
529 | // Получаем список сеансов
530 | Запуск1С = Новый ТУправлениеЗапуском1С();
531 | ЗаполнитьЗначенияСвойств(Запуск1С.ПараметрыЗапуска,БазаПриемник);
532 | ТаблицаПользователи = Запуск1С.ПолучитьСписокСеансов();
533 |
534 | Если ТаблицаПользователи = Неопределено Тогда
535 | Возврат Ложь;
536 | КонецЕсли;
537 |
538 | Возврат Истина;
539 |
540 | КонецФункции
541 |
542 | //******************************************************************
543 | Функция ВыполнитьТестНастроек()
544 |
545 | //
546 | БылиОшибки = Ложь;
547 |
548 | // Начало выполнения обработки
549 | СтрокаДействие = "Начало выполнения тестирвоания настроек:";
550 | Логирование.ЗаписатьСтрокуЛога(СтрокаДействие);
551 | Логирование.УвеличитьУровень();
552 |
553 | // Создадим объекты
554 | УправлениеMSSQL = Новый УправлениеMSSQL();
555 | Запуск1С = Новый ТУправлениеЗапуском1С();
556 |
557 | // Цикл по всем базам источникам
558 | Для Каждого БазаИсточник ИЗ ТаблицаБазаИсточник Цикл
559 |
560 | Логирование.ЗаписатьСтрокуЛога();
561 | Логирование.ЗаписатьСтрокуЛога("Тест БД Источника: " + БазаИсточник.Имя);
562 |
563 | УправлениеMSSQL.ОчиститьПараметры();
564 | ЗаполнитьЗначенияСвойств(УправлениеMSSQL.ПараметрыПодключения,БазаИсточник);
565 |
566 | // Получим структуру файлов БД Источника
567 | // Если структура файлов получена, считаем, что параметры подключения заданы корректно
568 | ТаблицаФайловБД = УправлениеMSSQL.ПолучитьСтруктуруФайловБД();
569 | Если ТаблицаФайловБД = Неопределено Тогда
570 | СтрокаДействие = "Получить структуру файлов БД Источинка - ОШИБКА: " + УправлениеMSSQL.ТекстОшибки;
571 | БылиОшибки = Истина;
572 | ИначеЕсли ТаблицаФайловБД.Количество() = 0 Тогда
573 | СтрокаДействие = "Получить структуру файлов БД Источинка - ОШИБКА: Список файлов пуст!";
574 | БылиОшибки = Истина;
575 | Иначе
576 | СтрокаДействие = "Получить структуру файлов БД Источинка - УСПЕШНО";
577 | КонецЕсли;
578 | Логирование.ЗаписатьСтрокуЛога(СтрокаДействие);
579 |
580 | КонецЦикла;
581 |
582 | // Цикл по всем базам приемникам
583 | Для Каждого БазаПриемник ИЗ ТаблицаБазаПриемник Цикл
584 |
585 | Логирование.ЗаписатьСтрокуЛога();
586 | Логирование.ЗаписатьСтрокуЛога("Тест БД Приемника: " + БазаПриемник.Имя);
587 |
588 | УправлениеMSSQL.ОчиститьПараметры();
589 | ЗаполнитьЗначенияСвойств(УправлениеMSSQL.ПараметрыПодключения,БазаПриемник);
590 |
591 | // Получим структуру файлов БД Приемника
592 | // Если структура файлов получена, считаем, что параметры подключения заданы корректно
593 | ТаблицаФайловБД = УправлениеMSSQL.ПолучитьСтруктуруФайловБД();
594 | Если ТаблицаФайловБД = Неопределено Тогда
595 | СтрокаДействие = "Получить структуру файлов БД Приемника - ОШИБКА: " + УправлениеMSSQL.ТекстОшибки;
596 | БылиОшибки = Истина;
597 | ИначеЕсли ТаблицаФайловБД.Количество() = 0 Тогда
598 | СтрокаДействие = "Получить структуру файлов БД Приемника - ОШИБКА: Список файлов пуст!";
599 | БылиОшибки = Истина;
600 | Иначе
601 | СтрокаДействие = "Получить структуру файлов БД Приемника - УСПЕШНО";
602 | КонецЕсли;
603 | Логирование.ЗаписатьСтрокуЛога(СтрокаДействие);
604 |
605 | Запуск1С.ОчиститьПараметры();
606 | ЗаполнитьЗначенияСвойств(Запуск1С.ПараметрыЗапуска,БазаПриемник);
607 |
608 | // Получим список активных соединений БД Приемника
609 | // Если список сеансов получен, считаем, что настройки базы заданы корректно
610 | ТаблицаСеансов = Запуск1С.ПолучитьСписокСеансов();
611 | Если ТаблицаСеансов = Неопределено Тогда
612 | СтрокаДействие = "Получить список сеансов БД Приемника - ОШИБКА: " + Запуск1С.ТекстОшибки;
613 | БылиОшибки = Истина;
614 | Иначе
615 | СтрокаДействие = "Получить список сеансов БД Приемника - УСПЕШНО";
616 | КонецЕсли;
617 | Логирование.ЗаписатьСтрокуЛога(СтрокаДействие);
618 |
619 | // Выполним очистку локального кэша хранилища конфигурации
620 | // Если получилось очистить, считаем, что настройки хранилища и настройки 1С:Предприятие заданы корректно
621 | Если ЗначениеЗаполнено(Запуск1С.ПараметрыЗапуска.АдресХранилища) Тогда
622 | Если Запуск1С.ВыполнитьОчисткуЛокальногоКешаХранилища() Тогда
623 | СтрокаДействие = "Очистить локальный кэш хранилища конфигурации - УСПЕШНО";
624 | Иначе
625 | СтрокаДействие = "Очистить локальный кэш хранилища конфигурации - ОШИБКА: " + Запуск1С.ТекстОшибки;
626 | БылиОшибки = Истина;
627 | КонецЕсли;
628 | Логирование.ЗаписатьСтрокуЛога(СтрокаДействие);
629 | КонецЕсли;
630 |
631 | КонецЦикла;
632 |
633 | СтрокаДействие = "Завершение выполнения обработки.";
634 | Логирование.ЗаписатьСтрокуЛога();
635 | Логирование.УменьшитьУровень();
636 | Логирование.ЗаписатьСтрокуЛога(СтрокаДействие);
637 |
638 | Сообщить("--------------------------------------------");
639 | Сообщить("Рзультат тестирования: " + ?(БылиОшибки,"БЫЛИ ОШИБКИ!","УСПЕШНО!"));
640 | Сообщить("--------------------------------------------");
641 |
642 | Возврат Не БылиОшибки;
643 |
644 | КонецФункции
645 |
646 | //******************************************************************
647 | Функция ВыполнитьОбработку(НетДоступаККонсолиКластера=Ложь)
648 |
649 | //
650 | БылиОшибки = Ложь;
651 | БазаВосстановлена = Ложь;
652 | ПолеЛог = ФормаВыбораНастроек.Элементы.Найти("ПолеЛог");
653 | ПолеЛог.Видимость = Истина;
654 |
655 | // Начало выполнения обработки
656 | СтрокаДействие = "Начало выполнения обработки.";
657 | Логирование.ЗаписатьСтрокуЛога(СтрокаДействие);
658 | Логирование.УвеличитьУровень();
659 | ПолеЛог.Значение = СтрокаДействие;
660 |
661 | // База применик из таблицы
662 | БазаПриемник = ТаблицаБазаПриемник.Получить(ИндексБазыПриемник);
663 | Запуск1С = Новый ТУправлениеЗапуском1С();
664 | ЗаполнитьЗначенияСвойств(Запуск1С.ПараметрыЗапуска,БазаПриемник);
665 |
666 | // Завершим соединения, если необходимо
667 | Если Не НетДоступаККонсолиКластера Тогда
668 | Если ТаблицаПользователи.Количество() > 0 Тогда
669 | Если Запуск1С.ЗавершитьРаботуПользователей() Тогда
670 | СтрокаДействие = "Завершить работу пользователей - УСПЕШНО";
671 | Иначе
672 | СтрокаДействие = "Завершить работу пользователей - ОШИБКА: " + Запуск1С.ТекстОшибки;
673 | БылиОшибки = Истина;
674 | КонецЕсли;
675 | Логирование.ЗаписатьСтрокуЛога(СтрокаДействие);
676 | ПолеЛог.Значение = ПолеЛог.Значение + Символы.ПС + СтрокаДействие;
677 | КонецЕсли;
678 | КонецЕсли;
679 |
680 | // Установим блокировку начала сеансов
681 | Если Не НетДоступаККонсолиКластера Тогда
682 | Если Не БылиОшибки Тогда
683 | Если Запуск1С.УстановитьБлокировкуНачалаСеансов() Тогда
684 | СтрокаДействие = "Установить блокировку начала сеансов - УСПЕШНО";
685 | Иначе
686 | СтрокаДействие = "Установить блокировку начала сеансов - ОШИБКА: " + Запуск1С.ТекстОшибки;
687 | БылиОшибки = Истина;
688 | КонецЕсли;
689 | Логирование.ЗаписатьСтрокуЛога(СтрокаДействие);
690 | ПолеЛог.Значение = ПолеЛог.Значение + Символы.ПС + СтрокаДействие;
691 | КонецЕсли;
692 | КонецЕсли;
693 | ВыполнитьСборкуМусора();
694 |
695 | // База источник из таблицы
696 | Если Не БылиОшибки Тогда
697 | БазаИсточник = ТаблицаБазаИсточник.Получить(ИндексБазыИсточник);
698 | УправлениеMSSQL = Новый УправлениеMSSQL();
699 | ЗаполнитьЗначенияСвойств(УправлениеMSSQL.ПараметрыПодключения,БазаИсточник);
700 | КонецЕсли;
701 |
702 | // Получим список файлов для восстановления
703 | Если Не БылиОшибки Тогда
704 | ТекДата = ФормаВыбораНастроек.Элементы.Найти("Дата").Значение;
705 | МассивФайлов = УправлениеMSSQL.ПолучитьСписокФайловДляВосстановленияБД(КонецДня(ТекДата));
706 | Если МассивФайлов <> Неопределено Тогда
707 | СтрокаДействие = "Получить список файлов для восстановления БД - УСПЕШНО";
708 | Логирование.ЗаписатьСтрокуЛога(СтрокаДействие);
709 | ПолеЛог.Значение = ПолеЛог.Значение + Символы.ПС + СтрокаДействие;
710 | Для Сч = 0 По МассивФайлов.Количество()-1 Цикл
711 | СтрокаДействие = " Файл: " + МассивФайлов.Получить(Сч);
712 | Логирование.ЗаписатьСтрокуЛога(СтрокаДействие);
713 | ПолеЛог.Значение = ПолеЛог.Значение + Символы.ПС + СтрокаДействие;
714 | КонецЦикла;
715 | Иначе
716 | СтрокаДействие = "Получить список файлов для восстановления БД - ОШИБКА: " + УправлениеMSSQL.ТекстОшибки;
717 | Логирование.ЗаписатьСтрокуЛога(СтрокаДействие);
718 | ПолеЛог.Значение = ПолеЛог.Значение + Символы.ПС + СтрокаДействие;
719 | БылиОшибки = Истина;
720 | КонецЕсли;
721 | КонецЕсли;
722 |
723 | // Получим структуру файлов БД Источника
724 | Если Не БылиОшибки Тогда
725 | ТаблицаФайловБДИсточника = УправлениеMSSQL.ПолучитьСтруктуруФайловБД();
726 | Если ТаблицаФайловБДИсточника = Неопределено Тогда
727 | СтрокаДействие = "Получить структуру файлов БД Источинка - ОШИБКА: " + УправлениеMSSQL.ТекстОшибки;
728 | БылиОшибки = Истина;
729 | ИначеЕсли ТаблицаФайловБДИсточника.Количество() = 0 Тогда
730 | СтрокаДействие = "Получить структуру файлов БД Источинка - ОШИБКА: Список файлов пуст!";
731 | БылиОшибки = Истина;
732 | Иначе
733 | СтрокаДействие = "Получить структуру файлов БД Источинка - УСПЕШНО";
734 | КонецЕсли;
735 | Логирование.ЗаписатьСтрокуЛога(СтрокаДействие);
736 | ПолеЛог.Значение = ПолеЛог.Значение + Символы.ПС + СтрокаДействие;
737 | КонецЕсли;
738 |
739 | // База применик из таблицы
740 | Если Не БылиОшибки Тогда
741 | УправлениеMSSQL = Новый УправлениеMSSQL();
742 | ЗаполнитьЗначенияСвойств(УправлениеMSSQL.ПараметрыПодключения,БазаПриемник);
743 | КонецЕсли;
744 |
745 | // Восстановим базу
746 | Если Не БылиОшибки Тогда
747 | Если УправлениеMSSQL.ВосстановитьИзРезервнойКопииБД(МассивФайлов,ТаблицаФайловБДИсточника) Тогда
748 | СтрокаДействие = "Восстановить из резервной копии БД - УСПЕШНО";
749 | БазаВосстановлена = Истина;
750 | Иначе
751 | СтрокаДействие = "Восстановить из резервной копии БД - ОШИБКА: " + УправлениеMSSQL.ТекстОшибки;
752 | БылиОшибки = Истина;
753 | КонецЕсли;
754 | Логирование.ЗаписатьСтрокуЛога(СтрокаДействие);
755 | ПолеЛог.Значение = ПолеЛог.Значение + Символы.ПС + СтрокаДействие;
756 | КонецЕсли;
757 |
758 | // Переведем в простую модель восстановления
759 | Если Не БылиОшибки Тогда
760 | Если УправлениеMSSQL.ИзменитьМодельВосстановленияБД("SIMPLE") Тогда
761 | СтрокаДействие = "Перевести в простую модель восстановления - УСПЕШНО";
762 | Иначе
763 | СтрокаДействие = "Перевести в простую модель восстановления - ОШИБКА: " + УправлениеMSSQL.ТекстОшибки;
764 | БылиОшибки = Истина;
765 | КонецЕсли;
766 | Логирование.ЗаписатьСтрокуЛога(СтрокаДействие);
767 | ПолеЛог.Значение = ПолеЛог.Значение + Символы.ПС + СтрокаДействие;
768 | КонецЕсли;
769 |
770 | // Запустим сжатие лог-файла
771 | Если Не БылиОшибки Тогда
772 | Если УправлениеMSSQL.СжатьФайлыБД("LOG") Тогда
773 | СтрокаДействие = "Сжать файл логов - УСПЕШНО";
774 | Иначе
775 | СтрокаДействие = "Сжать файл логов - ОШИБКА: " + УправлениеMSSQL.ТекстОшибки;
776 | БылиОшибки = Истина;
777 | КонецЕсли;
778 | Логирование.ЗаписатьСтрокуЛога(СтрокаДействие);
779 | ПолеЛог.Значение = ПолеЛог.Значение + Символы.ПС + СтрокаДействие;
780 | КонецЕсли;
781 |
782 | // Если база была подключена к хранилищу, необходимо переподключится
783 | Если ЗначениеЗаполнено(БазаПриемник.АдресХранилища) Тогда
784 |
785 | // Отключимся от хранилища базы источника
786 | Если Не БылиОшибки Тогда
787 | Если Запуск1С.ОтключитьКонфигурациюОтХранилища() Тогда
788 | СтрокаДействие = "Отключиться от хранилища - УСПЕШНО";
789 | Иначе
790 | СтрокаДействие = "Отключиться от хранилища - ОШИБКА: " + УправлениеMSSQL.ТекстОшибки;
791 | БылиОшибки = Истина;
792 | КонецЕсли;
793 | Логирование.ЗаписатьСтрокуЛога(СтрокаДействие);
794 | ПолеЛог.Значение = ПолеЛог.Значение + Символы.ПС + СтрокаДействие;
795 | КонецЕсли;
796 |
797 | // Подключимся к старому хранилищу
798 | Если Не БылиОшибки Тогда
799 | Если Запуск1С.ПодключитьКонфигурациюКХранилищу() Тогда
800 | СтрокаДействие = "Подключиться к хранилищу - УСПЕШНО";
801 | Иначе
802 | СтрокаДействие = "Подключиться к хранилищу - ОШИБКА: " + УправлениеMSSQL.ТекстОшибки;
803 | БылиОшибки = Истина;
804 | КонецЕсли;
805 | Логирование.ЗаписатьСтрокуЛога(СтрокаДействие);
806 | ПолеЛог.Значение = ПолеЛог.Значение + Символы.ПС + СтрокаДействие;
807 | КонецЕсли;
808 |
809 | // Обновим конфигурацию из хранилища
810 | Если Не БылиОшибки Тогда
811 | Если Запуск1С.ОбновитьКонфигурациюИзХранилища() Тогда
812 | СтрокаДействие = "Обновить конфигурацию из хранилища - УСПЕШНО";
813 | Иначе
814 | СтрокаДействие = "Обновить конфигурацию из хранилища - ОШИБКА: " + УправлениеMSSQL.ТекстОшибки;
815 | БылиОшибки = Истина;
816 | КонецЕсли;
817 | Логирование.ЗаписатьСтрокуЛога(СтрокаДействие);
818 | ПолеЛог.Значение = ПолеЛог.Значение + Символы.ПС + СтрокаДействие;
819 | КонецЕсли;
820 |
821 | // Обновить конфигурацию базы данных
822 | Если Не БылиОшибки Тогда
823 | Если Запуск1С.ОбновитьКонфигурациюБазыДанных() Тогда
824 | СтрокаДействие = "Обновить конфигурацию базы данных - УСПЕШНО";
825 | Иначе
826 | СтрокаДействие = "Обновить конфигурацию базы данных - ОШИБКА: " + УправлениеMSSQL.ТекстОшибки;
827 | БылиОшибки = Истина;
828 | КонецЕсли;
829 | Логирование.ЗаписатьСтрокуЛога(СтрокаДействие);
830 | ПолеЛог.Значение = ПолеЛог.Значение + Символы.ПС + СтрокаДействие;
831 | КонецЕсли;
832 |
833 | КонецЕсли;
834 |
835 | // Снимем блокировку начала сеансов
836 | Если Не НетДоступаККонсолиКластера Тогда
837 | Если Запуск1С.СнятьБлокировкуНачалаСеансов(Ложь) Тогда
838 | СтрокаДействие = "Снять блокировку начала сеансов - УСПЕШНО";
839 | Иначе
840 | СтрокаДействие = "Снять блокировку начала сеансов - ОШИБКА: " + Запуск1С.ТекстОшибки;
841 | БылиОшибки = Истина;
842 | КонецЕсли;
843 | Логирование.ЗаписатьСтрокуЛога(СтрокаДействие);
844 | ПолеЛог.Значение = ПолеЛог.Значение + Символы.ПС + СтрокаДействие;
845 | КонецЕсли;
846 | ВыполнитьСборкуМусора();
847 |
848 | // Отправляем эклектронное сообщение с файлом лога во вложении
849 | Если БазаВосстановлена И ЗначениеЗаполнено(УправлениеЭП.УчетнаяЗаписьЭП.АдресSMTP) Тогда
850 |
851 | СтруктураСообщения = УправлениеЭП.СтруктураСообщения;
852 | СтруктураСообщения.ТемаСообщения = "### Перезалита база данных. Источник - """ + БазаИсточник.Имя + """, Назначение - """ + БазаПриемник.Имя + """";
853 | Если БылиОшибки Тогда
854 | СтруктураСообщения.ТекстСообщения = "ВНИМАНИЕ! " + Символы.ПС +
855 | СтруктураСообщения.ТемаСообщения + Символы.ПС +
856 | "Но не все операции были выполнены. Смотрите лог-файл во вложении.";
857 | Иначе
858 | СтруктураСообщения.ТекстСообщения = СтруктураСообщения.ТемаСообщения + Символы.ПС +
859 | "Все операции были выполнены успешно.";
860 | КонецЕсли;
861 |
862 | // Часть имеющегося лога добавим в письмо
863 | ИмяВременногоФайла = ПолучитьИмяВременногоФайла("txt");
864 | КопироватьФайл(Логирование.ИмяФайлаЛога,ИмяВременногоФайла);
865 | СтруктураСообщения.Вложения = ИмяВременногоФайла;
866 |
867 | // Отправим сообщение
868 | Если УправлениеЭП.ОтправитьСообщение() Тогда
869 | СтрокаДействие = "Отправить электорнное сообщение - УСПЕШНО. Адреса: " + СтруктураСообщения.АдресЭлектроннойПочтыПолучателя;
870 | Иначе
871 | СтрокаДействие = "Отправить электорнное сообщение - ОШИБКА: " + УправлениеЭП.ТекстОшибки;
872 | БылиОшибки = Истина;
873 | КонецЕсли;
874 | Логирование.ЗаписатьСтрокуЛога(СтрокаДействие);
875 | ПолеЛог.Значение = ПолеЛог.Значение + Символы.ПС + СтрокаДействие;
876 |
877 | УдалитьФайлы(ИмяВременногоФайла);
878 |
879 | КонецЕсли;
880 |
881 | СтрокаДействие = "Завершение выполнения обработки.";
882 | Логирование.УменьшитьУровень();
883 | Логирование.ЗаписатьСтрокуЛога(СтрокаДействие);
884 | ПолеЛог.Значение = ПолеЛог.Значение + Символы.ПС + СтрокаДействие;
885 |
886 | Возврат Не БылиОшибки;
887 |
888 | КонецФункции
889 |
890 | //******************************************************************
891 | Инициализация();
892 |
--------------------------------------------------------------------------------
/Perezalivator_Run.bat:
--------------------------------------------------------------------------------
1 | @echo off
2 |
3 | set dir=%CD%
4 | set oscriptrun=oscript.exe
5 |
6 | %oscriptrun% "%dir%\Perezalivator.os" "%dir%\Perezalivator_Params.json" "%dir%\Mail.json" %*
7 |
--------------------------------------------------------------------------------
/Perezalivator_Run_Test.bat:
--------------------------------------------------------------------------------
1 | @echo off
2 |
3 | set dir=%CD%
4 |
5 | call "%dir%\Perezalivator_Run.bat" -test
6 |
7 | pause
8 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Перезаливатор
2 | Приложение для "перезаливки" баз данных 1С:Предприятия.
3 |
4 | Реализовано на OneScript (http://oscript.io). Для работы необходим OneScript версии 1.0.20 или выше.
5 |
6 | ## Описание
7 | Под словом "перезалить" понимается процедура восстановления одной базы данных из резервных копий другой базы данных.
8 | Например, если необходимо загрузить данные из базы продуктива в тестовую или разработочную.
9 |
10 | Перезаливатор позволяет максимально автоматизировать процесс "перезаливки" баз данных 1С:Предприятия.
11 |
12 | Имеется GUI-интерфейс для выбора базы-приемника и базы-назначения, а также окно с выводом результата.
13 |
14 |
15 |
16 | ## Установка
17 |
18 | 1. Скачать файл "Distr\Perezalivator-<версия>.ospx"
19 | 2. Запустить установку с помощью пакетного менеджера opm
20 |
21 | Установка:
22 | ``` cmd
23 | opm install -f <Путь к файлу Perezalivator-<версия>.ospx>
24 | ```
25 |
26 | Можно также воспользоваться командным файлом "install.bat" из директории "Distr"
27 |
28 | ### Зависимости
29 |
30 | Зависит от:
31 | * Библиотеки **json**: https://github.com/oscript-library/json
32 | * Библиотеки **gui**: https://github.com/oscript-library/oscript-simple-gui
33 | * Библиотеки **TMSSQL**: https://github.com/Tavalik/TMSSQL
34 | * Библиотеки **TRun1C**: https://github.com/Tavalik/TRun1C
35 | * Библиотеки **TMail**: https://github.com/Tavalik/TMail
36 | * Библиотеки **TLog**: https://github.com/Tavalik/TLog
37 |
38 | (все зависимые библиотеки устанавливаются автоматически при условии использования пакетного менеджера opm)
39 |
40 | ## Описание и работа с приложением
41 |
42 | Запуск приложения осуществляется запуском файла **Perezalivator_Run.bat**.
43 | При первом запуске в текущем каталоге будет создан пустой файл настроек **Perezalivator_Params.json**.
44 |
45 | Необходимо заполнить все параметры, описав возможные базы-источники, базы-назначения и параметры для отправки электронных писем.
46 |
47 | Проверить корректность введенных настроек можно запустив файл **Perezalivator_Run_Test.bat**. Перезаливатор будет запущен в режиме тестирования настроек.
48 |
49 | При следующем запуске файла **Perezalivator_Run.bat** откроется окно, в котором необходимо выбрать базу-источник
50 |
51 |
52 |
53 | и базу-назначения.
54 |
55 |
56 |
57 | Если необходимо, можно указать дату, на которую необходимо получить данные (всегда используется конец дня).
58 |
59 | После указания всех исходных параметров, перезаливатор начнет работу по следующему алгоритму:
60 |
61 | 1. Установка блокировки регламентных заданий и начала сеансов в базе-приемнике
62 | 2. Завершение активных сеансов (спустя несколько минут) в базе-приемнике
63 | 3. Расчет последовательности файлов резервных копий для **базы-источника** для восстановления на указанную дату
64 | 4. Восстановление базы-приемника по найденной последовательности файлов
65 | 5. Перевод базы-приемника в простую модель восстановления
66 | 6. Сжатие файлов журнала транзакций базы-приемника
67 | 7. Отключение базы-приемника от хранилища
68 | 8. Подключение базы-приемника к хранилищу
69 | 9. Обновление конфигурации базы данных базы-приемника
70 | 10. Снятие блокировки регламентных заданий и начала сеансов базы-приемника
71 | 11. Уведомление о результате по электронной почте
72 |
73 | Если в базе-приемнике присутствуют активные соединения, будет показана таблица со всеми соединениями, а также будет предоставлена возможность завершить все активные сеансы.
74 |
75 |
76 |
77 | Отработав, Перезаливатор выдаст соответствующее сообщение (или сообщение об ошибке), а также отправит сообщение о результате работы на электронную почту.
78 |
79 |
80 |
--------------------------------------------------------------------------------
/Screenshots/Perezalivator1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Tavalik/Perezalivator/3c58143746382857fc53a6be547debb7f30f8980/Screenshots/Perezalivator1.png
--------------------------------------------------------------------------------
/Screenshots/Perezalivator2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Tavalik/Perezalivator/3c58143746382857fc53a6be547debb7f30f8980/Screenshots/Perezalivator2.png
--------------------------------------------------------------------------------
/Screenshots/Perezalivator3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Tavalik/Perezalivator/3c58143746382857fc53a6be547debb7f30f8980/Screenshots/Perezalivator3.png
--------------------------------------------------------------------------------
/Screenshots/Perezalivator4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Tavalik/Perezalivator/3c58143746382857fc53a6be547debb7f30f8980/Screenshots/Perezalivator4.png
--------------------------------------------------------------------------------
/Screenshots/Perezalivator5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Tavalik/Perezalivator/3c58143746382857fc53a6be547debb7f30f8980/Screenshots/Perezalivator5.png
--------------------------------------------------------------------------------
/packagedef:
--------------------------------------------------------------------------------
1 | Описание.Имя("Perezalivator")
2 | .Версия("2018.05.18")
3 | .Автор("Onyanov Vitaliy")
4 | .АдресАвтора("tavalik@mail.ru")
5 | .Описание("Приложение для ""перезаливки"" баз данных 1С:Предприятия")
6 | .ВерсияСреды("1.0.20")
7 | .ЗависитОт("json")
8 | .ЗависитОт("gui")
9 | .ЗависитОт("TLog")
10 | .ЗависитОт("TRun1C")
11 | .ЗависитОт("TMSSQL")
12 | .ЗависитОт("TMail")
13 | .ВключитьФайл("Perezalivator.ico")
14 | .ВключитьФайл("Perezalivator.os")
15 | .ВключитьФайл("Perezalivator_Run.bat")
16 | .ВключитьФайл("Perezalivator_Run_Test.bat")
17 | .ВключитьФайл("README.md")
18 | ;
--------------------------------------------------------------------------------