├── 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)
--------------------------------------------------------------------------------