├── .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 | Скриншот1 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 | Скриншот2 52 | 53 | и базу-назначения. 54 | 55 | Скриншот3 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 | Скриншот4 76 | 77 | Отработав, Перезаливатор выдаст соответствующее сообщение (или сообщение об ошибке), а также отправит сообщение о результате работы на электронную почту. 78 | 79 | Скриншот5 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 | ; --------------------------------------------------------------------------------