├── LICENSE ├── README.md ├── lib.config ├── packagedef ├── src └── AutoUpdateIB.os └── tests ├── AutoUpdateIB-test.os └── README.md /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "{}" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright {yyyy} {name of copyright owner} 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Автоматическое обновление информационных баз 2 | 3 | Процесс обновление информационных баз - достаточно долгое и трудоемкое занятие. Даже если на обслуживании находятся крайне небольшое количество баз - "ручной" порядок обновления, с необходимостью открывать каждую информационную базу, превращается в пытку. Данная библиотека позволяет автоматизировать процесс обновления. 4 | Для работы библиотеки необходимо указать логин и пароль для загрузки обновлений, параметры конфигураций и собственно параметрами доступа к информационным базам. 5 | 6 | ## Инициализация 7 | 8 | Библиотека подключается с помощью директивы `#Использовать AutoUpdateIB`. После этого в области видимости скрипта будет доступен класс `Обновлятор`. 9 | 10 | ##Примеры## 11 | 12 | Инициализация 13 | 14 | #Использовать AutoUpdateIB 15 | 16 | Обновлятор = Новый Обновлятор(); 17 | 18 | Обновление списка информационных баз разных конфигураций 19 | 20 | Обновлятор.УстановитьПараметрыАутентификации("MyCompany", "Password"); 21 | Обновлятор.УстановитьКаталоги("\\server\1CUpdate\1c"); 22 | 23 | // Бухгалтерия предприятия, редакция 3.0 24 | ПараметрыОбновленияКонфигурации = Обновлятор.ПолучитьПараметрыОбновленияКонфигурации(); 25 | Если ПараметрыОбновленияКонфигурации <> Неопределено Тогда 26 | 27 | ПараметрыПодключения = Обновлятор.ПолучитьПараметрыПодключения(,"\\server\1C base\InfoBase 8.3 (Accounting 3.0)",,,,"Иванов И.И.","Password"); 28 | Обновлятор.ОбновитьИнформационнуюБазу(ПараметрыОбновленияКонфигурации, ПараметрыПодключения); 29 | 30 | ПараметрыПодключения = Обновлятор.ПолучитьПараметрыПодключения(1,,"Server","Base1C"); 31 | Обновлятор.ОбновитьИнформационнуюБазу(ПараметрыОбновленияКонфигурации, ПараметрыПодключения); 32 | 33 | КонецЕсли; 34 | 35 | // Зарплата и управление персоналом, редакция 3.0 36 | ПараметрыОбновленияКонфигурации = Обновлятор.ПолучитьПараметрыОбновленияКонфигурации("HRM", "3.0"); 37 | Если ПараметрыОбновленияКонфигурации <> Неопределено Тогда 38 | 39 | ПараметрыПодключения = Обновлятор.ПолучитьПараметрыПодключения(,"\\server\1C base\InfoBase 8.3 (HRM 3.0)",,,,"Иванов И.И.","Password"); 40 | Обновлятор.ОбновитьИнформационнуюБазу(ПараметрыОбновленияКонфигурации, ПараметрыПодключения); 41 | 42 | КонецЕсли; 43 | 44 | Резервное копирование информационной базы 45 | 46 | Обновлятор.УстановитьПараметрыРезервногоКопирования(,"\\server\1C backup\InfoBase 8.3 (Accounting 3.0)"); 47 | ПараметрыПодключения = ПолучитьПараметрыПодключения(,"\\server\1C base\InfoBase 8.3 (Accounting 3.0)",,,,"Иванов И.И.","Password"); 48 | Обновлятор.СоздатьРезервнуюКопию(ПараметрыПодключения); 49 | 50 | Немедленное отключение пользователей информационной базы и установка блокировки соединений на 10 минут 51 | 52 | Обновлятор.УстановитьПараметрыБлокировкиCеансов(Истина, Ложь, 0); 53 | ПараметрыПодключения = ПолучитьПараметрыПодключения(,"\\server\1C base\InfoBase 8.3 (Accounting 3.0)",,,,"Иванов И.И.","Password"); 54 | Обновлятор.УстановитьБлокировкуСоединений(ПараметрыПодключения); 55 | Приостановить(10 *60 * 1000); // Ждем 10 минут. 56 | Обновлятор.РазрешитьПодключение(ПараметрыПодключения); 57 | 58 | ## Синтаксис 59 | 60 | ***ПолучитьПараметрыОбновленияКонфигурации*** 61 | **Синтаксис:** 62 | ПолучитьПараметрыОбновленияКонфигурации(<ТипКонфигурации>, <ВерсияРелиза>, <ВерсияПлатформы>) 63 | **Параметры:** 64 | *<ТипКонфигурации>* 65 | Тип: Строка. 66 | Краткое наименование конфигурации (Accounting - бухгалтерия, HRM - ЗУП ...). Значение по умолчанию: "Accounting". 67 | *<ВерсияРелиза>* 68 | Тип: Строка. 69 | Версия релиза. Значение по умолчанию: "30". 70 | *<ВерсияПлатформы>* 71 | Тип: Строка. 72 | Версия платформы (82, 83). Значение по умолчанию: "83". 73 | **Возвращаемое значение** 74 | Структура с параметрами обновления конкретной конфигурации. Неопределено в случае ошибки. 75 | **Описание:** 76 | Получает параметры обновления конфигурации. Загружает файл со списком обновлений с сервера проверки обновлений для конфигурации. Анализирует полученный файл, собирает сведения о версиях. 77 | **Пример:** 78 | 79 | Обновлятор.ПолучитьПараметрыОбновленияКонфигурации("Accounting", "20", "82"); 80 | 81 | 82 | ***ПолучитьПараметрыПодключения*** 83 | **Синтаксис:** 84 | ПолучитьПараметрыПодключения(<ВариантРаботыИнформационнойБазы>, <КаталогИнформационнойБазы>, <ИмяСервера1СПредприятия>, <ИмяИнформационнойБазыНаСервере1СПредприятия>, <АутентификацияОперационнойСистемы>, <ИмяПользователя>, <ПарольПользователя>, <ВерсияПлатформы>) 85 | **Параметры:** 86 | *<ВариантРаботыИнформационнойБазы>* 87 | Тип: Число. 88 | Вариант работы информационной базы: 0 - файловый; 1 - клиент-серверный. Значение по умолчанию: 0. 89 | *<КаталогИнформационнойБазы>* 90 | Тип: Строка. 91 | Каталог информационной базы для файлового режима работы. Не указывается в случае клиент-серверного режима работы. 92 | *<ИмяСервера1СПредприятия>* 93 | Тип: Строка. 94 | Имя сервера 1С:Предприятия. Не указывается в случае файлового режима работы. 95 | *<ИмяИнформационнойБазыНаСервере1СПредприятия>* 96 | Тип: Строка. 97 | Имя информационной базы на сервере 1С:Предприятия. Не указывается в случае файлового режима работы. 98 | *<АутентификацияОперационнойСистемы>* 99 | Тип: Булево. 100 | Признак аутентификации операционной системы при создании внешнего подключения к информационной базе. Значение по умолчанию: Ложь. 101 | *<ИмяПользователя>* 102 | Тип: Строка. 103 | Имя пользователя информационной базы. 104 | *<ПарольПользователя>* 105 | Тип: Строка. 106 | Пароль пользователя информационной базы. 107 | *<ВерсияПлатформы>* 108 | Тип: Строка. 109 | Версия платформы (82, 83). Значение по умолчанию: "83". 110 | **Возвращаемое значение** 111 | Структура с параметрами подключения к информационной базе. Неопределено в случае ошибки. 112 | **Описание:** 113 | Получает параметры подключения к информационной базе. 114 | **Пример:** 115 | 116 | ПараметрыПодключения = ПолучитьПараметрыПодключения(,"\\server\1C base\InfoBase 8.3 (Accounting 3.0)",,,,"Администратор","Password"); 117 | 118 | 119 | ***ОбновитьИнформационнуюБазу*** 120 | **Синтаксис:** 121 | ОбновитьИнформационнуюБазу(<ПараметрыОбновленияКонфигурации>, <ПараметрыПодключения>, <БлокироватьСоединенияИБ>, <СоздаватьРезервнуюКопию>, <ВыполнитьОтложенныеОбработчики>, <ВыполнятьСжатиеТаблицИБ>, <ВосстанавливатьИнформационнуюБазу>) 122 | **Параметры:** 123 | *<ПараметрыОбновленияКонфигурации>* 124 | Тип: Структура. 125 | Параметры обновления текущей конфигурации (см. в ПолучитьПараметрыОбновленияКонфигурации()). 126 | *<ПараметрыПодключения>* 127 | Тип: Структура. 128 | Параметры подключения к информационной базе (см. в ПолучитьПараметрыПодключения()). 129 | *<ВыполнитьОтложенныеОбработчики>* 130 | Тип: Булево. 131 | Выполнить отложенные обработчики обновления. Значение по умолчанию: Истина. 132 | *<ВыполнятьСжатиеТаблицИБ>* 133 | Тип: Булево. 134 | Запускать сжатие таблиц информационной базы. Значение по умолчанию: Истина. 135 | **Возвращаемое значение** 136 | Признак успешного выполнения. 137 | **Описание:** 138 | 139 | 1. Получает текущую версию и признак изменения конфигурации; 140 | 2. Ищет в каталоге файлов обновлений версию доступную для обновления; 141 | 3. Если доступных для обновления версий не найдено - скачивает обновление с сервера обновлений; 142 | 4. Завершает работу пользователей и устанавливает запрет на подключение новых соединений (только для конфигураций на БСП); 143 | 5. Создает резервную копию информационной базы; 144 | 6. Выполняет отложенные обработчики обновления (только для конфигураций на БСП); 145 | 7. Загружает файл обновления в информационную базу; 146 | 8. Обновляет конфигурации информационной базы; 147 | 9. Выполняет тестирование и исправление; 148 | 10. Принимает обновления в информационной базе (только для конфигураций на БСП); 149 | 11. Повторяет все с п.1 пока не обновится на последнюю доступную версию; 150 | 12. В случае ошибки пытается восстановиться из резервной копии (для файловых баз); 151 | 13. Разрешает подключение новых соединений (только для конфигураций на БСП). 152 | 153 | **Пример:** 154 | 155 | Обновлятор.ОбновитьИнформационнуюБазу(ПараметрыОбновленияКонфигурации, ПараметрыПодключения, Ложь); 156 | 157 | 158 | ***УстановитьБлокировкуСоединений*** 159 | **Синтаксис:** 160 | УстановитьБлокировкуСоединений(<ПараметрыПодключения>) 161 | **Параметры:** 162 | *<ПараметрыПодключения>* 163 | Тип: Структура. 164 | Параметры подключения к информационной базе (см. в ПолучитьПараметрыПодключения()). 165 | **Возвращаемое значение** 166 | Признак успешного выполнения. 167 | **Описание:** 168 | Завершает работу пользователей и устанавливает запрет на подключение новых соединений. 169 | **Пример:** 170 | 171 | Обновлятор.УстановитьБлокировкуСоединений(ПараметрыПодключения); 172 | 173 | 174 | ***СоздатьРезервнуюКопию*** 175 | **Синтаксис:** 176 | СоздатьРезервнуюКопию(<ПараметрыПодключения>) 177 | **Параметры:** 178 | *<ПараметрыПодключения>* 179 | Тип: Структура. 180 | Параметры подключения к информационной базе (см. в ПолучитьПараметрыПодключения()). 181 | **Возвращаемое значение** 182 | Признак успешного выполнения. 183 | **Описание:** 184 | Создает резервную копию информационной базы. 185 | **Пример:** 186 | 187 | Обновлятор.СоздатьРезервнуюКопию(ПараметрыПодключения); 188 | 189 | 190 | ***РазрешитьПодключение*** 191 | **Синтаксис:** 192 | РазрешитьПодключение(<ПараметрыПодключения>) 193 | **Параметры:** 194 | *<ПараметрыПодключения>* 195 | Тип: Структура. 196 | Параметры подключения к информационной базе (см. в ПолучитьПараметрыПодключения()). 197 | **Описание:** 198 | Разрешает подключение новых соединений. 199 | **Пример:** 200 | 201 | Обновлятор.РазрешитьПодключение(ПараметрыПодключения); 202 | 203 | 204 | ***УстановитьКаталоги*** 205 | **Синтаксис:** 206 | УстановитьКаталоги(<КаталогФайловОбновления>, <КаталогВременныхФайлов>) 207 | **Параметры:** 208 | *<КаталогФайловОбновления>* 209 | Тип: Строка. 210 | Каталог с файлами обновления конфигураций. 211 | *<КаталогВременныхФайлов>* 212 | Тип: Строка. 213 | Каталог для хранения временных файлов. 214 | **Описание:** 215 | Устанавливает каталоги хранения файлов обновления и временных файлов. Каталоги по умолчанию: 216 | 217 | - КаталогФайловОбновления - %UAPPDATA%\1C\1Cv8\tmplts\1c; 218 | - КаталогВременныхФайлов - %TEMP%\AutoUpdateIB; 219 | 220 | **Пример:** 221 | 222 | Обновлятор.УстановитьКаталоги("\\server\1CUpdate\1c"); 223 | 224 | 225 | ***УстановитьПараметрыАутентификации*** 226 | **Синтаксис:** 227 | УстановитьПараметрыАутентификации(<Пользователь>, <Пароль>) 228 | **Параметры:** 229 | *<Пользователь>* 230 | Тип: Строка. 231 | Имя пользователя для загрузки обновлений. 232 | *<Пароль>* 233 | Тип: Строка. 234 | Пароль пользователя для загрузки обновлений. 235 | **Описание:** 236 | Устанавливает значения параметров аутентификации. 237 | **Пример:** 238 | 239 | Обновлятор.УстановитьПараметрыАутентификации("MyCompany", "Password"); 240 | 241 | 242 | ***УстановитьПараметрыЗавершенияСоединения*** 243 | **Синтаксис:** 244 | УстановитьПараметрыЗавершенияСоединения(<ОжидатьЗавершениеСоединения>, <МаксИнтервалОжиданияФайловойИБ>, <ИнтервалОжиданияСервернойИБ>) 245 | **Параметры:** 246 | *<ОжидатьЗавершениеСоединения>* 247 | Тип: Булево. 248 | Ожидать завершения Com соединения с информационной базой. 249 | *<МаксИнтервалОжиданияФайловойИБ>* 250 | Тип: Число. 251 | Максимальный интервал ожидания завершения сеанса файловой информационной базы в секундах. 252 | *<ИнтервалОжиданияСервернойИБ>* 253 | Тип: Число. 254 | Интервал ожидания завершения сеанса клиент-серверной информационной базы в секундах. 255 | **Описание:** 256 | Устанавливает значения параметров завершения Com соединения с информационной базой. Значения по умолчанию: 257 | 258 | - ОжидатьЗавершениеСоединения - Истина; 259 | - МаксИнтервалОжиданияФайловойИБ - 60; 260 | - ИнтервалОжиданияСервернойИБ - 2. 261 | 262 | **Пример:** 263 | 264 | Обновлятор.УстановитьПараметрыЗавершенияСоединения(Истина, 10, 0); 265 | 266 | 267 | ***УстановитьПараметрыБлокировкиCеансов*** 268 | **Синтаксис:** 269 | УстановитьПараметрыБлокировкиCеансов(<БлокироватьСеансыИБ>, <ИспользованиеИБ>, <ИнтервалОжидания>) 270 | **Параметры:** 271 | *<БлокироватьСеансыИБ>* 272 | Тип: Булево. 273 | Устанавливать блокировку сеансов перед обновлением. 274 | *<ИспользованиеИБ>* 275 | Тип: Булево. 276 | Использовать значения параметров блокировки сеансов из информационной базы. 277 | *<ИнтервалОжидания>* 278 | Тип: Число. 279 | Интервал ожидания завершения работы пользователей по умолчанию в секундах. 280 | **Описание:** 281 | Устанавливает значения параметров блокировки сеансов. Значения по умолчанию: 282 | 283 | - БлокироватьСеансыИБ - Истина; 284 | - ИспользованиеИБ - Истина; 285 | - ИнтервалОжидания - 900. 286 | 287 | **Пример:** 288 | 289 | Обновлятор.УстановитьПараметрыБлокировкиCеансов(Ложь); 290 | 291 | 292 | ***УстановитьПараметрыРезервногоКопирования*** 293 | **Синтаксис:** 294 | УстановитьПараметрыРезервногоКопирования(<СоздаватьРезервнуюКопию>, <КаталогРезервныхКопий>, <ВосстанавливатьИнформационнуюБазу>) 295 | **Параметры:** 296 | *<СоздаватьРезервнуюКопию>* 297 | Тип: Булево. 298 | Создавать резервную копию. 299 | *<КаталогРезервныхКопий>* 300 | Тип: Строка. 301 | Каталог для хранения резевных копий и файлов дампа. 302 | *<ВосстанавливатьИнформационнуюБазу>* 303 | Тип: Булево. 304 | Использовать восстановление информационной базы в случае падения. 305 | **Описание:** 306 | Устанавливает значения параметров резервного копирования. Значения по умолчанию: 307 | 308 | - СоздаватьРезервнуюКопию - Истина; 309 | - КаталогРезервныхКопий - %TEMP%\AutoUpdateIB\DumpIB. 310 | - ВосстанавливатьИнформационнуюБазу - Истина. 311 | 312 | **Пример:** 313 | 314 | Обновлятор.УстановитьПараметрыРезервногоКопирования(,, Ложь); 315 | 316 | ## Установка 317 | 318 | Для работы библиотеки необходимо предварительно установить [Стандартную библиотеку скриптов 1Script](http://oscript.io/library). 319 | Клонируйте репозиторий библиотеки: 320 | 321 | git clone https://github.com/BlackDrak0n/oscript-AutoUpdateIB.git 322 | 323 | Добавьте в конфигурационном файле 1Script oscript.cfg в список дополнительных библиотек путь к каталогу, в который вы клонировали репозиторий: 324 | 325 | lib.additional = C:\libs\oscript-AutoUpdateIB; 326 | 327 | ## Лицензия 328 | 329 | Библиотека распространяется под лицензией Apache 2.0, ее текст находится в файле [LICENSE](https://github.com/BlackDrak0n/oscript-AutoUpdateIB/blob/master/LICENSE). 330 | -------------------------------------------------------------------------------- /lib.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /packagedef: -------------------------------------------------------------------------------- 1 | Описание.Имя("AutoUpdateIB") 2 | .Версия("1.0") 3 | .ЗависитОт("logos") 4 | .ЗависитОт("v8runner") 5 | .ВключитьФайл("src") 6 | .ВключитьФайл("tests") 7 | .ВключитьФайл("lib.config") 8 | -------------------------------------------------------------------------------- /src/AutoUpdateIB.os: -------------------------------------------------------------------------------- 1 | #Использовать logos 2 | #Использовать v8runner 3 | 4 | Перем Лог; 5 | Перем Каталоги; 6 | Перем ПараметрыАутентификации; 7 | Перем ПараметрыЗавершенияСоединения; 8 | Перем ПараметрыБлокировкиCеансов; 9 | Перем ПараметрыРезервногоКопирования; 10 | Перем НастройкиПодключения; 11 | 12 | ////////////////////////////////////////////////////////////////////////////////////// 13 | // Инициализация 14 | 15 | // Инициализация параметров 16 | Функция Инициализировать() 17 | 18 | Каталоги = Новый Структура; 19 | УстановитьКаталоги(); 20 | 21 | ПараметрыАутентификации = Новый Структура; 22 | УстановитьПараметрыАутентификации(); 23 | 24 | ПараметрыЗавершенияСоединения = Новый Структура; 25 | УстановитьПараметрыЗавершенияСоединения(); 26 | 27 | ПараметрыБлокировкиCеансов = Новый Структура; 28 | УстановитьПараметрыБлокировкиCеансов(); 29 | 30 | ПараметрыРезервногоКопирования = Новый Структура; 31 | УстановитьПараметрыРезервногоКопирования(); 32 | 33 | НастройкиПодключения = Новый Структура; 34 | НастройкиПодключения.Вставить("СерверПроверкиОбновлений", "downloads.1c.ru"); // Адрес сервера для проверки наличия обновлений (открытая часть). 35 | НастройкиПодключения.Вставить("ПутьКФайлуПроверкиОбновлений", "/ipp/ITSREPV/V8Update/Configs"); // Путь к файлу проверки обновлений на сервере. 36 | НастройкиПодключения.Вставить("СерверОбновлений", "downloads.v8.1c.ru"); //Адрес сервера обновлений (закрытая часть). 37 | НастройкиПодключения.Вставить("ПутьКФайлуОбновлений", "/tmplts"); // Путь к файлу обновлений на сервере. 38 | 39 | КонецФункции 40 | 41 | // Устанавливает каталоги хранения файлов обновления и временных файлов 42 | // 43 | // Параметры: 44 | // КаталогФайловОбновления - Строка - Каталог с файлами обновления конфигураций; 45 | // КаталогВременныхФайлов - Строка - Каталог для хранения временных файлов. 46 | // 47 | Процедура УстановитьКаталоги(КаталогФайловОбновления = "", КаталогВременныхФайлов = "") Экспорт 48 | 49 | СистемнаяИнформация = Новый СистемнаяИнформация(); 50 | 51 | Если ПустаяСтрока(КаталогФайловОбновления) Тогда 52 | КаталогAPPDATA = СистемнаяИнформация.ПолучитьПеременнуюСреды("APPDATA"); 53 | КаталогФайловОбновления = ОбъединитьПути(КаталогAPPDATA, "1C\1Cv8\tmplts\1c"); 54 | КонецЕсли; 55 | Если НЕ ОбеспечитьКаталог(КаталогФайловОбновления) Тогда 56 | ВызватьИсключение "Выполнение обработки прервано"; 57 | КонецЕсли; 58 | 59 | Если ПустаяСтрока(КаталогВременныхФайлов) Тогда 60 | КаталогTEMP = СистемнаяИнформация.ПолучитьПеременнуюСреды("TEMP"); 61 | КаталогВременныхФайлов = ОбъединитьПути(КаталогTEMP, "AutoUpdateIB"); 62 | КонецЕсли; 63 | Если НЕ ОбеспечитьКаталог(КаталогВременныхФайлов) Тогда 64 | ВызватьИсключение "Выполнение обработки прервано"; 65 | КонецЕсли; 66 | 67 | Каталоги.Вставить("КаталогФайловОбновления", КаталогФайловОбновления); 68 | Каталоги.Вставить("КаталогВременныхФайлов", КаталогВременныхФайлов); 69 | 70 | Лог.Отладка(НСтр("ru = 'Установлены каталоги:'")); 71 | Для Каждого Параметр Из Каталоги Цикл 72 | Лог.Отладка(СтрШаблон(НСтр("ru = ' %1 - ""%2"";'"), Параметр.Ключ, Параметр.Значение)); 73 | КонецЦикла; 74 | 75 | КонецПроцедуры 76 | 77 | // Устанавливает значения параметров аутентификации 78 | // 79 | // Параметры: 80 | // Пользователь - Строка - Имя пользователя для загрузки обновлений; 81 | // Пароль - Строка - Пароль пользователя для загрузки обновлений. 82 | // 83 | Процедура УстановитьПараметрыАутентификации(Пользователь = "", Пароль = "") Экспорт 84 | 85 | ПараметрыАутентификации.Вставить("Пользователь", Пользователь); 86 | ПараметрыАутентификации.Вставить("Пароль", Пароль); 87 | 88 | Лог.Отладка(НСтр("ru = 'Установлены параметры аутентификации:'")); 89 | Для Каждого Параметр Из ПараметрыАутентификации Цикл 90 | Лог.Отладка(СтрШаблон(НСтр("ru = ' %1 - ""%2"";'"), Параметр.Ключ, Параметр.Значение)); 91 | КонецЦикла; 92 | 93 | КонецПроцедуры 94 | 95 | // Устанавливает значения параметров завершения Com соединения с информационной базой 96 | // 97 | // Параметры: 98 | // ОжидатьЗавершениеСоединения - Булево - Ожидать завершения Com соединения с информационной базой; 99 | // МаксИнтервалОжиданияФайловойИБ - Число - Максимальный интервал ожидания завершения сеанса файловой информационной базы в секундах; 100 | // ИнтервалОжиданияСервернойИБ - Число - Интервал ожидания завершения сеанса клиент-серверной информационной базы в секундах. 101 | // 102 | Процедура УстановитьПараметрыЗавершенияСоединения(ОжидатьЗавершениеСоединения = Истина, МаксИнтервалОжиданияФайловойИБ = 60, ИнтервалОжиданияСервернойИБ = 2) Экспорт 103 | 104 | ПараметрыЗавершенияСоединения.Вставить("ОжидатьЗавершениеСоединения", ОжидатьЗавершениеСоединения); 105 | ПараметрыЗавершенияСоединения.Вставить("МаксИнтервалОжиданияФайловойИБ", МаксИнтервалОжиданияФайловойИБ); 106 | ПараметрыЗавершенияСоединения.Вставить("ИнтервалОжиданияСервернойИБ", ИнтервалОжиданияСервернойИБ); 107 | 108 | Лог.Отладка(НСтр("ru = 'Установлены параметры завершения соединения:'")); 109 | Для Каждого Параметр Из ПараметрыЗавершенияСоединения Цикл 110 | Лог.Отладка(СтрШаблон(НСтр("ru = ' %1 - ""%2"";'"), Параметр.Ключ, Параметр.Значение)); 111 | КонецЦикла; 112 | 113 | КонецПроцедуры 114 | 115 | // Устанавливает значения параметров блокировки сеансов 116 | // 117 | // Параметры: 118 | // БлокироватьСеансыИБ - Булево - Устанавливать блокировку сеансов перед обновлением; 119 | // ИспользованиеИБ - Булево - Использовать значения параметров блокировки сеансов из информационной базы; 120 | // ИнтервалОжидания - Число - Интервал ожидания завершения работы пользователей по умолчанию в секундах. 121 | // 122 | Процедура УстановитьПараметрыБлокировкиCеансов(БлокироватьСеансыИБ = Истина, ИспользованиеИБ = Истина, ИнтервалОжидания = 900) Экспорт 123 | 124 | ПараметрыБлокировкиCеансов.Вставить("БлокироватьСеансыИБ", БлокироватьСеансыИБ); 125 | ПараметрыБлокировкиCеансов.Вставить("ИспользованиеИБ", ИспользованиеИБ); 126 | ПараметрыБлокировкиCеансов.Вставить("ИнтервалОжидания", ИнтервалОжидания); 127 | 128 | Лог.Отладка(НСтр("ru = 'Установлены параметры блокировки сеансов:'")); 129 | Для Каждого Параметр Из ПараметрыБлокировкиCеансов Цикл 130 | Лог.Отладка(СтрШаблон(НСтр("ru = ' %1 - ""%2"";'"), Параметр.Ключ, Параметр.Значение)); 131 | КонецЦикла; 132 | 133 | КонецПроцедуры 134 | 135 | // Устанавливает значения параметров резервного копирования 136 | // 137 | // Параметры: 138 | // СоздаватьРезервнуюКопию - Булево - Создавать резервную копию; 139 | // КаталогРезервныхКопий - Строка - Каталог для хранения резевных копий и файлов дампа; 140 | // ВосстанавливатьИнформационнуюБазу - Булево - Использовать восстановление информационной базы в случае падения. 141 | // 142 | Процедура УстановитьПараметрыРезервногоКопирования(СоздаватьРезервнуюКопию = Истина, КаталогРезервныхКопий = "", ВосстанавливатьИнформационнуюБазу = Истина) Экспорт 143 | 144 | Если СоздаватьРезервнуюКопию Тогда 145 | Если ПустаяСтрока(КаталогРезервныхКопий) Тогда 146 | СистемнаяИнформация = Новый СистемнаяИнформация(); 147 | КаталогTEMP = СистемнаяИнформация.ПолучитьПеременнуюСреды("TEMP"); 148 | КаталогРезервныхКопий = ОбъединитьПути(КаталогTEMP, "AutoUpdateIB", "DumpIB"); 149 | КонецЕсли; 150 | Если НЕ ОбеспечитьКаталог(КаталогРезервныхКопий) Тогда 151 | ВызватьИсключение "Выполнение обработки прервано"; 152 | КонецЕсли; 153 | КонецЕсли; 154 | 155 | ПараметрыРезервногоКопирования.Вставить("СоздаватьРезервнуюКопию", СоздаватьРезервнуюКопию); 156 | ПараметрыРезервногоКопирования.Вставить("КаталогРезервныхКопий", КаталогРезервныхКопий); 157 | ПараметрыРезервногоКопирования.Вставить("ВосстанавливатьИнформационнуюБазу", ВосстанавливатьИнформационнуюБазу); 158 | 159 | Лог.Отладка(НСтр("ru = 'Установлены параметры резервного копирования:'")); 160 | Для Каждого Параметр Из ПараметрыРезервногоКопирования Цикл 161 | Лог.Отладка(СтрШаблон(НСтр("ru = ' %1 - ""%2"";'"), Параметр.Ключ, Параметр.Значение)); 162 | КонецЦикла; 163 | 164 | КонецПроцедуры 165 | 166 | // Получить установленные параметры 167 | // 168 | // Параметры: 169 | // Параметр - Строка - Наименование получаемых параметров 170 | // 171 | // Возвращаемое значение: 172 | // Структура, Неопределено - Запрашиваемые параметры, неопределено в случае ошибки. 173 | // 174 | Функция ПолучитьПараметры(Параметр) Экспорт 175 | 176 | Если Параметр = "Каталоги" Тогда 177 | Возврат Каталоги; 178 | ИначеЕсли Параметр = "ПараметрыАутентификации" Тогда 179 | Возврат ПараметрыАутентификации; 180 | ИначеЕсли Параметр = "ПараметрыЗавершенияСоединения" Тогда 181 | Возврат ПараметрыЗавершенияСоединения; 182 | ИначеЕсли Параметр = "ПараметрыБлокировкиCеансов" Тогда 183 | Возврат ПараметрыБлокировкиCеансов; 184 | ИначеЕсли Параметр = "ПараметрыРезервногоКопирования" Тогда 185 | Возврат ПараметрыРезервногоКопирования; 186 | Иначе 187 | Лог.Ошибка(НСтр("ru = 'Параметр задан неверно.'")); 188 | Возврат Неопределено; 189 | КонецЕсли; 190 | 191 | КонецФункции 192 | 193 | // Устанавливает уровень лога 194 | // 195 | // Параметры: 196 | // Включить - Булево - Признак установки уровня лога в Отладка 197 | // 198 | Процедура УстановитьРежимОтладки(Включить = Истина) Экспорт 199 | 200 | Лог.УстановитьУровень(?(Включить, УровниЛога.Отладка, УровниЛога.Информация)); 201 | 202 | КонецПроцедуры 203 | 204 | // Возвращает лог 205 | Функция ПолучитьЛог() Экспорт 206 | 207 | Возврат Лог; 208 | 209 | КонецФункции 210 | 211 | /////////////////////////////////////////////////////////////////////////////// 212 | // Получение параметров конфигурации 213 | 214 | // Загружает файл со списком обновлений с сервера проверки обновлений для конфигурации. 215 | // Анализирует полученный файл, собирает сведения о версиях. 216 | // 217 | // Параметры: 218 | // ТипКонфигурации - Строка - Краткое наименование конфигурации (Accounting - бухгалтерия, HRM - ЗУП ...). 219 | // ВерсияРелиза - Строка - Версия релиза. 220 | // ВерсияПлатформы - Строка - Версия платформы (82, 83). 221 | // 222 | // Возвращаемое значение: 223 | // Структура, Неопределено - Параметры обновления конкретной конфигурации, неопределено в случае ошибки. 224 | // 225 | Функция ПолучитьПараметрыОбновленияКонфигурации(ТипКонфигурации = "Accounting", 226 | ВерсияРелиза = "30", 227 | ВерсияПлатформы = "83") Экспорт 228 | 229 | Лог.Информация("======================================================================"); 230 | Лог.Информация(СтрШаблон(НСтр("ru = 'Конфигурация %1, релиз %2, платформа %3.'"), 231 | ТипКонфигурации, ВерсияРелиза, ВерсияПлатформы)); 232 | Лог.Информация("======================================================================"); 233 | 234 | ПараметрыОбновленияКонфигурации = Новый Структура; 235 | ПараметрыОбновленияКонфигурации.Вставить("ТипКонфигурации", ТипКонфигурации); 236 | ПараметрыОбновленияКонфигурации.Вставить("ВерсияРелиза", ВерсияРелиза); 237 | ПараметрыОбновленияКонфигурации.Вставить("ВерсияПлатформы", ВерсияПлатформы); 238 | 239 | РезультатВыполнения = ПроверитьКорректностьПараметровОбновленияКонфигурациия(ПараметрыОбновленияКонфигурации); 240 | Если Не РезультатВыполнения Тогда 241 | Возврат Неопределено; 242 | КонецЕсли; 243 | 244 | РезультатВыполнения = ПолучитьСпискиОбновленияКонфигурациии(ПараметрыОбновленияКонфигурации); 245 | Если Не РезультатВыполнения Тогда 246 | Возврат Неопределено; 247 | КонецЕсли; 248 | 249 | МассивОбновлений = ПроанализироватьСпискиОбновленияКонфигурации(ПараметрыОбновленияКонфигурации); 250 | Если МассивОбновлений = Неопределено Тогда 251 | Возврат Неопределено; 252 | КонецЕсли; 253 | ПараметрыОбновленияКонфигурации.Вставить("МассивОбновлений", МассивОбновлений); 254 | 255 | Возврат ПараметрыОбновленияКонфигурации; 256 | 257 | КонецФункции 258 | 259 | // Осуществляет проверку корректности заполнения параметров конфигурации 260 | // 261 | // Параметры: 262 | // ПараметрыОбновленияКонфигурации - Структура - Параметры обновления конфигурации (см. в ПолучитьПараметрыОбновленияКонфигурации()). 263 | // 264 | // Возвращаемое значение: 265 | // Булево - Признак успешного выполнения. 266 | // 267 | Функция ПроверитьКорректностьПараметровОбновленияКонфигурациия(ПараметрыОбновленияКонфигурации) 268 | 269 | Лог.Информация(НСтр("ru = 'Проверка корректности параметров обновления конфигурации.'")); 270 | 271 | Для Каждого ПараметрОбновленияКонфигурации Из ПараметрыОбновленияКонфигурации Цикл 272 | 273 | Если ПустаяСтрока(ПараметрОбновленияКонфигурации.Значение) Тогда 274 | Лог.Ошибка(СтрШаблон(НСтр("ru = 'Не задан параметр обновления конфигурации: ""%1"".'"), ПараметрОбновленияКонфигурации.Ключ)); 275 | Возврат Ложь; 276 | КонецЕсли; 277 | 278 | КонецЦикла; 279 | 280 | Лог.Отладка(НСтр("ru = 'Проверка корректности параметров обновления конфигурации завершена.'")); 281 | 282 | Возврат Истина; 283 | 284 | КонецФункции 285 | 286 | // Получает файл со списком обновления из Интернета 287 | // 288 | // Параметры: 289 | // ПараметрыОбновленияКонфигурации - Структура - Параметры обновления конфигурации (см. в ПолучитьПараметрыОбновленияКонфигурации()). 290 | // 291 | // Возвращаемое значение: 292 | // Булево - Признак успешного выполнения. 293 | // 294 | Функция ПолучитьСпискиОбновленияКонфигурациии(ПараметрыОбновленияКонфигурации) 295 | 296 | Лог.Информация(НСтр("ru = 'Получение списков обновления.'")); 297 | 298 | ZipФайлСпискаШаблонов = ОбъединитьПути(Каталоги.КаталогВременныхФайлов, "v8upd11.zip"); 299 | ФайлСпискаШаблонов = ОбъединитьПути(Каталоги.КаталогВременныхФайлов, "v8cscdsc.xml"); 300 | 301 | // Получаем сам файл из Интернета. 302 | Попытка 303 | Соединение = Новый HTTPСоединение(НастройкиПодключения.СерверПроверкиОбновлений, , ПараметрыАутентификации.Пользователь, ПараметрыАутентификации.Пароль,); 304 | Исключение 305 | Лог.Ошибка(СтрШаблон(НСтр("ru = 'Не удалось установить HTTP-соединение с сервером %1: 306 | |%2'"), НастройкиПодключения.СерверПроверкиОбновлений, ИнформацияОбОшибке())); 307 | Возврат Ложь; 308 | КонецПопытки; 309 | 310 | АдресРесурса = СтрШаблон("%1/%2/%3/%4/v8upd11.zip", 311 | НастройкиПодключения.ПутьКФайлуПроверкиОбновлений, ПараметрыОбновленияКонфигурации.ТипКонфигурации, ПараметрыОбновленияКонфигурации.ВерсияРелиза, ПараметрыОбновленияКонфигурации.ВерсияПлатформы); 312 | Попытка 313 | HTTPЗапрос = Новый HTTPЗапрос(АдресРесурса); 314 | Соединение.Получить(HTTPЗапрос, ZipФайлСпискаШаблонов); 315 | Исключение 316 | Лог.Ошибка(СтрШаблон(НСтр("ru = 'Не удалось получить файл с сервера %1: 317 | |%2'"), НастройкиПодключения.СерверПроверкиОбновлений, ИнформацияОбОшибке())); 318 | Возврат Ложь; 319 | КонецПопытки; 320 | 321 | // Распаковываем файл 322 | Попытка 323 | ФайлZip = Новый ЧтениеZipФайла(ZipФайлСпискаШаблонов); 324 | Исключение 325 | Лог.Ошибка(СтрШаблон(НСтр("ru = 'Не удалось прочесть архив %1: 326 | |%2'"), ZipФайлСпискаШаблонов, ИнформацияОбОшибке())); 327 | Возврат Ложь; 328 | КонецПопытки; 329 | ФайлZip.ИзвлечьВсе(Каталоги.КаталогВременныхФайлов); 330 | ФайлZip.Закрыть(); 331 | 332 | // Очищаем устаревшие файлы 333 | Попытка 334 | УдалитьФайлы(ZipФайлСпискаШаблонов); 335 | Исключение 336 | Лог.Ошибка(СтрШаблон(НСтр("ru = 'Не удалось удалить временный файл %1: 337 | |%2'"), ZipФайлСпискаШаблонов, ИнформацияОбОшибке())); 338 | КонецПопытки; 339 | 340 | Лог.Отладка(НСтр("ru = 'Получение списков обновления завершено.'")); 341 | 342 | Возврат Истина; 343 | 344 | КонецФункции 345 | 346 | // Анализирует файл списка обновлений конфигурации 347 | // 348 | // Параметры: 349 | // ПараметрыОбновленияКонфигурации - Структура - Параметры обновления конфигурации (см. в ПолучитьПараметрыОбновленияКонфигурации()). 350 | // 351 | // Возвращаемое значение: 352 | // Массив, Неопределено - Массив с структурой обновлений конфигурации, неопределено в случае неудачи. 353 | // 354 | Функция ПроанализироватьСпискиОбновленияКонфигурации(ПараметрыОбновленияКонфигурации) 355 | 356 | Лог.Информация(НСтр("ru = 'Анализ списков обновления.'")); 357 | 358 | ФайлСпискаШаблонов = ОбъединитьПути(Каталоги.КаталогВременныхФайлов, "v8cscdsc.xml"); 359 | ФайлСпискаШаблоновОбъект = Новый Файл(ФайлСпискаШаблонов); 360 | Если НЕ ФайлСпискаШаблоновОбъект.Существует() Тогда 361 | Лог.Ошибка(НСтр("ru = 'XML файл списка шаблонов не найден в каталоге.'")); 362 | Возврат Неопределено; 363 | КонецЕсли; 364 | 365 | МассивОбновлений = Новый Массив; 366 | 367 | // Структура страницы: 368 | // 369 | // 370 | // ... Дата выпуска ... 371 | // 372 | // ... Поставщик ... 373 | // ... Путь к файлу обновления ... 374 | // ... Размер файла обновления ... 375 | // ... Версия ... 376 | // ... Версия для обновления ... 377 | // ... Версия для обновления ... 378 | // 379 | // 380 | 381 | Попытка 382 | 383 | ЧтениеXML = Новый ЧтениеXML; 384 | ЧтениеXML.ОткрытьФайл(ФайлСпискаШаблонов); 385 | ЧтениеXML.ПерейтиКСодержимому(); 386 | 387 | Пока ЧтениеXML.Прочитать() Цикл 388 | 389 | Если ЧтениеXML.ЛокальноеИмя = "update" И ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда 390 | 391 | ПараметрыВерсии = Новый Структура(); 392 | ВерсииДляОбновления = Новый Массив; 393 | 394 | Пока ЧтениеXML.Прочитать() Цикл 395 | Если ЧтениеXML.ЛокальноеИмя = "update" Тогда 396 | Прервать; // Дошли до конца блока 397 | КонецЕсли; 398 | 399 | Если ЧтениеXML.ЛокальноеИмя = "vendor" Тогда 400 | ЧтениеXML.Прочитать(); 401 | ПараметрыВерсии.Вставить("Поставщик", ЧтениеXML.Значение); 402 | ИначеЕсли ЧтениеXML.ЛокальноеИмя = "version" Тогда 403 | ЧтениеXML.Прочитать(); 404 | ПараметрыВерсии.Вставить("Версия", СтрЗаменить(ЧтениеXML.Значение, ".", "_")); 405 | ИначеЕсли ЧтениеXML.ЛокальноеИмя = "file" Тогда 406 | ЧтениеXML.Прочитать(); 407 | ПараметрыВерсии.Вставить("ПутьКФайлуОбновления", ЧтениеXML.Значение); 408 | ИначеЕсли ЧтениеXML.ЛокальноеИмя = "size" Тогда 409 | ЧтениеXML.Прочитать(); 410 | ПараметрыВерсии.Вставить("РазмерФайлаОбновления", ЧтениеXML.Значение); 411 | ИначеЕсли ЧтениеXML.ЛокальноеИмя = "target" Тогда 412 | ЧтениеXML.Прочитать(); 413 | ВерсииДляОбновления.Добавить(СтрЗаменить(ЧтениеXML.Значение, ".", "_")); 414 | КонецЕсли; 415 | ЧтениеXML.Прочитать(); // в конец элемента 416 | КонецЦикла; 417 | 418 | ПараметрыВерсии.Вставить("ВерсииДляОбновления", ВерсииДляОбновления); 419 | МассивОбновлений.Добавить(ПараметрыВерсии); 420 | 421 | КонецЕсли; 422 | 423 | КонецЦикла; 424 | 425 | Исключение 426 | 427 | Лог.Ошибка(СтрШаблон(НСтр("ru = 'Ошибка при чтении файла списка обновлений. 428 | |%1'"), ИнформацияОбОшибке())); 429 | ЧтениеXML.Закрыть(); 430 | 431 | Возврат Неопределено; 432 | 433 | КонецПопытки; 434 | 435 | ЧтениеXML.Закрыть(); 436 | 437 | Попытка 438 | УдалитьФайлы(ФайлСпискаШаблонов); 439 | Исключение 440 | Лог.Ошибка(СтрШаблон(НСтр("ru = 'Не удалось удалить временный файл %1: 441 | |%2'"), ФайлСпискаШаблонов, ИнформацияОбОшибке())); 442 | КонецПопытки; 443 | 444 | Лог.Отладка(НСтр("ru = 'Анализ списков обновления завершен.'")); 445 | 446 | Возврат МассивОбновлений; 447 | 448 | КонецФункции 449 | 450 | /////////////////////////////////////////////////////////////////////////////// 451 | // Обновление инфорационной базы 452 | 453 | // Получает параметры подключения к информационной базе. 454 | // 455 | // Параметры: 456 | // ВариантРаботыИнформационнойБазы - Число - Вариант работы информационной базы: 0 - файловый; 1 - клиент-серверный; 457 | // КаталогИнформационнойБазы - Строка - Каталог информационной базы для файлового режима работы; 458 | // ИмяСервера1СПредприятия - Строка - Имя сервера 1С:Предприятия; 459 | // ИмяИнформационнойБазыНаСервере1СПредприятия - Строка - Имя информационной базы на сервере 1С:Предприятия; 460 | // АутентификацияОперационнойСистемы - Булево - Признак аутентификации операционной системы при создании внешнего подключения к информационной базе; 461 | // ИмяПользователя - Строка - Имя пользователя информационной базы; 462 | // ПарольПользователя - Строка - Пароль пользователя информационной базы; 463 | // ВерсияПлатформы - Строка - Версия платформы (82, 83). 464 | // 465 | // Возвращаемое значение: 466 | // Структура, Неопределено - Параметры подключения к информационной базе, неопределено в случае ошибки. 467 | // 468 | Функция ПолучитьПараметрыПодключения(ВариантРаботыИнформационнойБазы = 0, 469 | КаталогИнформационнойБазы = "", 470 | ИмяСервера1СПредприятия = "", 471 | ИмяИнформационнойБазыНаСервере1СПредприятия = "", 472 | АутентификацияОперационнойСистемы = Ложь, 473 | ИмяПользователя = "Администратор", 474 | ПарольПользователя = "", 475 | ВерсияПлатформы = "83") Экспорт 476 | 477 | Лог.Информация("----------------------------------------------------------------------"); 478 | Лог.Информация(СтрШаблон(НСтр("ru = 'Информационная база %1.'"), 479 | ?(ВариантРаботыИнформационнойБазы = 0, КаталогИнформационнойБазы, ИмяИнформационнойБазыНаСервере1СПредприятия))); 480 | Лог.Информация("----------------------------------------------------------------------"); 481 | 482 | ПараметрыПодключения = Новый Структура(); 483 | 484 | ПараметрыПодключения.Вставить("ВариантРаботыИнформационнойБазы", ВариантРаботыИнформационнойБазы); 485 | ПараметрыПодключения.Вставить("КаталогИнформационнойБазы", КаталогИнформационнойБазы); 486 | ПараметрыПодключения.Вставить("ИмяСервера1СПредприятия", ИмяСервера1СПредприятия); 487 | ПараметрыПодключения.Вставить("ИмяИнформационнойБазыНаСервере1СПредприятия", ИмяИнформационнойБазыНаСервере1СПредприятия); 488 | 489 | ПараметрыПодключения.Вставить("АутентификацияОперационнойСистемы", АутентификацияОперационнойСистемы); 490 | ПараметрыПодключения.Вставить("ИмяПользователя", ИмяПользователя); 491 | ПараметрыПодключения.Вставить("ПарольПользователя", ПарольПользователя); 492 | 493 | ПараметрыПодключения.Вставить("ВерсияПлатформы", ВерсияПлатформы); 494 | 495 | РезультатВыполнения = ПроверитьКорректностьПараметровПодключения(ПараметрыПодключения); 496 | Если Не РезультатВыполнения Тогда 497 | Возврат Неопределено; 498 | КонецЕсли; 499 | 500 | Возврат ПараметрыПодключения; 501 | 502 | КонецФункции 503 | 504 | // Обновляет информационную базу. 505 | // 506 | // Параметры: 507 | // ПараметрыОбновленияКонфигурации - Структура - Параметры обновления текущей конфигурации (см. в ПолучитьПараметрыОбновленияКонфигурации()). 508 | // ПараметрыПодключения - Структура - Параметры подключения к информационной базе (см. в ПолучитьПараметрыПодключения()). 509 | // ВыполнитьОтложенныеОбработчики - Булево - Выполнить отложенные обработчики обновления; 510 | // ВыполнятьСжатиеТаблицИБ - Булево - Запускать сжатие таблиц информационной базы. 511 | // 512 | // Возвращаемое значение: 513 | // Булево - Признак успешного выполнения. 514 | // 515 | Функция ОбновитьИнформационнуюБазу(ПараметрыОбновленияКонфигурации, ПараметрыПодключения, 516 | ВыполнитьОтложенныеОбработчики = Истина, 517 | ВыполнятьСжатиеТаблицИБ = Истина) Экспорт 518 | 519 | ФайлРезервнойКопии = ""; 520 | 521 | Пока Истина Цикл 522 | 523 | ВерсияДляОбновления = ПроверитьНаличиеОбновлений(ПараметрыОбновленияКонфигурации, ПараметрыПодключения); 524 | Если ВерсияДляОбновления = Неопределено Тогда 525 | Возврат Ложь; 526 | ИначеЕсли ВерсияДляОбновления = "ОбновленийНеТребуется" Тогда 527 | Возврат Истина; 528 | КонецЕсли; 529 | 530 | РезультатВыполнения = УстановитьБлокировкуСоединений(ПараметрыПодключения); 531 | Если Не РезультатВыполнения Тогда 532 | Прервать; 533 | КонецЕсли; 534 | 535 | Если ПустаяСтрока(ФайлРезервнойКопии) Тогда 536 | РезультатВыполнения = СоздатьРезервнуюКопию(ПараметрыПодключения, ФайлРезервнойКопии); 537 | Если Не РезультатВыполнения Тогда 538 | Прервать; 539 | КонецЕсли; 540 | КонецЕсли; 541 | 542 | Если Не ВерсияДляОбновления = "КонфигурацияИзменена" Тогда 543 | 544 | Если ВыполнитьОтложенныеОбработчики Тогда 545 | РезультатВыполнения = ВыполнитьОтложенныеОбработчикиОбновления(ПараметрыПодключения); 546 | Если Не РезультатВыполнения Тогда 547 | Прервать; 548 | КонецЕсли; 549 | КонецЕсли; 550 | 551 | РезультатВыполнения = ЗагрузитьФайлОбновленияВИнформационнуюБазу(ПараметрыПодключения, ВерсияДляОбновления); 552 | Если Не РезультатВыполнения Тогда 553 | Прервать; 554 | КонецЕсли; 555 | 556 | КонецЕсли; 557 | 558 | РезультатВыполнения = ВыполнитьОбновлениеКонфигурацииИнформационнойБазы(ПараметрыПодключения); 559 | Если Не РезультатВыполнения Тогда 560 | Прервать; 561 | КонецЕсли; 562 | 563 | Если ВыполнятьСжатиеТаблицИБ Тогда 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 | // ПараметрыПодключения - Структура - Параметры подключения к информационной базе (см. в ПолучитьПараметрыПодключения()). 591 | // 592 | // Возвращаемое значение: 593 | // Булево - Признак успешного выполнения. 594 | // 595 | Функция ПроверитьКорректностьПараметровПодключения(ПараметрыПодключения) 596 | 597 | Лог.Информация(НСтр("ru = 'Проверка корректности параметров подключения.'")); 598 | 599 | ФайловыйВариантРаботы = ПараметрыПодключения.ВариантРаботыИнформационнойБазы = 0; 600 | Если ФайловыйВариантРаботы Тогда 601 | Если ПустаяСтрока(ПараметрыПодключения.КаталогИнформационнойБазы) Тогда 602 | Лог.Ошибка(НСтр("ru = 'Не задано месторасположение каталога информационной базы.'")); 603 | Возврат Ложь; 604 | КонецЕсли; 605 | Иначе 606 | Если ПустаяСтрока(ПараметрыПодключения.ИмяСервера1СПредприятия) Или ПустаяСтрока(ПараметрыПодключения.ИмяИнформационнойБазыНаСервере1СПредприятия) Тогда 607 | Лог.Ошибка(НСтр("ru = 'Не заданы обязательные параметры подключения: ""Имя сервера""; ""Имя информационной базы на сервере"".'")); 608 | Возврат Ложь; 609 | КонецЕсли; 610 | КонецЕсли; 611 | 612 | Лог.Отладка(НСтр("ru = 'Проверка корректности параметров подключения завершена.'")); 613 | 614 | Возврат Истина; 615 | 616 | КонецФункции 617 | 618 | // Проверяет наличие обновлений для информационной базы 619 | // 620 | // Параметры: 621 | // ПараметрыОбновленияКонфигурации - Структура - Параметры обновления текущей конфигурации (см. в ОбработкаКонфигурации()). 622 | // ПараметрыПодключения - Структура - Параметры подключения к информационной базе (см. в ПолучитьПараметрыПодключения()); 623 | // 624 | // Возвращаемое значение: 625 | // Структура, Строка, Неопределено - Параметры версии для обновления, "КонфигурацияИзменена", "ОбновленийНеТребуется", неопределено в случае неудачи. 626 | // 627 | Функция ПроверитьНаличиеОбновлений(ПараметрыОбновленияКонфигурации, ПараметрыПодключения) 628 | 629 | Лог.Информация(НСтр("ru = 'Проверка наличия обновлений.'")); 630 | 631 | // Получение параметров информационной базы 632 | Соединение = УстановитьВнешнееСоединениеСБазой(ПараметрыПодключения); 633 | Если Соединение = Неопределено Тогда 634 | Возврат Неопределено; 635 | КонецЕсли; 636 | 637 | ТекущаяВерсия = СтрЗаменить(Соединение.Метаданные.Версия, ".", "_"); 638 | Лог.Информация(СтрШаблон(НСтр("ru = 'Текущая версия конфигурации информационной базы: %1.'"), ТекущаяВерсия)); 639 | 640 | КонфигурацияИзменена = Соединение.КонфигурацияИзменена(); 641 | 642 | ОсвободитьОбъект(Соединение); 643 | ВыполнитьСборкуМусора(); 644 | Соединение = Неопределено; 645 | ОжидатьЗавершения(ПараметрыПодключения); 646 | 647 | Если КонфигурацияИзменена Тогда 648 | Лог.Информация(НСтр("ru = 'Основная конфигурация отличается от конфигурации базы данных.'")); 649 | Возврат "КонфигурацияИзменена"; 650 | КонецЕсли; 651 | 652 | // Прверка наличия обновлений 653 | ВерсияДляОбновления = Неопределено; 654 | ЗагруженноеОбновлениеНайдено = Ложь; 655 | МассивОбновлений = ПараметрыОбновленияКонфигурации.МассивОбновлений; 656 | 657 | КоличествоОбновлений = МассивОбновлений.Количество(); 658 | Для Сч = 1 По КоличествоОбновлений Цикл 659 | 660 | ПараметрыВерсии = МассивОбновлений[КоличествоОбновлений - Сч]; 661 | МассивВерсийДляОбновления = ПараметрыВерсии.ВерсииДляОбновления.Найти(ТекущаяВерсия); 662 | Если МассивВерсийДляОбновления = Неопределено Тогда 663 | Продолжить; 664 | КонецЕсли; 665 | 666 | КаталогФайлаОбновленияВерсии = ОбъединитьПути(Каталоги.КаталогФайловОбновления, ПараметрыОбновленияКонфигурации.ТипКонфигурации, ПараметрыВерсии.Версия); 667 | ФайлОбновленияВерсии = ОбъединитьПути(КаталогФайлаОбновленияВерсии, "1cv8.cfu"); 668 | 669 | ФайлОбновленияВерсииОбъект = Новый Файл(ФайлОбновленияВерсии); 670 | Если ФайлОбновленияВерсииОбъект.Существует() Тогда 671 | ЗагруженноеОбновлениеНайдено = Истина; 672 | ВерсияДляОбновления = ПараметрыВерсии; 673 | ВерсияДляОбновления.Вставить("Каталог", КаталогФайлаОбновленияВерсии); 674 | Лог.Информация(СтрШаблон(НСтр("ru = 'Загружена и доступна для обновления версия: %1.'"), ПараметрыВерсии.Версия)); 675 | Прервать; 676 | КонецЕсли; 677 | 678 | Если ВерсияДляОбновления = Неопределено Тогда 679 | ВерсияДляОбновления = ПараметрыВерсии; 680 | ВерсияДляОбновления.Вставить("Каталог", КаталогФайлаОбновленияВерсии); 681 | КонецЕсли; 682 | 683 | КонецЦикла; 684 | 685 | Если ВерсияДляОбновления = Неопределено Тогда 686 | Лог.Информация(НСтр("ru = 'Установлена последняя версия. Обновление не требуется.'")); 687 | Возврат "ОбновленийНеТребуется"; 688 | КонецЕсли; 689 | 690 | // Загрузка файлов обновления 691 | Если Не ЗагруженноеОбновлениеНайдено Тогда 692 | 693 | Лог.Информация(СтрШаблон(НСтр("ru = 'Доступна для загрузки версия: %1 (Поставщик %2, размер %3).'"), 694 | ВерсияДляОбновления.Версия, ВерсияДляОбновления.Поставщик, ВерсияДляОбновления.РазмерФайлаОбновления)); 695 | 696 | Если НЕ ПолучитьФайлыОбновлений(ВерсияДляОбновления) Тогда 697 | Возврат Неопределено; 698 | КонецЕсли; 699 | 700 | КонецЕсли; 701 | 702 | Возврат ВерсияДляОбновления; 703 | 704 | КонецФункции 705 | 706 | // Скачивает из Интернета файлы обновлений. 707 | // 708 | // Параметры: 709 | // ВерсияДляОбновления - Структура - Структура с параметрами версии для обновления. 710 | // * Поставщик - Строка - Поставщик; 711 | // * Версия - Строка - Версия; 712 | // * ПутьКФайлуОбновления - Строка - Путь к файлу обновления; 713 | // * РазмерФайлаОбновления - Строка - Размер файла обновления в байтах. 714 | // 715 | // Возвращаемое значение: 716 | // Булево - признак успешного получения. 717 | // 718 | Функция ПолучитьФайлыОбновлений(ВерсияДляОбновления) 719 | 720 | Лог.Информация(СтрШаблон(НСтр("ru = 'Получение файлов обновления версии %1.'"), ВерсияДляОбновления.Версия)); 721 | 722 | Если НЕ ОбеспечитьКаталог(ВерсияДляОбновления.Каталог) Тогда 723 | Возврат Ложь; 724 | КонецЕсли; 725 | 726 | Если НЕ ОбеспечитьКаталог(Каталоги.КаталогВременныхФайлов) Тогда 727 | Возврат Ложь; 728 | КонецЕсли; 729 | 730 | ZipФайлОбновления = ОбъединитьПути(Каталоги.КаталогВременныхФайлов, "1cv8.zip"); 731 | 732 | // Получаем сам файл из Интернета. 733 | Попытка 734 | Соединение = Новый HTTPСоединение(НастройкиПодключения.СерверОбновлений, , ПараметрыАутентификации.Пользователь, ПараметрыАутентификации.Пароль,); 735 | Исключение 736 | Лог.Ошибка(СтрШаблон(НСтр("ru = 'Не удалось установить HTTP-соединение с сервером %1: 737 | |%2'"), НастройкиПодключения.СерверОбновлений, ИнформацияОбОшибке())); 738 | Возврат Ложь; 739 | КонецПопытки; 740 | 741 | АдресРесурса = СтрШаблон("%1/%2", НастройкиПодключения.ПутьКФайлуОбновлений, ВерсияДляОбновления.ПутьКФайлуОбновления); 742 | Заголовки = Новый Соответствие(); 743 | Заголовки.Вставить("User-Agent", "1C+Enterprise/8.3"); 744 | Попытка 745 | HTTPЗапрос = Новый HTTPЗапрос(АдресРесурса, Заголовки); 746 | Соединение.Получить(HTTPЗапрос, ZipФайлОбновления); 747 | Исключение 748 | Лог.Ошибка(СтрШаблон(НСтр("ru = 'Не удалось получить файл с сервера %1: 749 | |%2'"), НастройкиПодключения.СерверОбновлений, ИнформацияОбОшибке())); 750 | Возврат Ложь; 751 | КонецПопытки; 752 | 753 | // Распаковываем файл 754 | Попытка 755 | ФайлZip = Новый ЧтениеZipФайла(ZipФайлОбновления); 756 | Исключение 757 | Лог.Ошибка(СтрШаблон(НСтр("ru = 'Не удалось прочесть архив %1: 758 | |%2'"), ZipФайлОбновления, ИнформацияОбОшибке())); 759 | Возврат Ложь; 760 | КонецПопытки; 761 | ФайлZip.ИзвлечьВсе(ВерсияДляОбновления.Каталог); 762 | ФайлZip.Закрыть(); 763 | 764 | // Очищаем устаревшие файлы 765 | Попытка 766 | УдалитьФайлы(ZipФайлОбновления); 767 | Исключение 768 | Лог.Ошибка(СтрШаблон(НСтр("ru = 'Не удалось удалить временный файл %1: 769 | |%2'"), ZipФайлОбновления, ИнформацияОбОшибке())); 770 | Возврат Ложь; 771 | КонецПопытки; 772 | 773 | Лог.Отладка(НСтр("ru = 'Файлы обновления успешно получены.'")); 774 | 775 | Возврат Истина; 776 | 777 | КонецФункции 778 | 779 | // Завершает работу пользователей и устанавливает запрет на подключение новых соединений. 780 | // 781 | // Параметры: 782 | // ПараметрыПодключения - Структура - Параметры подключения к информационной базе (см. в ПолучитьПараметрыПодключения()). 783 | // 784 | // Возвращаемое значение: 785 | // Булево - Признак успешного выполнения. 786 | // 787 | Функция УстановитьБлокировкуСоединений(ПараметрыПодключения) Экспорт 788 | 789 | Если НЕ ПараметрыБлокировкиCеансов.БлокироватьСеансыИБ Тогда 790 | Возврат Истина; 791 | КонецЕсли; 792 | 793 | Лог.Информация(НСтр("ru = 'Завершение работы пользователей и установка запрета на подключение новых соединений.'")); 794 | 795 | // Получение параметров информационной базы 796 | Соединение = УстановитьВнешнееСоединениеСБазой(ПараметрыПодключения); 797 | Если Соединение = Неопределено Тогда 798 | Возврат Ложь; 799 | КонецЕсли; 800 | 801 | Попытка 802 | 803 | Соединение.СоединенияИБ.УстановитьБлокировкуСоединений( 804 | НСтр("ru = 'в связи с необходимостью обновления конфигурации.'"), "ПакетноеОбновлениеКонфигурацииИБ"); 805 | ДатаСтарта = Соединение.СоединенияИБ.ПараметрыБлокировкиСеансов().Начало; 806 | 807 | Если ПараметрыБлокировкиCеансов.ИспользованиеИБ Тогда 808 | Интервал = Соединение.СоединенияИБ.ПараметрыБлокировкиСеансов().ИнтервалОжиданияЗавершенияРаботыПользователей * 1000; 809 | Иначе 810 | Интервал = ПараметрыБлокировкиCеансов.ИнтервалОжидания; 811 | КонецЕсли; 812 | 813 | Лог.Отладка(СтрШаблон(НСтр("ru = 'Параметры блокировки сеансов: 814 | | Интервал ожидания завершения работы пользователей - %1 сек 815 | | Дата старта - %2'"), Интервал, ДатаСтарта)); 816 | 817 | Если Соединение.ЗначениеЗаполнено(ДатаСтарта) Тогда 818 | 819 | Пока ТекущаяДата() - Интервал <= ДатаСтарта Цикл 820 | 821 | Если НЕ Соединение.СоединенияИБ.УстановленаБлокировкаСоединений() 822 | ИЛИ Соединение.СоединенияИБ.КоличествоСеансовИнформационнойБазы(Ложь) <= 1 Тогда 823 | Прервать; 824 | КонецЕсли; 825 | 826 | Приостановить(15 * 1000); // Ждем 15 секунд до следующей проверки. 827 | 828 | КонецЦикла; 829 | 830 | Лог.Отладка(СтрШаблон(НСтр("ru = 'Задержка: %1 сек'"), ТекущаяДата() - ДатаСтарта)); 831 | 832 | КонецЕсли; 833 | 834 | Если НЕ Соединение.СоединенияИБ.УстановленаБлокировкаСоединений() Тогда 835 | Лог.Ошибка(НСтр("ru = 'Попытка завершения работы пользователей завершилась безуспешно: отменена блокировка ИБ.'")); 836 | ОсвободитьОбъект(Соединение); 837 | ВыполнитьСборкуМусора(); 838 | Соединение = Неопределено; 839 | ОжидатьЗавершения(ПараметрыПодключения); 840 | Возврат Ложь; 841 | КонецЕсли; 842 | 843 | Если Соединение.СоединенияИБ.КоличествоСеансовИнформационнойБазы(Ложь) <= 1 Тогда 844 | Лог.Отладка(НСтр("ru = 'Установка запрета на подключение новых соединений выполнена. 845 | |Все пользователи завершили работу.'")); 846 | ОсвободитьОбъект(Соединение); 847 | ВыполнитьСборкуМусора(); 848 | Соединение = Неопределено; 849 | ОжидатьЗавершения(ПараметрыПодключения); 850 | Возврат Истина; 851 | КонецЕсли; 852 | 853 | Лог.Отладка(НСтр("ru = 'Принудительное прерывание соединений пользователей.'")); 854 | 855 | // после начала блокировки сеансы всех пользователей должны быть отключены 856 | // если этого не произошло пробуем принудительно прервать соединение. 857 | ПараметрыАдминистрирования = Соединение.СтандартныеПодсистемыСервер.ПараметрыАдминистрирования(); 858 | ПараметрыАдминистрирования.ПарольАдминистратораИнформационнойБазы = ПараметрыПодключения.ПарольПользователя; 859 | ПараметрыАдминистрирования.ПарольАдминистратораКластера = ПараметрыПодключения.ПарольПользователя; 860 | Соединение.СоединенияИБКлиентСервер.УдалитьВсеСеансыКромеТекущего(ПараметрыАдминистрирования); 861 | 862 | Если Соединение.СоединенияИБ.КоличествоСеансовИнформационнойБазы(Ложь) > 1 Тогда 863 | Соединение.СоединенияИБ.РазрешитьРаботуПользователей(); 864 | Лог.Ошибка(Соединение.СоединенияИБ.СообщениеОНеотключенныхСеансах()); 865 | ОсвободитьОбъект(Соединение); 866 | ВыполнитьСборкуМусора(); 867 | Соединение = Неопределено; 868 | ОжидатьЗавершения(ПараметрыПодключения); 869 | Возврат Ложь; 870 | КонецЕсли; 871 | 872 | Исключение 873 | Лог.Ошибка(СтрШаблон(НСтр("ru = 'Ошибка при установке запрета на подключение новых соединений. 874 | |%1'"), ИнформацияОбОшибке())); 875 | ОсвободитьОбъект(Соединение); 876 | ВыполнитьСборкуМусора(); 877 | Соединение = Неопределено; 878 | ОжидатьЗавершения(ПараметрыПодключения); 879 | Возврат Истина; 880 | КонецПопытки; 881 | 882 | ОсвободитьОбъект(Соединение); 883 | ВыполнитьСборкуМусора(); 884 | Соединение = Неопределено; 885 | ОжидатьЗавершения(ПараметрыПодключения); 886 | 887 | Лог.Отладка(НСтр("ru = 'Установка запрета на подключение новых соединений выполнена. 888 | |Работа всех пользователей прервана.'")); 889 | 890 | Возврат Истина; 891 | 892 | КонецФункции 893 | 894 | // Создает резервную копию информационной базы. 895 | // 896 | // Параметры: 897 | // ПараметрыПодключения - Структура - Параметры подключения к информационной базе (см. в ПолучитьПараметрыПодключения()); 898 | // ФайлРезервнойКопии - Строка - Полный путь к файлу резервной копии 899 | // 900 | // Возвращаемое значение: 901 | // Булево - Признак успешного выполнения. 902 | // 903 | Функция СоздатьРезервнуюКопию(ПараметрыПодключения, ФайлРезервнойКопии = "") Экспорт 904 | 905 | Если НЕ ПараметрыРезервногоКопирования.СоздаватьРезервнуюКопию Тогда 906 | Возврат Истина; 907 | КонецЕсли; 908 | 909 | Лог.Информация(НСтр("ru = 'Создание резервной копии информационной базы.'")); 910 | 911 | Если НЕ ОбеспечитьКаталог(ПараметрыРезервногоКопирования.КаталогРезервныхКопий) Тогда 912 | Возврат Ложь; 913 | КонецЕсли; 914 | 915 | ИмяФайла = "Base" + Формат(ТекущаяДата(), "ДФ=ггММддЧЧммсс"); 916 | 917 | ФайловыйВариантРаботы = ПараметрыПодключения.ВариантРаботыИнформационнойБазы = 0; 918 | 919 | Если ФайловыйВариантРаботы Тогда 920 | 921 | ФайлНаличияСоединений = Новый Файл(ОбъединитьПути(ПараметрыПодключения.КаталогИнформационнойБазы, "1Cv8tmp.1CD")); 922 | Если ФайлНаличияСоединений.Существует() Тогда 923 | ИмяФайла = ИмяФайла + "-online"; 924 | КонецЕсли; 925 | 926 | ПолноеИмяФайла = ОбъединитьПути(ПараметрыРезервногоКопирования.КаталогРезервныхКопий, ИмяФайла + ".zip"); 927 | Лог.Информация(СтрШаблон(НСтр("ru = 'Файл архива %1.'"), ПолноеИмяФайла)); 928 | 929 | ФайлZip = Новый ЗаписьZipФайла(ПолноеИмяФайла); 930 | ФайлZip.Добавить(ОбъединитьПути(ПараметрыПодключения.КаталогИнформационнойБазы, "1Cv8.1CD")); 931 | 932 | Попытка 933 | ФайлZip.Записать(); 934 | Исключение 935 | Лог.Ошибка(СтрШаблон(НСтр("ru = 'Ошибка при записи файла информационной базы в архив. 936 | |%1'"), ИнформацияОбОшибке())); 937 | Возврат Ложь; 938 | КонецПопытки; 939 | 940 | Иначе 941 | 942 | ПолноеИмяФайла = ОбъединитьПути(ПараметрыРезервногоКопирования.КаталогРезервныхКопий, ИмяФайла + ".dt"); 943 | Лог.Информация(СтрШаблон(НСтр("ru = 'Файл дампа %1.'"), ПолноеИмяФайла)); 944 | 945 | УправлениеКонфигуратором = УстановитьУправлениеКонфигуратором(ПараметрыПодключения); 946 | ПараметрыЗапуска = УправлениеКонфигуратором.ПолучитьПараметрыЗапуска(); 947 | ПараметрыЗапуска.Добавить(СтрШаблон("/DumpIB ""%1""", ПолноеИмяФайла)); 948 | 949 | Попытка 950 | УправлениеКонфигуратором.ВыполнитьКоманду(ПараметрыЗапуска); 951 | Исключение 952 | Лог.Ошибка(СтрШаблон(НСтр("ru = 'Ошибка при создании файла дампа информационной базы. 953 | |%1'"), УправлениеКонфигуратором.ВыводКоманды())); 954 | Возврат Ложь; 955 | КонецПопытки 956 | 957 | КонецЕсли; 958 | 959 | ФайлОбъект = Новый Файл(ПолноеИмяФайла); 960 | Если НЕ ФайлОбъект.Существует() Тогда 961 | Лог.Ошибка(НСтр("ru = 'Файл резервной копии не найден в каталоге.'")); 962 | Возврат Ложь; 963 | КонецЕсли; 964 | 965 | Лог.Отладка(НСтр("ru = 'Создание резервной копии информационной базы завершено.'")); 966 | 967 | ФайлРезервнойКопии = ПолноеИмяФайла; 968 | Возврат Истина; 969 | 970 | КонецФункции 971 | 972 | // Выполняет все процедуры отложенного обновления информационной базы 973 | // 974 | // Параметры: 975 | // ПараметрыПодключения - Структура - Параметры подключения к информационной базе (см. в ПолучитьПараметрыПодключения()). 976 | // 977 | // Возвращаемое значение: 978 | // Булево - Признак успешного выполнения. 979 | // 980 | Функция ВыполнитьОтложенныеОбработчикиОбновления(ПараметрыПодключения) 981 | 982 | Лог.Информация(НСтр("ru = 'Выполнение отложенных обработчиков обновления.'")); 983 | 984 | Соединение = УстановитьВнешнееСоединениеСБазой(ПараметрыПодключения); 985 | Если Соединение = Неопределено Тогда 986 | Возврат Ложь; 987 | КонецЕсли; 988 | 989 | Попытка 990 | Соединение.ОбновлениеИнформационнойБазыСлужебный.ВыполнитьОтложенноеОбновлениеСейчас(); 991 | Исключение 992 | Лог.Ошибка(СтрШаблон(НСтр("ru = 'Ошибка при выполнении отложенных обработчиков обновления. 993 | |%1'"),ИнформацияОбОшибке())); 994 | ОсвободитьОбъект(Соединение); 995 | ВыполнитьСборкуМусора(); 996 | Соединение = Неопределено; 997 | ОжидатьЗавершения(ПараметрыПодключения); 998 | Возврат Истина; 999 | КонецПопытки; 1000 | 1001 | ОсвободитьОбъект(Соединение); 1002 | ВыполнитьСборкуМусора(); 1003 | Соединение = Неопределено; 1004 | ОжидатьЗавершения(ПараметрыПодключения); 1005 | 1006 | Лог.Отладка(НСтр("ru = 'Выполнение отложенных обработчиков обновления завершено.'")); 1007 | 1008 | Возврат Истина; 1009 | 1010 | КонецФункции 1011 | 1012 | // Загружает файл обновления в информационную базу 1013 | // 1014 | // Параметры: 1015 | // ПараметрыПодключения - Структура - Параметры подключения к информационной базе (см. в ПолучитьПараметрыПодключения()); 1016 | // ВерсияДляОбновления - Строка - Версия для обновления. 1017 | // 1018 | // Возвращаемое значение: 1019 | // Булево - Признак успешного выполнения. 1020 | // 1021 | Функция ЗагрузитьФайлОбновленияВИнформационнуюБазу(ПараметрыПодключения, ВерсияДляОбновления) 1022 | 1023 | Лог.Информация(НСтр("ru = 'Загрузка файла обновления в информационную базу.'")); 1024 | 1025 | УправлениеКонфигуратором = УстановитьУправлениеКонфигуратором(ПараметрыПодключения); 1026 | 1027 | Попытка 1028 | УправлениеКонфигуратором.ОбновитьКонфигурацию(ВерсияДляОбновления.Каталог, Ложь); 1029 | Исключение 1030 | Лог.Ошибка(СтрШаблон(НСтр("ru = 'Ошибка при загрузке файла обновления в информационную базу. 1031 | |%1'"), УправлениеКонфигуратором.ВыводКоманды())); 1032 | Возврат Ложь; 1033 | КонецПопытки; 1034 | 1035 | Лог.Отладка(НСтр("ru = 'Загрузка файла обновления в информационную базу завершена.'")); 1036 | 1037 | Возврат Истина; 1038 | 1039 | КонецФункции 1040 | 1041 | // Выполняет обновление конфигурации информационной базы 1042 | // 1043 | // Параметры: 1044 | // ПараметрыПодключения - Структура - Параметры подключения к информационной базе (см. в ПолучитьПараметрыПодключения()). 1045 | // 1046 | // Возвращаемое значение: 1047 | // Булево - Признак успешного выполнения. 1048 | // 1049 | Функция ВыполнитьОбновлениеКонфигурацииИнформационнойБазы(ПараметрыПодключения) 1050 | 1051 | Лог.Информация(НСтр("ru = 'Обновление конфигурации информационной базы.'")); 1052 | 1053 | УправлениеКонфигуратором = УстановитьУправлениеКонфигуратором(ПараметрыПодключения); 1054 | 1055 | Попытка 1056 | УправлениеКонфигуратором.ОбновитьКонфигурациюБазыДанных(); 1057 | Исключение 1058 | Лог.Ошибка(СтрШаблон(НСтр("ru = 'Ошибка при обновлении конфигурации информационной базы. 1059 | |%1'"), УправлениеКонфигуратором.ВыводКоманды())); 1060 | Возврат Ложь; 1061 | КонецПопытки; 1062 | 1063 | Лог.Отладка(НСтр("ru = 'Обновление конфигурации информационной базы завершено.'")); 1064 | 1065 | Возврат Истина; 1066 | 1067 | КонецФункции 1068 | 1069 | // Выполняет тестирование и исправление 1070 | // 1071 | // Параметры: 1072 | // ПараметрыПодключения - Структура - Параметры подключения к информационной базе (см. в ПолучитьПараметрыПодключения()). 1073 | // 1074 | // Возвращаемое значение: 1075 | // Булево - Признак успешного выполнения. 1076 | // 1077 | Функция ВыполнитьТестированиеИИсправление(ПараметрыПодключения) 1078 | 1079 | Лог.Информация(НСтр("ru = 'Тестирование и исправление информационной базы.'")); 1080 | 1081 | УправлениеКонфигуратором = УстановитьУправлениеКонфигуратором(ПараметрыПодключения); 1082 | ПараметрыЗапуска = УправлениеКонфигуратором.ПолучитьПараметрыЗапуска(); 1083 | ПараметрыЗапуска.Добавить("/IBCheckAndRepair -IBCompression"); 1084 | 1085 | Попытка 1086 | УправлениеКонфигуратором.ВыполнитьКоманду(ПараметрыЗапуска); 1087 | Исключение 1088 | Лог.Ошибка(СтрШаблон(НСтр("ru = 'Ошибка при тестировании и исправлении информационной базы. 1089 | |%1'"), УправлениеКонфигуратором.ВыводКоманды())); 1090 | Возврат Ложь; 1091 | КонецПопытки; 1092 | 1093 | Лог.Отладка(НСтр("ru = 'Тестирование и исправление информационной базы завершено.'")); 1094 | 1095 | Возврат Истина; 1096 | 1097 | КонецФункции 1098 | 1099 | // Выполняет неинтерактивное обновление данных информационной базы 1100 | // 1101 | // Параметры: 1102 | // ПараметрыПодключения - Структура - Параметры подключения к информационной базе (см. в ПолучитьПараметрыПодключения()). 1103 | // 1104 | // Возвращаемое значение: 1105 | // Булево - Признак успешного выполнения. 1106 | // 1107 | Функция ПринятьОбновленияВИнформационнойБазе(ПараметрыПодключения) 1108 | 1109 | Лог.Информация(НСтр("ru = 'Принятие обновлений в информационной базе.'")); 1110 | 1111 | Соединение = УстановитьВнешнееСоединениеСБазой(ПараметрыПодключения); 1112 | Если Соединение = Неопределено Тогда 1113 | Возврат Ложь; 1114 | КонецЕсли; 1115 | 1116 | Попытка 1117 | Результат = Соединение.ОбновлениеИнформационнойБазы.ВыполнитьОбновлениеИнформационнойБазы(Ложь); 1118 | Исключение 1119 | Лог.Ошибка(СтрШаблон(НСтр("ru = 'Ошибка при принятии изменений в информационной базе. 1120 | |%1'"), ИнформацияОбОшибке())); 1121 | ОсвободитьОбъект(Соединение); 1122 | ВыполнитьСборкуМусора(); 1123 | Соединение = Неопределено; 1124 | ОжидатьЗавершения(ПараметрыПодключения); 1125 | Возврат Истина; 1126 | КонецПопытки; 1127 | 1128 | ОсвободитьОбъект(Соединение); 1129 | ВыполнитьСборкуМусора(); 1130 | Соединение = Неопределено; 1131 | ОжидатьЗавершения(ПараметрыПодключения); 1132 | 1133 | Если Результат = "Успешно" Тогда 1134 | Лог.Отладка(НСтр("ru = 'Принятие обновлений в информационной базе завершено.'")); 1135 | Возврат Истина; 1136 | ИначеЕсли Результат = "НеТребуется" Тогда 1137 | Лог.Отладка(НСтр("ru = 'Принятие обновлений в информационной базе не требуется.'")); 1138 | Возврат Истина; 1139 | Иначе 1140 | Лог.Ошибка(НСтр("ru = 'Ошибка установки монопольного режима.'")); 1141 | Возврат Ложь; 1142 | КонецЕсли; 1143 | 1144 | КонецФункции 1145 | 1146 | // Восстанавливает информационную базу из резервной копии 1147 | // 1148 | // Параметры: 1149 | // ПараметрыПодключения - Структура - Параметры подключения к информационной базе (см. в ПолучитьПараметрыПодключения()); 1150 | // ФайлРезервнойКопии - Строка - Полный путь к файлу резервной копии. 1151 | // 1152 | // Возвращаемое значение: 1153 | // Булево - Признак успешного выполнения. 1154 | // 1155 | Функция ВосстановитьИзРезервнойКопии(ПараметрыПодключения, ФайлРезервнойКопии) 1156 | 1157 | Если НЕ ПараметрыРезервногоКопирования.СоздаватьРезервнуюКопию 1158 | ИЛИ НЕ ПараметрыРезервногоКопирования.ВосстанавливатьИнформационнуюБазу Тогда 1159 | Возврат Истина; 1160 | КонецЕсли; 1161 | 1162 | Лог.Информация(НСтр("ru = 'Восстановление информационной базы из резервной копии.'")); 1163 | 1164 | Если ПустаяСтрока(ФайлРезервнойКопии) Тогда 1165 | Лог.Ошибка(НСтр("ru = 'Не указан файл резервной копии.'")); 1166 | Возврат Ложь; 1167 | КонецЕсли; 1168 | 1169 | ФайловыйВариантРаботы = ПараметрыПодключения.ВариантРаботыИнформационнойБазы = 0; 1170 | Если Не ФайловыйВариантРаботы Тогда 1171 | Лог.Ошибка(НСтр("ru = 'Восстановление клиент-серверных информационных баз не предусмотрено.'")); 1172 | Возврат Ложь; 1173 | КонецЕсли; 1174 | 1175 | Попытка 1176 | ФайлZip = Новый ЧтениеZipФайла(ФайлРезервнойКопии); 1177 | Исключение 1178 | Лог.Ошибка(СтрШаблон(НСтр("ru = 'Не удалось прочесть архив %1: 1179 | |%2'"), ФайлРезервнойКопии, ИнформацияОбОшибке())); 1180 | Возврат Ложь; 1181 | КонецПопытки; 1182 | ФайлZip.ИзвлечьВсе(ПараметрыПодключения.КаталогИнформационнойБазы); 1183 | ФайлZip.Закрыть(); 1184 | 1185 | Лог.Отладка(НСтр("ru = 'Восстановление информационной базы из резервной копии завершено.'")); 1186 | 1187 | Возврат Истина; 1188 | 1189 | КонецФункции 1190 | 1191 | // Разрешает подключение новых соединений. 1192 | // 1193 | // Параметры: 1194 | // ПараметрыПодключения - Структура - Параметры подключения к информационной базе (см. в ПолучитьПараметрыПодключения()). 1195 | // 1196 | // Возвращаемое значение: 1197 | // Булево - Признак успешного выполнения. 1198 | // 1199 | Функция РазрешитьПодключение(ПараметрыПодключения) Экспорт 1200 | 1201 | Если НЕ ПараметрыБлокировкиCеансов.БлокироватьСеансыИБ Тогда 1202 | Возврат Истина; 1203 | КонецЕсли; 1204 | 1205 | Лог.Информация(НСтр("ru = 'Разрешение подключений новых соединений.'")); 1206 | 1207 | // Получение параметров информационной базы 1208 | Соединение = УстановитьВнешнееСоединениеСБазой(ПараметрыПодключения); 1209 | Если Соединение = Неопределено Тогда 1210 | Возврат Ложь; 1211 | КонецЕсли; 1212 | 1213 | Попытка 1214 | Соединение.СоединенияИБ.РазрешитьРаботуПользователей(); 1215 | Исключение 1216 | Лог.Ошибка(СтрШаблон(НСтр("ru = 'Ошибка при разрешении подключений новых соединений. 1217 | |%1'"), ИнформацияОбОшибке())); 1218 | ОсвободитьОбъект(Соединение); 1219 | ВыполнитьСборкуМусора(); 1220 | Соединение = Неопределено; 1221 | ОжидатьЗавершения(ПараметрыПодключения); 1222 | Возврат Истина; 1223 | КонецПопытки; 1224 | 1225 | ОсвободитьОбъект(Соединение); 1226 | ВыполнитьСборкуМусора(); 1227 | Соединение = Неопределено; 1228 | ОжидатьЗавершения(ПараметрыПодключения); 1229 | 1230 | Лог.Отладка(НСтр("ru = 'Разрешение подключений новых соединений завершено.'")); 1231 | 1232 | Возврат Истина; 1233 | 1234 | КонецФункции 1235 | 1236 | ////////////////////////////////////////////////////////////////////////////////////// 1237 | // Служебные процедуры и функции 1238 | 1239 | // Проверяет наличия каталога и в случае его отсутствия создает новый. 1240 | // 1241 | // Параметры: 1242 | // Каталог - Строка - Путь к каталогу, существование которого нужно проверить. 1243 | // 1244 | // Возвращаемое значение: 1245 | // Булево - признак существования каталога. 1246 | // 1247 | Функция ОбеспечитьКаталог(Знач Каталог) 1248 | 1249 | Файл = Новый Файл(Каталог); 1250 | Если Не Файл.Существует() Тогда 1251 | Попытка 1252 | СоздатьКаталог(Каталог); 1253 | Исключение 1254 | Лог.Ошибка(СтрШаблон(НСтр("ru = 'Не удалось создать каталог %1. 1255 | |%2'"), Каталог, ИнформацияОбОшибке())); 1256 | Возврат Ложь; 1257 | КонецПопытки; 1258 | 1259 | Если Не Файл.Существует() Тогда 1260 | Лог.Ошибка(СтрШаблон(НСтр("ru = 'Не удалось создать каталог %1.'"), Каталог)); 1261 | Возврат Ложь; 1262 | КонецЕсли 1263 | 1264 | ИначеЕсли Не Файл.ЭтоКаталог() Тогда 1265 | Лог.Ошибка(СтрШаблон(НСтр("ru = 'Каталог %1 не является каталогом.'"), Каталог)); 1266 | Возврат Ложь; 1267 | КонецЕсли; 1268 | 1269 | Возврат Истина; 1270 | 1271 | КонецФункции 1272 | 1273 | // Ожидает завершения подключений к информационной базе. 1274 | // Несмотря на вызов "ОсвободитьОбъект()", на медленных компьютерах Com соединения не успевает 1275 | // отваливаться до вызова следующей функции. Это приводит к невозможности установить монопольный доступ и ошибке. 1276 | // Для обхода ошибки реализована задержка. 1277 | // 1278 | // Параметры: 1279 | // ПараметрыПодключения - Структура - Параметры подключения к информационной базе (см. в ОбновитьИнформационнуюБазу()). 1280 | // 1281 | Процедура ОжидатьЗавершения(Знач ПараметрыПодключения) 1282 | 1283 | Если НЕ ПараметрыЗавершенияСоединения.ОжидатьЗавершениеСоединения Тогда 1284 | Возврат; 1285 | КонецЕсли; 1286 | 1287 | ФайловыйВариантРаботы = ПараметрыПодключения.ВариантРаботыИнформационнойБазы = 0; 1288 | 1289 | Если ФайловыйВариантРаботы Тогда 1290 | 1291 | ФайлНаличияСоединений = Новый Файл(ОбъединитьПути(ПараметрыПодключения.КаталогИнформационнойБазы, "1Cv8tmp.1CD")); 1292 | Если Не ФайлНаличияСоединений.Существует() Тогда 1293 | Возврат; 1294 | КонецЕсли; 1295 | 1296 | ДатаСтарта = ТекущаяДата(); 1297 | Интервал = ПараметрыЗавершенияСоединения.МаксИнтервалОжиданияФайловойИБ; 1298 | 1299 | Пока ТекущаяДата() - Интервал <= ДатаСтарта Цикл 1300 | Если Не ФайлНаличияСоединений.Существует() Тогда 1301 | Прервать; 1302 | КонецЕсли; 1303 | Приостановить(100); // Ждем 0.1 секунд до следующей проверки. 1304 | КонецЦикла; 1305 | 1306 | Иначе 1307 | 1308 | ДатаСтарта = ТекущаяДата(); 1309 | Интервал = ПараметрыЗавершенияСоединения.ИнтервалОжиданияСервернойИБ; 1310 | 1311 | Приостановить(1000 * Интервал); 1312 | 1313 | КонецЕсли; 1314 | 1315 | Лог.Отладка(СтрШаблон(НСтр("ru = 'Задержка: %1 сек'"), ТекущаяДата() - ДатаСтарта)); 1316 | 1317 | КонецПроцедуры 1318 | 1319 | // Устанавливает внешнее соединение с информационной базой по переданным параметрам подключения и возвращает указатель 1320 | // на это соединение. 1321 | // 1322 | // Параметры: 1323 | // ПараметрыПодключения - Структура - Параметры подключения к информационной базе (см. в ОбновитьИнформационнуюБазу()). 1324 | // 1325 | // Возвращаемое значение: 1326 | // COMОбъект, Неопределено - указатель на COM-объект соединения или Неопределено в случае ошибки; 1327 | // 1328 | Функция УстановитьВнешнееСоединениеСБазой(Знач ПараметрыПодключения) 1329 | 1330 | ИмяCOMСоединителя = "V" + ПараметрыПодключения.ВерсияПлатформы + ".COMConnector"; 1331 | Попытка 1332 | COMОбъект = Новый COMОбъект(ИмяCOMСоединителя); 1333 | Исключение 1334 | Лог.Ошибка(СтрШаблон(НСтр("ru = 'Не удалось подключится к другой программе: 1335 | |%1'"), ИнформацияОбОшибке())); 1336 | Возврат Неопределено; 1337 | КонецПопытки; 1338 | 1339 | ФайловыйВариантРаботы = ПараметрыПодключения.ВариантРаботыИнформационнойБазы = 0; 1340 | 1341 | // Формирование строки соединения. 1342 | ШаблонСтрокиСоединения = "[СтрокаБазы][СтрокаАутентификации];UC=ПакетноеОбновлениеКонфигурацииИБ"; 1343 | 1344 | Если ФайловыйВариантРаботы Тогда 1345 | СтрокаБазы = "File = ""&КаталогИнформационнойБазы"""; 1346 | СтрокаБазы = СтрЗаменить(СтрокаБазы, "&КаталогИнформационнойБазы", ПараметрыПодключения.КаталогИнформационнойБазы); 1347 | Иначе 1348 | СтрокаБазы = "Srvr = ""&ИмяСервера1СПредприятия""; Ref = ""&ИмяИнформационнойБазыНаСервере1СПредприятия"""; 1349 | СтрокаБазы = СтрЗаменить(СтрокаБазы, "&ИмяСервера1СПредприятия", ПараметрыПодключения.ИмяСервера1СПредприятия); 1350 | СтрокаБазы = СтрЗаменить(СтрокаБазы, "&ИмяИнформационнойБазыНаСервере1СПредприятия", ПараметрыПодключения.ИмяИнформационнойБазыНаСервере1СПредприятия); 1351 | КонецЕсли; 1352 | 1353 | Если ПараметрыПодключения.АутентификацияОперационнойСистемы Тогда 1354 | СтрокаАутентификации = ""; 1355 | Иначе 1356 | 1357 | Если СтрНайти(ПараметрыПодключения.ИмяПользователя, """") Тогда 1358 | ПараметрыПодключения.ИмяПользователя = СтрЗаменить(ПараметрыПодключения.ИмяПользователя, """", """"""); 1359 | КонецЕсли; 1360 | 1361 | Если СтрНайти(ПараметрыПодключения.ПарольПользователя, """") Тогда 1362 | ПараметрыПодключения.ПарольПользователя = СтрЗаменить(ПараметрыПодключения.ПарольПользователя, """", """"""); 1363 | КонецЕсли; 1364 | 1365 | СтрокаАутентификации = "; Usr = ""&ИмяПользователя""; Pwd = ""&ПарольПользователя"""; 1366 | СтрокаАутентификации = СтрЗаменить(СтрокаАутентификации, "&ИмяПользователя", ПараметрыПодключения.ИмяПользователя); 1367 | СтрокаАутентификации = СтрЗаменить(СтрокаАутентификации, "&ПарольПользователя", ПараметрыПодключения.ПарольПользователя); 1368 | КонецЕсли; 1369 | 1370 | СтрокаСоединения = СтрЗаменить(ШаблонСтрокиСоединения, "[СтрокаБазы]", СтрокаБазы); 1371 | СтрокаСоединения = СтрЗаменить(СтрокаСоединения, "[СтрокаАутентификации]", СтрокаАутентификации); 1372 | 1373 | Попытка 1374 | Соединение = COMОбъект.Connect(СтрокаСоединения); 1375 | Исключение 1376 | Лог.Ошибка(СтрШаблон(НСтр("ru = 'Не удалось подключится к другой программе: 1377 | |%1'"), ИнформацияОбОшибке())); 1378 | Возврат Неопределено; 1379 | КонецПопытки; 1380 | 1381 | Возврат Соединение; 1382 | 1383 | КонецФункции 1384 | 1385 | // Устанавливает контекст библиотеки v8runner и возвращиет указатель на объект. 1386 | // 1387 | // Параметры: 1388 | // ПараметрыПодключения - Структура - Параметры подключения к информационной базе (см. в ОбновитьИнформационнуюБазу()). 1389 | // 1390 | // Возвращаемое значение: 1391 | // УправлениеКонфигуратором - объект библиотеки v8runner; 1392 | // 1393 | Функция УстановитьУправлениеКонфигуратором(Знач ПараметрыПодключения) 1394 | 1395 | УправлениеКонфигуратором = Новый УправлениеКонфигуратором(); 1396 | 1397 | ФайловыйВариантРаботы = ПараметрыПодключения.ВариантРаботыИнформационнойБазы = 0; 1398 | 1399 | Если ФайловыйВариантРаботы Тогда 1400 | СтрокаСоединения = "/F""&КаталогИнформационнойБазы"""; 1401 | СтрокаСоединения = СтрЗаменить(СтрокаСоединения, "&КаталогИнформационнойБазы", ПараметрыПодключения.КаталогИнформационнойБазы); 1402 | Иначе 1403 | СтрокаСоединения = "/IBConnectionString""Srvr = """"&ИмяСервера1СПредприятия""""; Ref = """"&ИмяИнформационнойБазыНаСервере1СПредприятия"""""""; 1404 | СтрокаСоединения = СтрЗаменить(СтрокаСоединения, "&ИмяСервера1СПредприятия", ПараметрыПодключения.ИмяСервера1СПредприятия); 1405 | СтрокаСоединения = СтрЗаменить(СтрокаСоединения, "&ИмяИнформационнойБазыНаСервере1СПредприятия", ПараметрыПодключения.ИмяИнформационнойБазыНаСервере1СПредприятия); 1406 | КонецЕсли; 1407 | 1408 | Если ПараметрыПодключения.АутентификацияОперационнойСистемы Тогда 1409 | ПараметрыПодключения.ИмяПользователя = ""; 1410 | ПараметрыПодключения.ПарольПользователя = ""; 1411 | КонецЕсли; 1412 | 1413 | УправлениеКонфигуратором.УстановитьКонтекст(СтрокаСоединения, ПараметрыПодключения.ИмяПользователя, ПараметрыПодключения.ПарольПользователя); 1414 | УправлениеКонфигуратором.УстановитьКлючРазрешенияЗапуска("ПакетноеОбновлениеКонфигурацииИБ"); 1415 | 1416 | УправлениеКонфигуратором.КаталогСборки(Каталоги.КаталогВременныхФайлов); 1417 | 1418 | Возврат УправлениеКонфигуратором; 1419 | 1420 | КонецФункции 1421 | 1422 | Лог = Логирование.ПолучитьЛог("oscript.lib.AutoUpdateIB"); 1423 | Инициализировать(); 1424 | -------------------------------------------------------------------------------- /tests/AutoUpdateIB-test.os: -------------------------------------------------------------------------------- 1 | #Использовать ".." 2 | 3 | Перем юТест; 4 | Перем Обновлятор; 5 | 6 | Процедура Инициализация() 7 | 8 | Обновлятор = Новый Обновлятор(); 9 | 10 | Обновлятор.УстановитьРежимОтладки(РежимОтладки()); 11 | Лог = Обновлятор.ПолучитьЛог(); 12 | 13 | КонецПроцедуры 14 | 15 | Функция ПолучитьСписокТестов(ЮнитТестирование) Экспорт 16 | 17 | юТест = ЮнитТестирование; 18 | 19 | СписокТестов = Новый Массив; 20 | СписокТестов.Добавить("ТестДолжен_ПроверитьУстановкуКаталогов"); 21 | СписокТестов.Добавить("ТестДолжен_ПроверитьУстановкуПараметровАутентификации"); 22 | СписокТестов.Добавить("ТестДолжен_ПроверитьУстановкуПараметровЗавершенияСоединения"); 23 | СписокТестов.Добавить("ТестДолжен_ПроверитьПолучениеПараметровБлокировкиCеансов"); 24 | СписокТестов.Добавить("ТестДолжен_ПроверитьПолучениеПараметровРезервногоКопирования"); 25 | СписокТестов.Добавить("ТестДолжен_ПроверитьПолучениеПараметровОбновленияКонфигурации()"); 26 | 27 | Возврат СписокТестов; 28 | 29 | КонецФункции 30 | 31 | Процедура ТестДолжен_ПроверитьУстановкуКаталогов() Экспорт 32 | 33 | Каталоги = Обновлятор.ПолучитьПараметры("Каталоги"); 34 | юТест.ПроверитьРавенство(ТипЗнч(Каталоги), Тип("Структура"), "Возвращенное значение ""Каталоги"" не является структурой."); 35 | юТест.ПроверитьИстину(Каталоги.Свойство("КаталогФайловОбновления"), "Не найден ключ КаталогФайловОбновления."); 36 | юТест.ПроверитьИстину(Каталоги.Свойство("КаталогВременныхФайлов"), "Не найден ключ КаталогВременныхФайлов."); 37 | 38 | СистемнаяИнформация = Новый СистемнаяИнформация(); 39 | КаталогTEMP = СистемнаяИнформация.ПолучитьПеременнуюСреды("TEMP"); 40 | Обновлятор.УстановитьКаталоги(КаталогTEMP, КаталогTEMP); 41 | Каталоги = Обновлятор.ПолучитьПараметры("Каталоги"); 42 | Для Каждого Параметр Из Каталоги Цикл 43 | юТест.ПроверитьРавенство(Параметр.Значение, КаталогTEMP, 44 | СтрШаблон("Каталог по ключу %1 не установлен.", Параметр.Ключ)); 45 | КонецЦикла; 46 | 47 | КонецПроцедуры 48 | 49 | Процедура ТестДолжен_ПроверитьУстановкуПараметровАутентификации() Экспорт 50 | 51 | ПараметрыАутентификации = Обновлятор.ПолучитьПараметры("ПараметрыАутентификации"); 52 | юТест.ПроверитьРавенство(ТипЗнч(ПараметрыАутентификации), Тип("Структура"), "Возвращенное значение ""ПараметрыАутентификации"" не является структурой."); 53 | юТест.ПроверитьИстину(ПараметрыАутентификации.Свойство("Пользователь"), "Не найден ключ Пользователь."); 54 | юТест.ПроверитьИстину(ПараметрыАутентификации.Свойство("Пароль"), "Не найден ключ Пароль."); 55 | 56 | Обновлятор.УстановитьПараметрыАутентификации("Пользователь", "Пароль"); 57 | ПараметрыАутентификации = Обновлятор.ПолучитьПараметры("ПараметрыАутентификации"); 58 | юТест.ПроверитьРавенство(ПараметрыАутентификации.Пользователь, "Пользователь", "Параметр аутентификации по ключу Пользователь не установлен"); 59 | юТест.ПроверитьРавенство(ПараметрыАутентификации.Пароль, "Пароль", "Параметр аутентификации по ключу Пароль не установлен"); 60 | 61 | КонецПроцедуры 62 | 63 | Процедура ТестДолжен_ПроверитьУстановкуПараметровЗавершенияСоединения() Экспорт 64 | 65 | ПараметрыЗавершенияСоединения = Обновлятор.ПолучитьПараметры("ПараметрыЗавершенияСоединения"); 66 | юТест.ПроверитьРавенство(ТипЗнч(ПараметрыЗавершенияСоединения), Тип("Структура"), "Возвращенное значение ""ПараметрыЗавершенияСоединения"" не является структурой."); 67 | юТест.ПроверитьИстину(ПараметрыЗавершенияСоединения.Свойство("ОжидатьЗавершениеСоединения"), "Не найден ключ ОжидатьЗавершениеСоединения."); 68 | юТест.ПроверитьИстину(ПараметрыЗавершенияСоединения.Свойство("МаксИнтервалОжиданияФайловойИБ"), "Не найден ключ МаксИнтервалОжиданияФайловойИБ."); 69 | юТест.ПроверитьИстину(ПараметрыЗавершенияСоединения.Свойство("ИнтервалОжиданияСервернойИБ"), "Не найден ключ ИнтервалОжиданияСервернойИБ."); 70 | 71 | Обновлятор.УстановитьПараметрыЗавершенияСоединения(Ложь, 0, 0); 72 | ПараметрыЗавершенияСоединения = Обновлятор.ПолучитьПараметры("ПараметрыЗавершенияСоединения"); 73 | юТест.ПроверитьРавенство(ПараметрыАутентификации.ОжидатьЗавершениеСоединения, Ложь, "Параметр завершения соединения по ключу ОжидатьЗавершениеСоединения не установлен"); 74 | юТест.ПроверитьРавенство(ПараметрыАутентификации.МаксИнтервалОжиданияФайловойИБ, 0, "Параметр завершения соединения по ключу МаксИнтервалОжиданияФайловойИБ не установлен"); 75 | юТест.ПроверитьРавенство(ПараметрыАутентификации.ИнтервалОжиданияСервернойИБ, 0, "Параметр завершения соединения по ключу ИнтервалОжиданияСервернойИБ не установлен"); 76 | 77 | КонецПроцедуры 78 | 79 | Процедура ТестДолжен_ПроверитьПолучениеПараметровБлокировкиCеансов() Экспорт 80 | 81 | ПараметрыБлокировкиCеансов = Обновлятор.ПолучитьПараметры("ПараметрыБлокировкиCеансов"); 82 | юТест.ПроверитьРавенство(ТипЗнч(ПараметрыБлокировкиCеансов), Тип("Структура"), "Возвращенное значение ""ПараметрыБлокировкиCеансов"" не является структурой."); 83 | юТест.ПроверитьИстину(ПараметрыБлокировкиCеансов.Свойство("БлокироватьСеансыИБ"), "Не найден ключ БлокироватьСеансыИБ."); 84 | юТест.ПроверитьИстину(ПараметрыБлокировкиCеансов.Свойство("ИспользованиеИБ"), "Не найден ключ ИспользованиеИБ."); 85 | юТест.ПроверитьИстину(ПараметрыБлокировкиCеансов.Свойство("ИнтервалОжидания"), "Не найден ключ ИнтервалОжидания."); 86 | 87 | Обновлятор.УстановитьПараметрыБлокировкиCеансов(Ложь, Ложь, 0); 88 | ПараметрыБлокировкиCеансов = Обновлятор.ПолучитьПараметры("ПараметрыБлокировкиCеансов"); 89 | юТест.ПроверитьРавенство(ПараметрыБлокировкиCеансов.БлокироватьСеансыИБ, Ложь, "Параметр блокировки сеансов по ключу БлокироватьСеансыИБ не установлен"); 90 | юТест.ПроверитьРавенство(ПараметрыБлокировкиCеансов.ИспользованиеИБ, Ложь, "Параметр блокировки сеансов по ключу ИспользованиеИБ не установлен"); 91 | юТест.ПроверитьРавенство(ПараметрыБлокировкиCеансов.ИнтервалОжидания, 0, "Параметр блокировки сеансов по ключу ИнтервалОжидания не установлен"); 92 | 93 | КонецПроцедуры 94 | 95 | Процедура ТестДолжен_ПроверитьПолучениеПараметровРезервногоКопирования() Экспорт 96 | 97 | ПараметрыРезервногоКопирования = Обновлятор.ПолучитьПараметры("ПараметрыРезервногоКопирования"); 98 | юТест.ПроверитьРавенство(ТипЗнч(ПараметрыРезервногоКопирования), Тип("Структура"), "Возвращенное значение ""ПараметрыРезервногоКопирования"" не является структурой."); 99 | юТест.ПроверитьИстину(ПараметрыРезервногоКопирования.Свойство("СоздаватьРезервнуюКопию"), "Не найден ключ СоздаватьРезервнуюКопию."); 100 | юТест.ПроверитьИстину(ПараметрыРезервногоКопирования.Свойство("КаталогРезервныхКопий"), "Не найден ключ КаталогРезервныхКопий."); 101 | юТест.ПроверитьИстину(ПараметрыРезервногоКопирования.Свойство("ВосстанавливатьИнформационнуюБазу"), "Не найден ключ ВосстанавливатьИнформационнуюБазу."); 102 | 103 | Обновлятор.УстановитьПараметрыРезервногоКопирования(Ложь); 104 | ПараметрыРезервногоКопирования = Обновлятор.ПолучитьПараметры("ПараметрыРезервногоКопирования"); 105 | юТест.ПроверитьРавенство(ПараметрыРезервногоКопирования.СоздаватьРезервнуюКопию, Ложь, "Параметр резервного копирования по ключу СоздаватьРезервнуюКопию не установлен"); 106 | 107 | СистемнаяИнформация = Новый СистемнаяИнформация(); 108 | КаталогTEMP = СистемнаяИнформация.ПолучитьПеременнуюСреды("TEMP"); 109 | Обновлятор.УстановитьПараметрыРезервногоКопирования(Истина, КаталогTEMP, Ложь); 110 | ПараметрыРезервногоКопирования = Обновлятор.ПолучитьПараметры("ПараметрыРезервногоКопирования"); 111 | юТест.ПроверитьРавенство(ПараметрыРезервногоКопирования.КаталогРезервныхКопий, КаталогTEMP, "Параметр резервного копирования по ключу КаталогРезервныхКопий не установлен"); 112 | юТест.ПроверитьРавенство(ПараметрыРезервногоКопирования.ВосстанавливатьИнформационнуюБазу, Ложь, "Параметр резервного копирования по ключу ВосстанавливатьИнформационнуюБазу не установлен"); 113 | 114 | КонецПроцедуры 115 | 116 | Процедура ТестДолжен_ПроверитьПолучениеПараметровОбновленияКонфигурации() Экспорт 117 | 118 | СистемнаяИнформация = Новый СистемнаяИнформация(); 119 | КаталогTEMP = СистемнаяИнформация.ПолучитьПеременнуюСреды("TEMP"); 120 | Обновлятор.УстановитьКаталоги(, ОбъединитьПути(КаталогTEMP, "AutoUpdateIB")); 121 | 122 | ПараметрыОбновленияКонфигурации = Обновлятор.ПолучитьПараметрыОбновленияКонфигурации(); 123 | Если ПараметрыОбновленияКонфигурации <> Неопределено Тогда 124 | 125 | юТест.ПроверитьРавенство(ТипЗнч(ПараметрыОбновленияКонфигурации), Тип("Структура"), "Возвращенное значение ""ПараметрыОбновленияКонфигурации"" не является структурой."); 126 | юТест.ПроверитьИстину(ПараметрыОбновленияКонфигурации.Свойство("ТипКонфигурации"), "Не найден ключ ТипКонфигурации."); 127 | юТест.ПроверитьИстину(ПараметрыОбновленияКонфигурации.Свойство("ВерсияРелиза"), "Не найден ключ ВерсияРелиза."); 128 | юТест.ПроверитьИстину(ПараметрыОбновленияКонфигурации.Свойство("ВерсияПлатформы"), "Не найден ключ ВерсияПлатформы."); 129 | юТест.ПроверитьИстину(ПараметрыОбновленияКонфигурации.Свойство("МассивОбновлений"), "Не найден ключ МассивОбновлений."); 130 | 131 | МассивОбновлений = ПараметрыОбновленияКонфигурации.МассивОбновлений; 132 | юТест.ПроверитьРавенство(ТипЗнч(МассивОбновлений), Тип("Массив"), "Возвращенное значение ""ПараметрыОбновленияКонфигурации.МассивОбновлений"" не является массивом."); 133 | юТест.ПроверитьБольшеИлиРавно(МассивОбновлений.Количество(), 1, "Не сформирован массив со списком обновлений конфигурации"); 134 | 135 | КонецЕсли; 136 | 137 | ФайлСпискаШаблонов = ОбъединитьПути(КаталогTEMP, "AutoUpdateIB\v8cscdsc.xml"); 138 | ФайлСпискаШаблоновОбъект = Новый Файл(ФайлСпискаШаблонов); 139 | юТест.ПроверитьЛожь(ФайлСпискаШаблоновОбъект.Существует(), "Временный файл v8cscdsc.xml не удален"); 140 | 141 | КонецПроцедуры 142 | 143 | Функция РежимОтладки() 144 | 145 | Для каждого АргументКомСтроки из АргументыКоманднойСтроки Цикл 146 | Если НРег(АргументКомСтроки) = "--debug" Тогда 147 | Возврат Истина; 148 | КонецЕсли; 149 | КонецЦикла; 150 | 151 | Возврат Ложь; 152 | 153 | КонецФункции 154 | 155 | Инициализация(); -------------------------------------------------------------------------------- /tests/README.md: -------------------------------------------------------------------------------- 1 | Организовано приемочное тестирование, аналогичное тестированию 1C в проекте [xUnitFor1C](https://github.com/xDrivenDevelopment/xUnitFor1C/wiki) 2 | 3 | Основные принципы работы с тестами для скриптов OneScript описаны в [официальной документации OneScript](http://oscript.io/docs/page/testing) --------------------------------------------------------------------------------