Advertisement
Guest User

UPP1c

a guest
May 2nd, 2023
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 81.49 KB | None | 0 0
  1. #Использовать logos
  2. #Использовать v8runner
  3.  
  4. Перем Лог;
  5. Перем Каталоги;
  6. Перем НастройкиПодключения;
  7. Перем Аутентификация;
  8. Перем ИнтервалыОжидания;
  9.  
  10. //////////////////////////////////////////////////////////////////////////////////////
  11. // Инициализация
  12.  
  13. // Инициализация параметров
  14. Функция Инициализировать()
  15.  
  16. СистемнаяИнформация = Новый СистемнаяИнформация();
  17. КаталогTEMP = СистемнаяИнформация.ПолучитьПеременнуюСреды("TEMP");
  18. КаталогAPPDATA = СистемнаяИнформация.ПолучитьПеременнуюСреды("APPDATA");
  19.  
  20. Каталоги = Новый Структура();
  21. Каталоги.Вставить("КаталогФайловОбновления", ОбъединитьПути(КаталогAPPDATA, "1C\1Cv8\tmplts\1c")); // Каталог с файлами обновления конфигураций.
  22. Каталоги.Вставить("КаталогВременныхФайлов", ОбъединитьПути(КаталогTEMP, "AutoUpdateIB")); // Каталог для хранения временных файлов.
  23. Каталоги.Вставить("КаталогРезервныхКопий", ОбъединитьПути(КаталогTEMP, "AutoUpdateIB\DumpIB")); // Каталог для хранения резевных копий и файлов дампа.
  24.  
  25. НастройкиПодключения = Новый Структура();
  26. НастройкиПодключения.Вставить("СерверПроверкиОбновлений", "downloads.1c.ru"); // Адрес сервера для проверки наличия обновлений (открытая часть).
  27. НастройкиПодключения.Вставить("ПутьКФайлуПроверкиОбновлений", "/ipp/ITSREPV/V8Update/Configs"); // Путь к файлу проверки обновлений на сервере.
  28. НастройкиПодключения.Вставить("СерверОбновлений", "downloads.v8.1c.ru"); //Адрес сервера обновлений (закрытая часть).
  29. НастройкиПодключения.Вставить("ПутьКФайлуОбновлений", "/tmplts"); // Путь к файлу обновлений на сервере.
  30.  
  31. Аутентификация = Новый Структура();
  32. Аутентификация.Вставить("Пользователь", ""); // Имя пользователя для загрузки обновлений.
  33. Аутентификация.Вставить("Пароль", ""); // Пароль пользователя для загрузки обновлений.
  34.  
  35. ИнтервалыОжидания = Новый Структура();
  36. ИнтервалыОжидания.Вставить("ЗавершениеРаботыПользователей", 900); // Максимальный интервал ожидания завершения сеансов пользователей.
  37. ИнтервалыОжидания.Вставить("ЗавершениеСеансовФайловойИБ", 60); // Максимальный интервал ожидания завершения сеанса файловой информационной базы.
  38. ИнтервалыОжидания.Вставить("ЗавершениеСеансовСервернойИБ", 2); // Интервал ожидания завершения сеанса клиент-серверной информационной базы.
  39.  
  40.  
  41. //////////////////////////////////////////////////////////////////////////////////////
  42. // Пример
  43.  
  44. // Бухгалтерия предприятия, редакция 3.0
  45. ПараметрыОбновленияКонфигурации = ПолучитьПараметрыОбновленияКонфигурации();
  46. Если ПараметрыОбновленияКонфигурации <> Неопределено Тогда
  47.  
  48. ПараметрыПодключения = ПолучитьПараметрыПодключения(,"\\server\1C base\InfoBase 8.3 (Accounting 3.0)",,,,"Иванов И.И.","Password");
  49. ОбновитьИнформационнуюБазу(ПараметрыОбновленияКонфигурации, ПараметрыПодключения);
  50.  
  51. ПараметрыПодключения = ПолучитьПараметрыПодключения(,,"Server","Base1C");
  52. ОбновитьИнформационнуюБазу(ПараметрыОбновленияКонфигурации, ПараметрыПодключения);
  53.  
  54. КонецЕсли;
  55.  
  56. // Зарплата и управление персоналом, редакция 3.0
  57. ПараметрыОбновленияКонфигурации = ПолучитьПараметрыОбновленияКонфигурации("HRM", "3.0");
  58. Если ПараметрыОбновленияКонфигурации <> Неопределено Тогда
  59.  
  60. ПараметрыПодключения = ПолучитьПараметрыПодключения(,"\\server\1C base\InfoBase 8.3 (HRM 3.0)",,,,"Иванов И.И.","Password");
  61. ОбновитьИнформационнуюБазу(ПараметрыОбновленияКонфигурации, ПараметрыПодключения);
  62.  
  63. КонецЕсли;
  64.  
  65. КонецФункции
  66.  
  67.  
  68. ///////////////////////////////////////////////////////////////////////////////
  69. // Получение параметров конфигурации
  70.  
  71. // Загружает файл со списком обновлений с сервера проверки обновлений для конфигурации.
  72. // Анализирует полученный файл, собирает сведения о версиях.
  73. //
  74. // Параметры:
  75. // ТипКонфигурации - Строка - Краткое наименование конфигурации (Accounting - бухгалтерия, HRM - ЗУП ...).
  76. // ВерсияРелиза - Строка - Версия релиза.
  77. // ВерсияПлатформы - Строка - Версия платформы (82, 83).
  78. //
  79. // Возвращаемое значение:
  80. // Структура, Неопределено - Параметры обновления конкретной конфигурации, неопределено в случае ошибки.
  81. //
  82. Функция ПолучитьПараметрыОбновленияКонфигурации(ТипКонфигурации = "Accounting",
  83. ВерсияРелиза = "30",
  84. ВерсияПлатформы = "83")
  85.  
  86. Лог.Информация("======================================================================");
  87. Лог.Информация(СтрШаблон(НСтр("ru = 'Конфигурация %1, релиз %2, платформа %3.'"),
  88. ТипКонфигурации, ВерсияРелиза, ВерсияПлатформы));
  89. Лог.Информация("======================================================================");
  90.  
  91. ПараметрыОбновленияКонфигурации = Новый Структура();
  92. ПараметрыОбновленияКонфигурации.Вставить("ТипКонфигурации", ТипКонфигурации);
  93. ПараметрыОбновленияКонфигурации.Вставить("ВерсияРелиза", ВерсияРелиза);
  94. ПараметрыОбновленияКонфигурации.Вставить("ВерсияПлатформы", ВерсияПлатформы);
  95.  
  96. РезультатВыполнения = ПроверитьКорректностьПараметровОбновленияКонфигурациия(ПараметрыОбновленияКонфигурации);
  97. Если Не РезультатВыполнения Тогда
  98. Возврат Неопределено;
  99. КонецЕсли;
  100.  
  101. РезультатВыполнения = ПолучитьСпискиОбновленияКонфигурациии(ПараметрыОбновленияКонфигурации);
  102. Если Не РезультатВыполнения Тогда
  103. Возврат Неопределено;
  104. КонецЕсли;
  105.  
  106. МассивОбновлений = ПроанализироватьСпискиОбновленияКонфигурации(ПараметрыОбновленияКонфигурации);
  107. Если МассивОбновлений = Неопределено Тогда
  108. Возврат Неопределено;
  109. КонецЕсли;
  110. ПараметрыОбновленияКонфигурации.Вставить("МассивОбновлений", МассивОбновлений);
  111.  
  112. Возврат ПараметрыОбновленияКонфигурации;
  113.  
  114. КонецФункции
  115.  
  116. // Осуществляет проверку корректности заполнения параметров конфигурации
  117. //
  118. // Параметры:
  119. // ПараметрыОбновленияКонфигурации - Структура - Параметры обновления конфигурации (см. в ПолучитьПараметрыОбновленияКонфигурации()).
  120. //
  121. // Возвращаемое значение:
  122. // Булево - Признак успешного выполнения.
  123. //
  124. Функция ПроверитьКорректностьПараметровОбновленияКонфигурациия(ПараметрыОбновленияКонфигурации)
  125.  
  126. Лог.Информация(НСтр("ru = 'Проверка корректности параметров обновления конфигурации.'"));
  127.  
  128. Для Каждого ПараметрОбновленияКонфигурации Из ПараметрыОбновленияКонфигурации Цикл
  129.  
  130. Если ПустаяСтрока(ПараметрОбновленияКонфигурации.Значение) Тогда
  131. Лог.Ошибка(СтрШаблон(НСтр("ru = 'Не задан параметр обновления конфигурации: ""%1"".'"), ПараметрОбновленияКонфигурации.Ключ));
  132. Возврат Ложь;
  133. КонецЕсли;
  134.  
  135. КонецЦикла;
  136.  
  137. Лог.Отладка(НСтр("ru = 'Проверка корректности параметров обновления конфигурации завершена.'"));
  138.  
  139. Возврат Истина;
  140.  
  141. КонецФункции
  142.  
  143. // Получает файл со списком обновления из Интернета
  144. //
  145. // Параметры:
  146. // ПараметрыОбновленияКонфигурации - Структура - Параметры обновления конфигурации (см. в ПолучитьПараметрыОбновленияКонфигурации()).
  147. //
  148. // Возвращаемое значение:
  149. // Булево - Признак успешного выполнения.
  150. //
  151. Функция ПолучитьСпискиОбновленияКонфигурациии(ПараметрыОбновленияКонфигурации)
  152.  
  153. Лог.Информация(НСтр("ru = 'Получение списков обновления.'"));
  154.  
  155. Если НЕ ОбеспечитьКаталог(Каталоги.КаталогВременныхФайлов) Тогда
  156. Возврат Ложь;
  157. КонецЕсли;
  158.  
  159. ZipФайлСпискаШаблонов = ОбъединитьПути(Каталоги.КаталогВременныхФайлов, "v8upd11.zip");
  160. ФайлСпискаШаблонов = ОбъединитьПути(Каталоги.КаталогВременныхФайлов, "v8cscdsc.xml");
  161.  
  162. // Получаем сам файл из Интернета.
  163. Попытка
  164. Соединение = Новый HTTPСоединение(НастройкиПодключения.СерверПроверкиОбновлений, , Аутентификация.Пользователь, Аутентификация.Пароль,);
  165. Исключение
  166. Лог.Ошибка(СтрШаблон(НСтр("ru = 'Не удалось установить HTTP-соединение с сервером %1:
  167. |%2'"), НастройкиПодключения.СерверПроверкиОбновлений, ИнформацияОбОшибке()));
  168. Возврат Ложь;
  169. КонецПопытки;
  170.  
  171. АдресРесурса = СтрШаблон("%1/%2/%3/%4/v8upd11.zip",
  172. НастройкиПодключения.ПутьКФайлуПроверкиОбновлений, ПараметрыОбновленияКонфигурации.ТипКонфигурации, ПараметрыОбновленияКонфигурации.ВерсияРелиза, ПараметрыОбновленияКонфигурации.ВерсияПлатформы);
  173. Попытка
  174. HTTPЗапрос = Новый HTTPЗапрос(АдресРесурса);
  175. Соединение.Получить(HTTPЗапрос, ZipФайлСпискаШаблонов);
  176. Исключение
  177. Лог.Ошибка(СтрШаблон(НСтр("ru = 'Не удалось получить файл с сервера %1:
  178. |%2'"), НастройкиПодключения.СерверПроверкиОбновлений, ИнформацияОбОшибке()));
  179. Возврат Ложь;
  180. КонецПопытки;
  181.  
  182. // Распаковываем файл
  183. Попытка
  184. ФайлZip = Новый ЧтениеZipФайла(ZipФайлСпискаШаблонов);
  185. Исключение
  186. Лог.Ошибка(СтрШаблон(НСтр("ru = 'Не удалось прочесть архив %1:
  187. |%2'"), ZipФайлСпискаШаблонов, ИнформацияОбОшибке()));
  188. Возврат Ложь;
  189. КонецПопытки;
  190. ФайлZip.ИзвлечьВсе(Каталоги.КаталогВременныхФайлов);
  191. ФайлZip.Закрыть();
  192.  
  193. // Очищаем устаревшие файлы
  194. Попытка
  195. УдалитьФайлы(ZipФайлСпискаШаблонов);
  196. Исключение
  197. Лог.Ошибка(СтрШаблон(НСтр("ru = 'Не удалось удалить временный файл %1:
  198. |%2'"), ZipФайлСпискаШаблонов, ИнформацияОбОшибке()));
  199. КонецПопытки;
  200.  
  201. Лог.Отладка(НСтр("ru = 'Получение списков обновления завершено.'"));
  202.  
  203. Возврат Истина;
  204.  
  205. КонецФункции
  206.  
  207. // Анализирует файл списка обновлений конфигурации
  208. //
  209. // Параметры:
  210. // ПараметрыОбновленияКонфигурации - Структура - Параметры обновления конфигурации (см. в ПолучитьПараметрыОбновленияКонфигурации()).
  211. //
  212. // Возвращаемое значение:
  213. // Массив, Неопределено - Массив с структурой обновлений конфигурации, неопределено в случае неудачи.
  214. //
  215. Функция ПроанализироватьСпискиОбновленияКонфигурации(ПараметрыОбновленияКонфигурации)
  216.  
  217. Лог.Информация(НСтр("ru = 'Анализ списков обновления.'"));
  218.  
  219. ФайлСпискаШаблонов = ОбъединитьПути(Каталоги.КаталогВременныхФайлов, "v8cscdsc.xml");
  220. ФайлСпискаШаблоновОбъект = Новый Файл(ФайлСпискаШаблонов);
  221. Если НЕ ФайлСпискаШаблоновОбъект.Существует() Тогда
  222. Лог.Ошибка(НСтр("ru = 'XML файл списка шаблонов не найден в каталоге.'"));
  223. Возврат Неопределено;
  224. КонецЕсли;
  225.  
  226. МассивОбновлений = Новый Массив;
  227.  
  228. // Структура страницы:
  229. // <?xml version="1.0" encoding="UTF-8" ?>
  230. // <v8u:updateList xmlns:v8u="http://v8.1c.ru/configuration-updates" version="1.1">
  231. // <v8u:date>... Дата выпуска ...</v8u:date>
  232. // <v8u:update configuration="... Название конфигурации ...">
  233. // <v8u:vendor>... Поставщик ...</v8u:vendor>
  234. // <v8u:file>... Путь к файлу обновления ...</v8u:file>
  235. // <v8u:size>... Размер файла обновления ...</v8u:size>
  236. // <v8u:version>... Версия ...</v8u:version>
  237. // <v8u:target>... Версия для обновления ...</v8u:target>
  238. // <v8u:target>... Версия для обновления ...</v8u:target>
  239. // </v8u:update>
  240. // </v8u:updateList>
  241.  
  242. Попытка
  243.  
  244. ЧтениеXML = Новый ЧтениеXML;
  245. ЧтениеXML.ОткрытьФайл(ФайлСпискаШаблонов);
  246. ЧтениеXML.ПерейтиКСодержимому();
  247.  
  248. Пока ЧтениеXML.Прочитать() Цикл
  249.  
  250. Если ЧтениеXML.ЛокальноеИмя = "update" И ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
  251.  
  252. ПараметрыВерсии = Новый Структура();
  253. ВерсииДляОбновления = Новый Массив;
  254.  
  255. Пока ЧтениеXML.Прочитать() Цикл
  256. Если ЧтениеXML.ЛокальноеИмя = "update" Тогда
  257. Прервать; // Дошли до конца блока
  258. КонецЕсли;
  259.  
  260. Если ЧтениеXML.ЛокальноеИмя = "vendor" Тогда
  261. ЧтениеXML.Прочитать();
  262. ПараметрыВерсии.Вставить("Поставщик", ЧтениеXML.Значение);
  263. ИначеЕсли ЧтениеXML.ЛокальноеИмя = "version" Тогда
  264. ЧтениеXML.Прочитать();
  265. ПараметрыВерсии.Вставить("Версия", СтрЗаменить(ЧтениеXML.Значение, ".", "_"));
  266. ИначеЕсли ЧтениеXML.ЛокальноеИмя = "file" Тогда
  267. ЧтениеXML.Прочитать();
  268. ПараметрыВерсии.Вставить("ПутьКФайлуОбновления", ЧтениеXML.Значение);
  269. ИначеЕсли ЧтениеXML.ЛокальноеИмя = "size" Тогда
  270. ЧтениеXML.Прочитать();
  271. ПараметрыВерсии.Вставить("РазмерФайлаОбновления", ЧтениеXML.Значение);
  272. ИначеЕсли ЧтениеXML.ЛокальноеИмя = "target" Тогда
  273. ЧтениеXML.Прочитать();
  274. ВерсииДляОбновления.Добавить(СтрЗаменить(ЧтениеXML.Значение, ".", "_"));
  275. КонецЕсли;
  276. ЧтениеXML.Прочитать(); // в конец элемента
  277. КонецЦикла;
  278.  
  279. ПараметрыВерсии.Вставить("ВерсииДляОбновления", ВерсииДляОбновления);
  280. МассивОбновлений.Добавить(ПараметрыВерсии);
  281.  
  282. КонецЕсли;
  283.  
  284. КонецЦикла;
  285.  
  286. Исключение
  287.  
  288. Лог.Ошибка(СтрШаблон(НСтр("ru = 'Ошибка при чтении файла списка обновлений.
  289. |%1'"), ИнформацияОбОшибке()));
  290. ЧтениеXML.Закрыть();
  291.  
  292. Возврат Неопределено;
  293.  
  294. КонецПопытки;
  295.  
  296. ЧтениеXML.Закрыть();
  297.  
  298. Попытка
  299. УдалитьФайлы(ФайлСпискаШаблонов);
  300. Исключение
  301. Лог.Ошибка(СтрШаблон(НСтр("ru = 'Не удалось удалить временный файл %1:
  302. |%2'"), ФайлСпискаШаблонов, ИнформацияОбОшибке()));
  303. КонецПопытки;
  304.  
  305. Лог.Отладка(НСтр("ru = 'Анализ списков обновления завершен.'"));
  306.  
  307. Возврат МассивОбновлений;
  308.  
  309. КонецФункции
  310.  
  311. ///////////////////////////////////////////////////////////////////////////////
  312. // Обновление инфорационной базы
  313.  
  314. // Получает параметры подключения к информационной базе.
  315. //
  316. // Параметры:
  317. // ВариантРаботыИнформационнойБазы - Число - Вариант работы информационной базы: 0 - файловый; 1 - клиент-серверный;
  318. // КаталогИнформационнойБазы - Строка - Каталог информационной базы для файлового режима работы;
  319. // ИмяСервера1СПредприятия - Строка - Имя сервера 1С:Предприятия;
  320. // ИмяИнформационнойБазыНаСервере1СПредприятия - Строка - Имя информационной базы на сервере 1С:Предприятия;
  321. // АутентификацияОперационнойСистемы - Булево - Признак аутентификации операционной системы при создании внешнего подключения к информационной базе;
  322. // ИмяПользователя - Строка - Имя пользователя информационной базы;
  323. // ПарольПользователя - Строка - Пароль пользователя информационной базы;
  324. // ВерсияПлатформы - Строка - Версия платформы (82, 83).
  325. //
  326. // Возвращаемое значение:
  327. // Структура, Неопределено - Параметры подключения к информационной базе, неопределено в случае ошибки.
  328. //
  329. Функция ПолучитьПараметрыПодключения(ВариантРаботыИнформационнойБазы = 0,
  330. КаталогИнформационнойБазы = "",
  331. ИмяСервера1СПредприятия = "",
  332. ИмяИнформационнойБазыНаСервере1СПредприятия = "",
  333. АутентификацияОперационнойСистемы = Ложь,
  334. ИмяПользователя = "Администратор",
  335. ПарольПользователя = "",
  336. ВерсияПлатформы = "83")
  337.  
  338. Лог.Информация("----------------------------------------------------------------------");
  339. Лог.Информация(СтрШаблон(НСтр("ru = 'Информационная база %1.'"),
  340. ?(ВариантРаботыИнформационнойБазы = 0, КаталогИнформационнойБазы, ИмяИнформационнойБазыНаСервере1СПредприятия)));
  341. Лог.Информация("----------------------------------------------------------------------");
  342.  
  343. ПараметрыПодключения = Новый Структура();
  344.  
  345. ПараметрыПодключения.Вставить("ВариантРаботыИнформационнойБазы", ВариантРаботыИнформационнойБазы);
  346. ПараметрыПодключения.Вставить("КаталогИнформационнойБазы", КаталогИнформационнойБазы);
  347. ПараметрыПодключения.Вставить("ИмяСервера1СПредприятия", ИмяСервера1СПредприятия);
  348. ПараметрыПодключения.Вставить("ИмяИнформационнойБазыНаСервере1СПредприятия", ИмяИнформационнойБазыНаСервере1СПредприятия);
  349.  
  350. ПараметрыПодключения.Вставить("АутентификацияОперационнойСистемы", АутентификацияОперационнойСистемы);
  351. ПараметрыПодключения.Вставить("ИмяПользователя", ИмяПользователя);
  352. ПараметрыПодключения.Вставить("ПарольПользователя", ПарольПользователя);
  353.  
  354. ПараметрыПодключения.Вставить("ВерсияПлатформы", ВерсияПлатформы);
  355.  
  356. РезультатВыполнения = ПроверитьКорректностьПараметровПодключения(ПараметрыПодключения);
  357. Если Не РезультатВыполнения Тогда
  358. Возврат Неопределено;
  359. КонецЕсли;
  360.  
  361. Возврат ПараметрыПодключения;
  362.  
  363. КонецФункции
  364.  
  365. // Обновляет информационную базу.
  366. //
  367. // Параметры:
  368. // ПараметрыОбновленияКонфигурации - Структура - Параметры обновления текущей конфигурации (см. в ПолучитьПараметрыОбновленияКонфигурации()).
  369. // ПараметрыПодключения - Структура - Параметры подключения к информационной базе (см. в ПолучитьПараметрыПодключения()).
  370. // БлокироватьСоединенияИБ - Булево - Устанавливать блокировку соединений перед обновлением;
  371. // СоздаватьРезервнуюКопию - Булево - Создавать резервную копию;
  372. // ВыполнитьОтложенныеОбработчики - Булево - Выполнить отложенные обработчики обновления;
  373. // ВыполнятьСжатиеТаблицИБ - Булево - Запускать сжатие таблиц информационной базы;
  374. // ВосстанавливатьИнформационнуюБазу - Булево - Использовать восстановление ИБ в случае падения.
  375. //
  376. // Возвращаемое значение:
  377. // Булево - Признак успешного выполнения.
  378. //
  379. Функция ОбновитьИнформационнуюБазу(ПараметрыОбновленияКонфигурации, ПараметрыПодключения,
  380. БлокироватьСоединенияИБ = Истина,
  381. СоздаватьРезервнуюКопию = Истина,
  382. ВыполнитьОтложенныеОбработчики = Истина,
  383. ВыполнятьСжатиеТаблицИБ = Истина,
  384. ВосстанавливатьИнформационнуюБазу = Истина)
  385.  
  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. КонецЕсли;
  454.  
  455. Возврат РезультатВыполнения;
  456.  
  457. КонецФункции
  458.  
  459. // Осуществляет проверку корректности заполнения параметров подключения
  460. //
  461. // Параметры:
  462. // ПараметрыПодключения - Структура - Параметры подключения к информационной базе (см. в ПолучитьПараметрыПодключения()).
  463. //
  464. // Возвращаемое значение:
  465. // Булево - Признак успешного выполнения.
  466. //
  467. Функция ПроверитьКорректностьПараметровПодключения(ПараметрыПодключения)
  468.  
  469. Лог.Информация(НСтр("ru = 'Проверка корректности параметров подключения.'"));
  470.  
  471. ФайловыйВариантРаботы = ПараметрыПодключения.ВариантРаботыИнформационнойБазы = 0;
  472. Если ФайловыйВариантРаботы Тогда
  473. Если ПустаяСтрока(ПараметрыПодключения.КаталогИнформационнойБазы) Тогда
  474. Лог.Ошибка(НСтр("ru = 'Не задано месторасположение каталога информационной базы.'"));
  475. Возврат Ложь;
  476. КонецЕсли;
  477. Иначе
  478. Если ПустаяСтрока(ПараметрыПодключения.ИмяСервера1СПредприятия) Или ПустаяСтрока(ПараметрыПодключения.ИмяИнформационнойБазыНаСервере1СПредприятия) Тогда
  479. Лог.Ошибка(НСтр("ru = 'Не заданы обязательные параметры подключения: ""Имя сервера""; ""Имя информационной базы на сервере"".'"));
  480. Возврат Ложь;
  481. КонецЕсли;
  482. КонецЕсли;
  483.  
  484. Лог.Отладка(НСтр("ru = 'Проверка корректности параметров подключения завершена.'"));
  485.  
  486. Возврат Истина;
  487.  
  488. КонецФункции
  489.  
  490. // Проверяет наличие обновлений для информационной базы
  491. //
  492. // Параметры:
  493. // ПараметрыОбновленияКонфигурации - Структура - Параметры обновления текущей конфигурации (см. в ОбработкаКонфигурации()).
  494. // ПараметрыПодключения - Структура - Параметры подключения к информационной базе (см. в ПолучитьПараметрыПодключения());
  495. //
  496. // Возвращаемое значение:
  497. // Структура, Строка, Неопределено - Параметры версии для обновления, "КонфигурацияИзменена", "ОбновленийНеТребуется", неопределено в случае неудачи.
  498. //
  499. Функция ПроверитьНаличиеОбновлений(ПараметрыОбновленияКонфигурации, ПараметрыПодключения)
  500.  
  501. Лог.Информация(НСтр("ru = 'Проверка наличия обновлений.'"));
  502.  
  503. // Получение параметров информационной базы
  504. Соединение = УстановитьВнешнееСоединениеСБазой(ПараметрыПодключения);
  505. Если Соединение = Неопределено Тогда
  506. Возврат Неопределено;
  507. КонецЕсли;
  508.  
  509. ТекущаяВерсия = СтрЗаменить(Соединение.Метаданные.Версия, ".", "_");
  510. Лог.Информация(СтрШаблон(НСтр("ru = 'Текущая версия конфигурации информационной базы: %1.'"), ТекущаяВерсия));
  511.  
  512. КонфигурацияИзменена = Соединение.КонфигурацияИзменена();
  513.  
  514. Соединение = Неопределено;
  515. ОжидатьЗавершения(ПараметрыПодключения);
  516.  
  517. Если КонфигурацияИзменена Тогда
  518. Лог.Информация(НСтр("ru = 'Основная конфигурация отличается от конфигурации базы данных.'"));
  519. Возврат "КонфигурацияИзменена";
  520. КонецЕсли;
  521.  
  522. // Прверка наличия обновлений
  523. ВерсияДляОбновления = Неопределено;
  524. ЗагруженноеОбновлениеНайдено = Ложь;
  525. МассивОбновлений = ПараметрыОбновленияКонфигурации.МассивОбновлений;
  526.  
  527. КоличествоОбновлений = МассивОбновлений.Количество();
  528. Для Сч = 1 По КоличествоОбновлений Цикл
  529.  
  530. ПараметрыВерсии = МассивОбновлений[КоличествоОбновлений - Сч];
  531. МассивВерсийДляОбновления = ПараметрыВерсии.ВерсииДляОбновления.Найти(ТекущаяВерсия);
  532. Если МассивВерсийДляОбновления = Неопределено Тогда
  533. Продолжить;
  534. КонецЕсли;
  535.  
  536. КаталогФайлаОбновленияВерсии = ОбъединитьПути(Каталоги.КаталогФайловОбновления, ПараметрыОбновленияКонфигурации.ТипКонфигурации, ПараметрыВерсии.Версия);
  537. ФайлОбновленияВерсии = ОбъединитьПути(КаталогФайлаОбновленияВерсии, "1cv8.cfu");
  538.  
  539. ФайлОбновленияВерсииОбъект = Новый Файл(ФайлОбновленияВерсии);
  540. Если ФайлОбновленияВерсииОбъект.Существует() Тогда
  541. ЗагруженноеОбновлениеНайдено = Истина;
  542. ВерсияДляОбновления = ПараметрыВерсии;
  543. ВерсияДляОбновления.Вставить("Каталог", КаталогФайлаОбновленияВерсии);
  544. Лог.Информация(СтрШаблон(НСтр("ru = 'Загружена и доступна для обновления версия: %1.'"), ПараметрыВерсии.Версия));
  545. Прервать;
  546. КонецЕсли;
  547.  
  548. Если ВерсияДляОбновления = Неопределено Тогда
  549. ВерсияДляОбновления = ПараметрыВерсии;
  550. ВерсияДляОбновления.Вставить("Каталог", КаталогФайлаОбновленияВерсии);
  551. КонецЕсли;
  552.  
  553. КонецЦикла;
  554.  
  555. Если ВерсияДляОбновления = Неопределено Тогда
  556. Лог.Информация(НСтр("ru = 'Установлена последняя версия. Обновление не требуется.'"));
  557. Возврат "ОбновленийНеТребуется";
  558. КонецЕсли;
  559.  
  560. // Загрузка файлов обновления
  561. Если Не ЗагруженноеОбновлениеНайдено Тогда
  562.  
  563. Лог.Информация(СтрШаблон(НСтр("ru = 'Доступна для загрузки версия: %1 (Поставщик %2, размер %3).'"),
  564. ВерсияДляОбновления.Версия, ВерсияДляОбновления.Поставщик, ВерсияДляОбновления.РазмерФайлаОбновления));
  565.  
  566. Если НЕ ПолучитьФайлыОбновлений(ВерсияДляОбновления) Тогда
  567. Возврат Неопределено;
  568. КонецЕсли;
  569.  
  570. КонецЕсли;
  571.  
  572. Возврат ВерсияДляОбновления;
  573.  
  574. КонецФункции
  575.  
  576. // Скачивает из Интернета файлы обновлений.
  577. //
  578. // Параметры:
  579. // ВерсияДляОбновления - Структура - Структура с параметрами версии для обновления.
  580. // * Поставщик - Строка - Поставщик;
  581. // * Версия - Строка - Версия;
  582. // * ПутьКФайлуОбновления - Строка - Путь к файлу обновления;
  583. // * РазмерФайлаОбновления - Строка - Размер файла обновления в байтах.
  584. //
  585. // Возвращаемое значение:
  586. // Булево - признак успешного получения.
  587. //
  588. Функция ПолучитьФайлыОбновлений(ВерсияДляОбновления)
  589.  
  590. Лог.Информация(СтрШаблон(НСтр("ru = 'Получение файлов обновления версии %1.'"), ВерсияДляОбновления.Версия));
  591.  
  592. Если НЕ ОбеспечитьКаталог(ВерсияДляОбновления.Каталог) Тогда
  593. Возврат Ложь;
  594. КонецЕсли;
  595.  
  596. Если НЕ ОбеспечитьКаталог(Каталоги.КаталогВременныхФайлов) Тогда
  597. Возврат Ложь;
  598. КонецЕсли;
  599.  
  600. ZipФайлОбновления = ОбъединитьПути(Каталоги.КаталогВременныхФайлов, "1cv8.zip");
  601.  
  602. // Получаем сам файл из Интернета.
  603. Попытка
  604. Соединение = Новый HTTPСоединение(НастройкиПодключения.СерверОбновлений, , Аутентификация.Пользователь, Аутентификация.Пароль,);
  605. Исключение
  606. Лог.Ошибка(СтрШаблон(НСтр("ru = 'Не удалось установить HTTP-соединение с сервером %1:
  607. |%2'"), НастройкиПодключения.СерверОбновлений, ИнформацияОбОшибке()));
  608. Возврат Ложь;
  609. КонецПопытки;
  610.  
  611. АдресРесурса = СтрШаблон("%1/%2", НастройкиПодключения.ПутьКФайлуОбновлений, ВерсияДляОбновления.ПутьКФайлуОбновления);
  612. Заголовки = Новый Соответствие();
  613. Заголовки.Вставить("User-Agent", "1C+Enterprise/8.3");
  614. Попытка
  615. HTTPЗапрос = Новый HTTPЗапрос(АдресРесурса, Заголовки);
  616. Соединение.Получить(HTTPЗапрос, ZipФайлОбновления);
  617. Исключение
  618. Лог.Ошибка(СтрШаблон(НСтр("ru = 'Не удалось получить файл с сервера %1:
  619. |%2'"), НастройкиПодключения.СерверОбновлений, ИнформацияОбОшибке()));
  620. Возврат Ложь;
  621. КонецПопытки;
  622.  
  623. // Распаковываем файл
  624. Попытка
  625. ФайлZip = Новый ЧтениеZipФайла(ZipФайлОбновления);
  626. Исключение
  627. Лог.Ошибка(СтрШаблон(НСтр("ru = 'Не удалось прочесть архив %1:
  628. |%2'"), ZipФайлОбновления, ИнформацияОбОшибке()));
  629. Возврат Ложь;
  630. КонецПопытки;
  631. ФайлZip.ИзвлечьВсе(ВерсияДляОбновления.Каталог);
  632. ФайлZip.Закрыть();
  633.  
  634. // Очищаем устаревшие файлы
  635. Попытка
  636. УдалитьФайлы(ZipФайлОбновления);
  637. Исключение
  638. Лог.Ошибка(СтрШаблон(НСтр("ru = 'Не удалось удалить временный файл %1:
  639. |%2'"), ZipФайлОбновления, ИнформацияОбОшибке()));
  640. Возврат Ложь;
  641. КонецПопытки;
  642.  
  643. Лог.Отладка(НСтр("ru = 'Файлы обновления успешно получены.'"));
  644.  
  645. Возврат Истина;
  646.  
  647. КонецФункции
  648.  
  649. // Завершает работу пользователей и устанавливает запрет на подключение новых соединений.
  650. //
  651. // Параметры:
  652. // ПараметрыПодключения - Структура - Параметры подключения к информационной базе (см. в ПолучитьПараметрыПодключения()).
  653. //
  654. // Возвращаемое значение:
  655. // Булево - Признак успешного выполнения.
  656. //
  657. Функция УстановитьБлокировкуСоединений(ПараметрыПодключения)
  658.  
  659. Лог.Информация(НСтр("ru = 'Завершение работы пользователей и установка запрета на подключение новых соединений.'"));
  660.  
  661. // Получение параметров информационной базы
  662. Соединение = УстановитьВнешнееСоединениеСБазой(ПараметрыПодключения);
  663. Если Соединение = Неопределено Тогда
  664. Возврат Ложь;
  665. КонецЕсли;
  666.  
  667. Попытка
  668.  
  669. Соединение.СоединенияИБ.УстановитьБлокировкуСоединений(
  670. НСтр("ru = 'в связи с необходимостью обновления конфигурации.'"), "ПакетноеОбновлениеКонфигурацииИБ");
  671. Интервал = Соединение.СоединенияИБ.ПараметрыБлокировкиСеансов().ИнтервалОжиданияЗавершенияРаботыПользователей * 1000;
  672. ДатаСтарта = Соединение.СоединенияИБ.ПараметрыБлокировкиСеансов().Начало;
  673.  
  674. Если Интервал > ИнтервалыОжидания.ЗавершениеРаботыПользователей Тогда
  675. Интервал = ИнтервалыОжидания.ЗавершениеРаботыПользователей;
  676. КонецЕсли;
  677.  
  678. Лог.Отладка(СтрШаблон(НСтр("ru = 'Параметры блокировки сеансов:
  679. | Интервал ожидания завершения работы пользователей - %1 сек
  680. | Дата старта - %2'"), Интервал, ДатаСтарта));
  681.  
  682. Если Соединение.ЗначениеЗаполнено(ДатаСтарта) Тогда
  683.  
  684. Пока ТекущаяДата() - Интервал <= ДатаСтарта Цикл
  685.  
  686. Если НЕ Соединение.СоединенияИБ.УстановленаБлокировкаСоединений()
  687. ИЛИ Соединение.СоединенияИБ.КоличествоСеансовИнформационнойБазы(Ложь) <= 1 Тогда
  688. Прервать;
  689. КонецЕсли;
  690.  
  691. Приостановить(15 * 1000); // Ждем 15 секунд до следующей проверки.
  692.  
  693. КонецЦикла;
  694.  
  695. Лог.Отладка(СтрШаблон(НСтр("ru = 'Задержка: %1 сек'"), ТекущаяДата() - ДатаСтарта));
  696.  
  697. КонецЕсли;
  698.  
  699. Если НЕ Соединение.СоединенияИБ.УстановленаБлокировкаСоединений() Тогда
  700. Лог.Ошибка(НСтр("ru = 'Попытка завершения работы пользователей завершилась безуспешно: отменена блокировка ИБ.'"));
  701. Соединение = Неопределено;
  702. ОжидатьЗавершения(ПараметрыПодключения);
  703. Возврат Ложь;
  704. КонецЕсли;
  705.  
  706. Если Соединение.СоединенияИБ.КоличествоСеансовИнформационнойБазы(Ложь) <= 1 Тогда
  707. Лог.Отладка(НСтр("ru = 'Установка запрета на подключение новых соединений выполнена.
  708. |Все пользователи завершили работу.'"));
  709. Соединение = Неопределено;
  710. ОжидатьЗавершения(ПараметрыПодключения);
  711. Возврат Истина;
  712. КонецЕсли;
  713.  
  714. Лог.Отладка(НСтр("ru = 'Принудительное прерывание соединений пользователей.'"));
  715.  
  716. // после начала блокировки сеансы всех пользователей должны быть отключены
  717. // если этого не произошло пробуем принудительно прервать соединение.
  718. ПараметрыАдминистрирования = Соединение.СтандартныеПодсистемыСервер.ПараметрыАдминистрирования();
  719. ПараметрыАдминистрирования.ПарольАдминистратораИнформационнойБазы = ПараметрыПодключения.ПарольПользователя;
  720. ПараметрыАдминистрирования.ПарольАдминистратораКластера = ПараметрыПодключения.ПарольПользователя;
  721. Соединение.СоединенияИБКлиентСервер.УдалитьВсеСеансыКромеТекущего(ПараметрыАдминистрирования);
  722.  
  723. Если Соединение.СоединенияИБ.КоличествоСеансовИнформационнойБазы(Ложь) > 1 Тогда
  724. Соединение.СоединенияИБ.РазрешитьРаботуПользователей();
  725. Лог.Ошибка(Соединение.СоединенияИБ.СообщениеОНеотключенныхСеансах());
  726. Соединение = Неопределено;
  727. ОжидатьЗавершения(ПараметрыПодключения);
  728. Возврат Ложь;
  729. КонецЕсли;
  730.  
  731. Исключение
  732. Лог.Ошибка(СтрШаблон(НСтр("ru = 'Ошибка при установке запрета на подключение новых соединений.
  733. |%1'"), ИнформацияОбОшибке()));
  734. Соединение = Неопределено;
  735. ОжидатьЗавершения(ПараметрыПодключения);
  736. Возврат Истина;
  737. КонецПопытки;
  738.  
  739. Соединение = Неопределено;
  740. ОжидатьЗавершения(ПараметрыПодключения);
  741.  
  742. Лог.Отладка(НСтр("ru = 'Установка запрета на подключение новых соединений выполнена.
  743. |Работа всех пользователей прервана.'"));
  744.  
  745. Возврат Истина;
  746.  
  747. КонецФункции
  748.  
  749. // Создает резервную копию информационной базы.
  750. //
  751. // Параметры:
  752. // ПараметрыПодключения - Структура - Параметры подключения к информационной базе (см. в ПолучитьПараметрыПодключения());
  753. // ФайлРезервнойКопии - Строка - Полный путь к файлу резервной копии
  754. //
  755. // Возвращаемое значение:
  756. // Булево - Признак успешного выполнения.
  757. //
  758. Функция СоздатьРезервнуюКопию(ПараметрыПодключения, ФайлРезервнойКопии = "")
  759.  
  760. Лог.Информация(НСтр("ru = 'Создание резервной копии информационной базы.'"));
  761.  
  762. Если НЕ ОбеспечитьКаталог(Каталоги.КаталогРезервныхКопий) Тогда
  763. Возврат Ложь;
  764. КонецЕсли;
  765.  
  766. ИмяФайла = "Base" + Формат(ТекущаяДата(), "ДФ=ггММддЧЧммсс");
  767.  
  768. ФайловыйВариантРаботы = ПараметрыПодключения.ВариантРаботыИнформационнойБазы = 0;
  769.  
  770. Если ФайловыйВариантРаботы Тогда
  771.  
  772. ФайлНаличияСоединений = Новый Файл(ОбъединитьПути(ПараметрыПодключения.КаталогИнформационнойБазы, "1Cv8tmp.1CD"));
  773. Если ФайлНаличияСоединений.Существует() Тогда
  774. ИмяФайла = ИмяФайла + "-online";
  775. КонецЕсли;
  776.  
  777. ПолноеИмяФайла = ОбъединитьПути(Каталоги.КаталогРезервныхКопий, ИмяФайла + ".zip");
  778. Лог.Информация(СтрШаблон(НСтр("ru = 'Файл архива %1.'"), ПолноеИмяФайла));
  779.  
  780. ФайлZip = Новый ЗаписьZipФайла(ПолноеИмяФайла);
  781. ФайлZip.Добавить(ОбъединитьПути(ПараметрыПодключения.КаталогИнформационнойБазы, "1Cv8.1CD"));
  782.  
  783. Попытка
  784. ФайлZip.Записать();
  785. Исключение
  786. Лог.Ошибка(СтрШаблон(НСтр("ru = 'Ошибка при записи файла информационной базы в архив.
  787. |%1'"), ИнформацияОбОшибке()));
  788. Возврат Ложь;
  789. КонецПопытки;
  790.  
  791. Иначе
  792.  
  793. ПолноеИмяФайла = ОбъединитьПути(Каталоги.КаталогРезервныхКопий, ИмяФайла + ".dt");
  794. Лог.Информация(СтрШаблон(НСтр("ru = 'Файл дампа %1.'"), ПолноеИмяФайла));
  795.  
  796. УправлениеКонфигуратором = УстановитьУправлениеКонфигуратором(ПараметрыПодключения);
  797. ПараметрыЗапуска = УправлениеКонфигуратором.ПолучитьПараметрыЗапуска();
  798. ПараметрыЗапуска.Добавить(СтрШаблон("/DumpIB ""%1""", ПолноеИмяФайла));
  799.  
  800. Попытка
  801. УправлениеКонфигуратором.ВыполнитьКоманду(ПараметрыЗапуска);
  802. Исключение
  803. Лог.Ошибка(СтрШаблон(НСтр("ru = 'Ошибка при создании файла дампа информационной базы.
  804. |%1'"), УправлениеКонфигуратором.ВыводКоманды()));
  805. Возврат Ложь;
  806. КонецПопытки
  807.  
  808. КонецЕсли;
  809.  
  810. ФайлОбъект = Новый Файл(ПолноеИмяФайла);
  811. Если НЕ ФайлОбъект.Существует() Тогда
  812. Лог.Ошибка(НСтр("ru = 'Файл резервной копии не найден в каталоге.'"));
  813. Возврат Ложь;
  814. КонецЕсли;
  815.  
  816. Лог.Отладка(НСтр("ru = 'Создание резервной копии информационной базы завершено.'"));
  817.  
  818. ФайлРезервнойКопии = ПолноеИмяФайла;
  819. Возврат Истина;
  820.  
  821. КонецФункции
  822.  
  823. // Выполняет все процедуры отложенного обновления информационной базы
  824. //
  825. // Параметры:
  826. // ПараметрыПодключения - Структура - Параметры подключения к информационной базе (см. в ПолучитьПараметрыПодключения()).
  827. //
  828. // Возвращаемое значение:
  829. // Булево - Признак успешного выполнения.
  830. //
  831. Функция ВыполнитьОтложенныеОбработчикиОбновления(ПараметрыПодключения)
  832.  
  833. Лог.Информация(НСтр("ru = 'Выполнение отложенных обработчиков обновления.'"));
  834.  
  835. Соединение = УстановитьВнешнееСоединениеСБазой(ПараметрыПодключения);
  836. Если Соединение = Неопределено Тогда
  837. Возврат Ложь;
  838. КонецЕсли;
  839.  
  840. Попытка
  841. Соединение.ОбновлениеИнформационнойБазыСлужебный.ВыполнитьОтложенноеОбновлениеСейчас();
  842. Исключение
  843. Лог.Ошибка(СтрШаблон(НСтр("ru = 'Ошибка при выполнении отложенных обработчиков обновления.
  844. |%1'"),ИнформацияОбОшибке()));
  845. Соединение = Неопределено;
  846. ОжидатьЗавершения(ПараметрыПодключения);
  847. Возврат Истина;
  848. КонецПопытки;
  849.  
  850. Соединение = Неопределено;
  851. ОжидатьЗавершения(ПараметрыПодключения);
  852.  
  853. Лог.Отладка(НСтр("ru = 'Выполнение отложенных обработчиков обновления завершено.'"));
  854.  
  855. Возврат Истина;
  856.  
  857. КонецФункции
  858.  
  859. // Загружает файл обновления в информационную базу
  860. //
  861. // Параметры:
  862. // ПараметрыПодключения - Структура - Параметры подключения к информационной базе (см. в ПолучитьПараметрыПодключения());
  863. // ВерсияДляОбновления - Строка - Версия для обновления.
  864. //
  865. // Возвращаемое значение:
  866. // Булево - Признак успешного выполнения.
  867. //
  868. Функция ЗагрузитьФайлОбновленияВИнформационнуюБазу(ПараметрыПодключения, ВерсияДляОбновления)
  869.  
  870. Лог.Информация(НСтр("ru = 'Загрузка файла обновления в информационную базу.'"));
  871.  
  872. УправлениеКонфигуратором = УстановитьУправлениеКонфигуратором(ПараметрыПодключения);
  873.  
  874. Попытка
  875. УправлениеКонфигуратором.ОбновитьКонфигурацию(ВерсияДляОбновления.Каталог, Ложь);
  876. Исключение
  877. Лог.Ошибка(СтрШаблон(НСтр("ru = 'Ошибка при загрузке файла обновления в информационную базу.
  878. |%1'"), УправлениеКонфигуратором.ВыводКоманды()));
  879. Возврат Ложь;
  880. КонецПопытки;
  881.  
  882. Лог.Отладка(НСтр("ru = 'Загрузка файла обновления в информационную базу завершена.'"));
  883.  
  884. Возврат Истина;
  885.  
  886. КонецФункции
  887.  
  888. // Выполняет обновление конфигурации информационной базы
  889. //
  890. // Параметры:
  891. // ПараметрыПодключения - Структура - Параметры подключения к информационной базе (см. в ПолучитьПараметрыПодключения()).
  892. //
  893. // Возвращаемое значение:
  894. // Булево - Признак успешного выполнения.
  895. //
  896. Функция ВыполнитьОбновлениеКонфигурацииИнформационнойБазы(ПараметрыПодключения)
  897.  
  898. Лог.Информация(НСтр("ru = 'Обновление конфигурации информационной базы.'"));
  899.  
  900. УправлениеКонфигуратором = УстановитьУправлениеКонфигуратором(ПараметрыПодключения);
  901.  
  902. Попытка
  903. УправлениеКонфигуратором.ОбновитьКонфигурациюБазыДанных();
  904. Исключение
  905. Лог.Ошибка(СтрШаблон(НСтр("ru = 'Ошибка при обновлении конфигурации информационной базы.
  906. |%1'"), УправлениеКонфигуратором.ВыводКоманды()));
  907. Возврат Ложь;
  908. КонецПопытки;
  909.  
  910. Лог.Отладка(НСтр("ru = 'Обновление конфигурации информационной базы завершено.'"));
  911.  
  912. Возврат Истина;
  913.  
  914. КонецФункции
  915.  
  916. // Выполняет тестирование и исправление
  917. //
  918. // Параметры:
  919. // ПараметрыПодключения - Структура - Параметры подключения к информационной базе (см. в ПолучитьПараметрыПодключения()).
  920. //
  921. // Возвращаемое значение:
  922. // Булево - Признак успешного выполнения.
  923. //
  924. Функция ВыполнитьТестированиеИИсправление(ПараметрыПодключения)
  925.  
  926. Лог.Информация(НСтр("ru = 'Тестирование и исправление информационной базы.'"));
  927.  
  928. УправлениеКонфигуратором = УстановитьУправлениеКонфигуратором(ПараметрыПодключения);
  929. ПараметрыЗапуска = УправлениеКонфигуратором.ПолучитьПараметрыЗапуска();
  930. ПараметрыЗапуска.Добавить("/IBCheckAndRepair -IBCompression");
  931.  
  932. Попытка
  933. УправлениеКонфигуратором.ВыполнитьКоманду(ПараметрыЗапуска);
  934. Исключение
  935. Лог.Ошибка(СтрШаблон(НСтр("ru = 'Ошибка при тестировании и исправлении информационной базы.
  936. |%1'"), УправлениеКонфигуратором.ВыводКоманды()));
  937. Возврат Ложь;
  938. КонецПопытки;
  939.  
  940. Лог.Отладка(НСтр("ru = 'Тестирование и исправление информационной базы завершено.'"));
  941.  
  942. Возврат Истина;
  943.  
  944. КонецФункции
  945.  
  946. // Выполняет неинтерактивное обновление данных информационной базы
  947. //
  948. // Параметры:
  949. // ПараметрыПодключения - Структура - Параметры подключения к информационной базе (см. в ПолучитьПараметрыПодключения()).
  950. //
  951. // Возвращаемое значение:
  952. // Булево - Признак успешного выполнения.
  953. //
  954. Функция ПринятьОбновленияВИнформационнойБазе(ПараметрыПодключения)
  955.  
  956. Лог.Информация(НСтр("ru = 'Принятие обновлений в информационной базе.'"));
  957.  
  958. Соединение = УстановитьВнешнееСоединениеСБазой(ПараметрыПодключения);
  959. Если Соединение = Неопределено Тогда
  960. Возврат Ложь;
  961. КонецЕсли;
  962.  
  963. Попытка
  964. Результат = Соединение.ОбновлениеИнформационнойБазы.ВыполнитьОбновлениеИнформационнойБазы(Ложь);
  965. Исключение
  966. Лог.Ошибка(СтрШаблон(НСтр("ru = 'Ошибка при принятии изменений в информационной базе.
  967. |%1'"), ИнформацияОбОшибке()));
  968. Соединение = Неопределено;
  969. ОжидатьЗавершения(ПараметрыПодключения);
  970. Возврат Истина;
  971. КонецПопытки;
  972.  
  973. Соединение = Неопределено;
  974. ОжидатьЗавершения(ПараметрыПодключения);
  975.  
  976. Если Результат = "Успешно" Тогда
  977. Лог.Отладка(НСтр("ru = 'Принятие обновлений в информационной базе завершено.'"));
  978. Возврат Истина;
  979. ИначеЕсли Результат = "НеТребуется" Тогда
  980. Лог.Отладка(НСтр("ru = 'Принятие обновлений в информационной базе не требуется.'"));
  981. Возврат Истина;
  982. Иначе
  983. Лог.Ошибка(НСтр("ru = 'Ошибка установки монопольного режима.'"));
  984. Возврат Ложь;
  985. КонецЕсли;
  986.  
  987. КонецФункции
  988.  
  989. // Восстанавливает информационную базу из резервной копии
  990. //
  991. // Параметры:
  992. // ПараметрыПодключения - Структура - Параметры подключения к информационной базе (см. в ПолучитьПараметрыПодключения());
  993. // ФайлРезервнойКопии - Строка - Полный путь к файлу резервной копии.
  994. //
  995. // Возвращаемое значение:
  996. // Булево - Признак успешного выполнения.
  997. //
  998. Функция ВосстановитьИзРезервнойКопии(ПараметрыПодключения, ФайлРезервнойКопии)
  999.  
  1000. Лог.Информация(НСтр("ru = 'Восстановление информационной базы из резервной копии.'"));
  1001.  
  1002. Если ПустаяСтрока(ФайлРезервнойКопии) Тогда
  1003. Лог.Ошибка(НСтр("ru = 'Не указан файл резервной копии.'"));
  1004. Возврат Ложь;
  1005. КонецЕсли;
  1006.  
  1007. ФайловыйВариантРаботы = ПараметрыПодключения.ВариантРаботыИнформационнойБазы = 0;
  1008. Если Не ФайловыйВариантРаботы Тогда
  1009. Лог.Ошибка(НСтр("ru = 'Восстановление клиент-серверных информационных баз не предусмотрено.'"));
  1010. Возврат Ложь;
  1011. КонецЕсли;
  1012.  
  1013. Попытка
  1014. ФайлZip = Новый ЧтениеZipФайла(ФайлРезервнойКопии);
  1015. Исключение
  1016. Лог.Ошибка(СтрШаблон(НСтр("ru = 'Не удалось прочесть архив %1:
  1017. |%2'"), ФайлРезервнойКопии, ИнформацияОбОшибке()));
  1018. Возврат Ложь;
  1019. КонецПопытки;
  1020. ФайлZip.ИзвлечьВсе(ПараметрыПодключения.КаталогИнформационнойБазы);
  1021. ФайлZip.Закрыть();
  1022.  
  1023. Лог.Отладка(НСтр("ru = 'Восстановление информационной базы из резервной копии завершено.'"));
  1024.  
  1025. Возврат Истина;
  1026.  
  1027. КонецФункции
  1028.  
  1029. // Разрешает подключение новых соединений.
  1030. //
  1031. // Параметры:
  1032. // ПараметрыПодключения - Структура - Параметры подключения к информационной базе (см. в ПолучитьПараметрыПодключения()).
  1033. //
  1034. // Возвращаемое значение:
  1035. // Булево - Признак успешного выполнения.
  1036. //
  1037. Функция РазрешитьПодключение(ПараметрыПодключения)
  1038.  
  1039. Лог.Информация(НСтр("ru = 'Разрешение подключений новых соединений.'"));
  1040.  
  1041. // Получение параметров информационной базы
  1042. Соединение = УстановитьВнешнееСоединениеСБазой(ПараметрыПодключения);
  1043. Если Соединение = Неопределено Тогда
  1044. Возврат Ложь;
  1045. КонецЕсли;
  1046.  
  1047. Попытка
  1048. Соединение.СоединенияИБ.РазрешитьРаботуПользователей();
  1049. Исключение
  1050. Лог.Ошибка(СтрШаблон(НСтр("ru = 'Ошибка при разрешении подключений новых соединений.
  1051. |%1'"), ИнформацияОбОшибке()));
  1052. Соединение = Неопределено;
  1053. ОжидатьЗавершения(ПараметрыПодключения);
  1054. Возврат Истина;
  1055. КонецПопытки;
  1056.  
  1057. Соединение = Неопределено;
  1058. ОжидатьЗавершения(ПараметрыПодключения);
  1059.  
  1060. Лог.Отладка(НСтр("ru = 'Разрешение подключений новых соединений завершено.'"));
  1061.  
  1062. Возврат Истина;
  1063.  
  1064. КонецФункции
  1065.  
  1066. //////////////////////////////////////////////////////////////////////////////////////
  1067. // Служебные процедуры и функции
  1068.  
  1069. // Проверяет наличия каталога и в случае его отсутствия создает новый.
  1070. //
  1071. // Параметры:
  1072. // Каталог - Строка - Путь к каталогу, существование которого нужно проверить.
  1073. //
  1074. // Возвращаемое значение:
  1075. // Булево - признак существования каталога.
  1076. //
  1077. Функция ОбеспечитьКаталог(Знач Каталог)
  1078.  
  1079. Файл = Новый Файл(Каталог);
  1080. Если Не Файл.Существует() Тогда
  1081. Попытка
  1082. СоздатьКаталог(Каталог);
  1083. Исключение
  1084. Лог.Ошибка(СтрШаблон(НСтр("ru = 'Не удалось создать каталог %1.
  1085. |%2'"), Каталог, ИнформацияОбОшибке()));
  1086. Возврат Ложь;
  1087. КонецПопытки;
  1088.  
  1089. Если Не Файл.Существует() Тогда
  1090. Лог.Ошибка(СтрШаблон(НСтр("ru = 'Не удалось создать каталог %1.'"), Каталог));
  1091. Возврат Ложь;
  1092. КонецЕсли
  1093.  
  1094. ИначеЕсли Не Файл.ЭтоКаталог() Тогда
  1095. Лог.Ошибка(СтрШаблон(НСтр("ru = 'Каталог %1 не является каталогом.'"), Каталог));
  1096. Возврат Ложь;
  1097. КонецЕсли;
  1098.  
  1099. Возврат Истина;
  1100.  
  1101. КонецФункции
  1102.  
  1103. // Ожидает завершения подключений к информационной базе.
  1104. //
  1105. // Параметры:
  1106. // ПараметрыПодключения - Структура - Параметры подключения к информационной базе (см. в ОбновитьИнформационнуюБазу()).
  1107. //
  1108. Процедура ОжидатьЗавершения(Знач ПараметрыПодключения)
  1109.  
  1110. // Несмотря на установку "Соединение = Неопределено;", на медленных компьютерах Com соединения не успевает
  1111. // отваливаться до вызова следующей функции. Это приводит к невозможности установить монопольный доступ и ошибке.
  1112. // Для обхода ошибки реализована задержка.
  1113.  
  1114. ФайловыйВариантРаботы = ПараметрыПодключения.ВариантРаботыИнформационнойБазы = 0;
  1115.  
  1116. Если ФайловыйВариантРаботы Тогда
  1117.  
  1118. ФайлНаличияСоединений = Новый Файл(ОбъединитьПути(ПараметрыПодключения.КаталогИнформационнойБазы, "1Cv8tmp.1CD"));
  1119. Если Не ФайлНаличияСоединений.Существует() Тогда
  1120. Возврат;
  1121. КонецЕсли;
  1122.  
  1123. ДатаСтарта = ТекущаяДата();
  1124. Интервал = ИнтервалыОжидания.ЗавершениеСеансовФайловойИБ;
  1125.  
  1126. Пока ТекущаяДата() - Интервал <= ДатаСтарта Цикл
  1127. Если Не ФайлНаличияСоединений.Существует() Тогда
  1128. Прервать;
  1129. КонецЕсли;
  1130. Приостановить(100); // Ждем 0.1 секунд до следующей проверки.
  1131. КонецЦикла;
  1132.  
  1133. Иначе
  1134.  
  1135. ДатаСтарта = ТекущаяДата();
  1136. Интервал = ИнтервалыОжидания.ЗавершениеСеансовСервернойИБ;
  1137.  
  1138. Приостановить(1000 * Интервал);
  1139.  
  1140. КонецЕсли;
  1141.  
  1142. Лог.Отладка(СтрШаблон(НСтр("ru = 'Задержка: %1 сек'"), ТекущаяДата() - ДатаСтарта));
  1143.  
  1144. КонецПроцедуры
  1145.  
  1146. // Устанавливает внешнее соединение с информационной базой по переданным параметрам подключения и возвращает указатель
  1147. // на это соединение.
  1148. //
  1149. // Параметры:
  1150. // ПараметрыПодключения - Структура - Параметры подключения к информационной базе (см. в ОбновитьИнформационнуюБазу()).
  1151. //
  1152. // Возвращаемое значение:
  1153. // COMОбъект, Неопределено - указатель на COM-объект соединения или Неопределено в случае ошибки;
  1154. //
  1155. Функция УстановитьВнешнееСоединениеСБазой(Знач ПараметрыПодключения)
  1156.  
  1157. ИмяCOMСоединителя = "V" + ПараметрыПодключения.ВерсияПлатформы + ".COMConnector";
  1158. Попытка
  1159. COMОбъект = Новый COMОбъект(ИмяCOMСоединителя);
  1160. Исключение
  1161. Лог.Ошибка(СтрШаблон(НСтр("ru = 'Не удалось подключится к другой программе:
  1162. |%1'"), ИнформацияОбОшибке()));
  1163. Возврат Неопределено;
  1164. КонецПопытки;
  1165.  
  1166. ФайловыйВариантРаботы = ПараметрыПодключения.ВариантРаботыИнформационнойБазы = 0;
  1167.  
  1168. // Формирование строки соединения.
  1169. ШаблонСтрокиСоединения = "[СтрокаБазы][СтрокаАутентификации];UC=ПакетноеОбновлениеКонфигурацииИБ";
  1170.  
  1171. Если ФайловыйВариантРаботы Тогда
  1172. СтрокаБазы = "File = ""&КаталогИнформационнойБазы""";
  1173. СтрокаБазы = СтрЗаменить(СтрокаБазы, "&КаталогИнформационнойБазы", ПараметрыПодключения.КаталогИнформационнойБазы);
  1174. Иначе
  1175. СтрокаБазы = "Srvr = ""&ИмяСервера1СПредприятия""; Ref = ""&ИмяИнформационнойБазыНаСервере1СПредприятия""";
  1176. СтрокаБазы = СтрЗаменить(СтрокаБазы, "&ИмяСервера1СПредприятия", ПараметрыПодключения.ИмяСервера1СПредприятия);
  1177. СтрокаБазы = СтрЗаменить(СтрокаБазы, "&ИмяИнформационнойБазыНаСервере1СПредприятия", ПараметрыПодключения.ИмяИнформационнойБазыНаСервере1СПредприятия);
  1178. КонецЕсли;
  1179.  
  1180. Если ПараметрыПодключения.АутентификацияОперационнойСистемы Тогда
  1181. СтрокаАутентификации = "";
  1182. Иначе
  1183.  
  1184. Если СтрНайти(ПараметрыПодключения.ИмяПользователя, """") Тогда
  1185. ПараметрыПодключения.ИмяПользователя = СтрЗаменить(ПараметрыПодключения.ИмяПользователя, """", """""");
  1186. КонецЕсли;
  1187.  
  1188. Если СтрНайти(ПараметрыПодключения.ПарольПользователя, """") Тогда
  1189. ПараметрыПодключения.ПарольПользователя = СтрЗаменить(ПараметрыПодключения.ПарольПользователя, """", """""");
  1190. КонецЕсли;
  1191.  
  1192. СтрокаАутентификации = "; Usr = ""&ИмяПользователя""; Pwd = ""&ПарольПользователя""";
  1193. СтрокаАутентификации = СтрЗаменить(СтрокаАутентификации, "&ИмяПользователя", ПараметрыПодключения.ИмяПользователя);
  1194. СтрокаАутентификации = СтрЗаменить(СтрокаАутентификации, "&ПарольПользователя", ПараметрыПодключения.ПарольПользователя);
  1195. КонецЕсли;
  1196.  
  1197. СтрокаСоединения = СтрЗаменить(ШаблонСтрокиСоединения, "[СтрокаБазы]", СтрокаБазы);
  1198. СтрокаСоединения = СтрЗаменить(СтрокаСоединения, "[СтрокаАутентификации]", СтрокаАутентификации);
  1199.  
  1200. Попытка
  1201. Соединение = COMОбъект.Connect(СтрокаСоединения);
  1202. Исключение
  1203. Лог.Ошибка(СтрШаблон(НСтр("ru = 'Не удалось подключится к другой программе:
  1204. |%1'"), ИнформацияОбОшибке()));
  1205. Возврат Неопределено;
  1206. КонецПопытки;
  1207.  
  1208. Возврат Соединение;
  1209.  
  1210. КонецФункции
  1211.  
  1212. // Устанавливает контекст библиотеки v8runner и возвращиет указатель на объект.
  1213. //
  1214. // Параметры:
  1215. // ПараметрыПодключения - Структура - Параметры подключения к информационной базе (см. в ОбновитьИнформационнуюБазу()).
  1216. //
  1217. // Возвращаемое значение:
  1218. // УправлениеКонфигуратором - объект библиотеки v8runner;
  1219. //
  1220. Функция УстановитьУправлениеКонфигуратором(Знач ПараметрыПодключения)
  1221.  
  1222. УправлениеКонфигуратором = Новый УправлениеКонфигуратором();
  1223.  
  1224. ФайловыйВариантРаботы = ПараметрыПодключения.ВариантРаботыИнформационнойБазы = 0;
  1225.  
  1226. Если ФайловыйВариантРаботы Тогда
  1227. СтрокаСоединения = "/F""&КаталогИнформационнойБазы""";
  1228. СтрокаСоединения = СтрЗаменить(СтрокаСоединения, "&КаталогИнформационнойБазы", ПараметрыПодключения.КаталогИнформационнойБазы);
  1229. Иначе
  1230. СтрокаСоединения = "/IBConnectionString""Srvr = ""&ИмяСервера1СПредприятия""; Ref = ""&ИмяИнформационнойБазыНаСервере1СПредприятия""""";
  1231. СтрокаСоединения = СтрЗаменить(СтрокаСоединения, "&ИмяСервера1СПредприятия", ПараметрыПодключения.ИмяСервера1СПредприятия);
  1232. СтрокаСоединения = СтрЗаменить(СтрокаСоединения, "&ИмяИнформационнойБазыНаСервере1СПредприятия", ПараметрыПодключения.ИмяИнформационнойБазыНаСервере1СПредприятия);
  1233. КонецЕсли;
  1234.  
  1235. Если ПараметрыПодключения.АутентификацияОперационнойСистемы Тогда
  1236. ПараметрыПодключения.ИмяПользователя = "";
  1237. ПараметрыПодключения.ПарольПользователя = "";
  1238. КонецЕсли;
  1239.  
  1240. УправлениеКонфигуратором.УстановитьКонтекст(СтрокаСоединения, ПараметрыПодключения.ИмяПользователя, ПараметрыПодключения.ПарольПользователя);
  1241. УправлениеКонфигуратором.УстановитьКлючРазрешенияЗапуска("ПакетноеОбновлениеКонфигурацииИБ");
  1242.  
  1243. УправлениеКонфигуратором.КаталогСборки(Каталоги.КаталогВременныхФайлов);
  1244.  
  1245. Возврат УправлениеКонфигуратором;
  1246.  
  1247. КонецФункции
  1248.  
  1249. Лог = Логирование.ПолучитьЛог("oscript.app.AutoUpdateIB");
  1250. Инициализировать();
  1251.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement