├── .gitignore
├── README.md
├── lib.config
├── opm-metadata.xml
├── packagedef
├── src
└── Classes
│ └── ТЗапуск1С.os
└── ПримерИспользования_TRun1C.os
/.gitignore:
--------------------------------------------------------------------------------
1 | Distr
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # TRun1C
2 | Библиотека для запуска 1С:Предприятие 8 в различных режимах.
3 |
4 | ## Описание
5 | Библиотека на OneScript для запуска 1С:Предприятия 8 в различных режимах, включая пакетный режим запуска конфигуратора и работу с хранилищем конфигурации.
6 |
7 | ## Установка
8 |
9 | Установка через пакетный менеджер **opm** командой:
10 |
11 | ``` cmd
12 | opm install trun1c
13 | ```
14 |
15 | ## Использование библиотеки
16 |
17 | Библиотека подключается как отдельный класс. Экземпляр класса используется для ведения текущего лога.
18 |
19 | Подключение библиотеки:
20 | ``` bsl
21 | #Использовать TRun1C
22 | ```
23 |
24 | Создание класса:
25 | ``` bsl
26 | Запуск1С = Новый ТУправлениеЗапуском1С();
27 | ```
28 |
29 | Параметры класса:
30 | * **ПараметрыЗапуска** - Структура параметров запуска, состав:
31 | * **ПутьКПлатформе1С** - Путь к платформе 1С
32 | * **ВерсияПлатформы** - Версия Платформы 1С (Если не заполнена, вычисляется автоматически). Варианты:
33 | * 81
34 | * 82
35 | * 83
36 | * **ТипБазы** - Тип базы 1С. Варианты:
37 | * F - файловая
38 | * S - серверная
39 | * WS - веб
40 | * **ИмяБазы** - Указывается как для файловой, так и для серверной базы.
41 | * **АдресКластера** - Параметры сервера 1С, по умолчанию - localhost
42 | * **ПортКластера** - Параметры сервера 1С, по умолчанию - 1541
43 | * **ПортАгента** - Параметры сервера 1С, по умолчанию - 1540
44 | * **ИмяПользователяАдминистратораКластера** - Параметры сервера 1С
45 | * **ПарольПользователяАдминистратораКластера** - Параметры сервера 1С
46 | * **КодРазрешения** - Параметры сервера 1С, по умолчанию - 987654321
47 | * **СообщениеПриБлокировке** - Параметры сервера 1С, по умолчанию - "Информационная база заблокирована для обслуживания."
48 | * **ИмяПользователя** - Параметры авторизации в информационной базе
49 | * **ПарольПользователя** - Параметры авторизации в информационной базе
50 | * **АдресХранилища** - Параметры работы с хранилищем
51 | * **ИмяПользователяХранилища** - Параметры работы с хранилищем
52 | * **ПарольПользователяХранилища** - Параметры работы с хранилищем
53 | * **ВидныДействияВПакетномРежиме** - При установке данного флага, все дейстия в пакетном запуске конфигуратора будут видны пользователю
54 | * **ФайлДляЗаписиРезультатовРаботыВПакетномРежиме** - При указании имени файла, результат работы конфигуратора в пакетном режиме будет записан в данные файл файл
55 | * **ТекстОшибки** - Переменная для возврата ошибки, если таковая имела место быть
56 |
57 | Экспортные процедуры и функции класса:
58 |
59 | ### Процедура ОчиститьПараметры()
60 |
61 | * Выполняет сборс всех параметров запуска к настройкам по умолчанию
62 |
63 | ### Функция ИмяФайлаПоИмениБазыНаДату(Расширение)
64 |
65 | * Возвращает имя файла, построенном по принципу: ИмяБазы + ДатаВремя + Расширение. Пример: Base_2017_04_28_19_02_12.dt
66 |
67 | ### Функция ЗавершитьРаботуПользователей()
68 |
69 | * Завершает работу пользователей для серверной базы
70 |
71 | ### Функция УстановитьБлокировкуНачалаСеансов(БлокироватьРегламентныеЗадания = Истина)
72 |
73 | * Устанавливает блокирвку сенасов для серверной базы
74 |
75 | ### Функция СнятьБлокировкуНачалаСеансов(СнятьБлокировкуРегламентныхЗаданий = Истина)
76 |
77 | * Снимает блокировку сеансов для серверной базы
78 |
79 | ### Функция ПолучитьСписокСеансов(ПропускатьКонсольКластера = Истина)
80 |
81 | * Получает список текущих сеансов с информационной базой
82 |
83 | ### Функция ЗапуститьПредприятие(ПутьКОбработке="", ОжидатьЗавершения = Ложь)
84 |
85 | * Запускает 1С:Предприятие
86 | * Параметры:
87 | * ПутьКОбработке - Строка - Если указан путь к обработке, то обработка будет открыта после запуска 1С:Предприятие
88 | * ОжидатьЗавершения - Булево - Ожидать завершения работы 1С:Предприятие, по умолчанию - Ложь
89 |
90 | ### Функция ЗапуститьКонфигуратор(ОжидатьЗавершения = Ложь)
91 |
92 | * Запускает конфигуратор
93 | * Параметры:
94 | * ОжидатьЗавершения - Булево - Ожидать завершения работы конфигуратора, по умолчанию - Ложь
95 |
96 | ### Функция ВыгрузитьИнформационнуюБазу(ПолныйПутьКФайлу)
97 |
98 | * Выгружает информационную базу в указанный файл (dt)
99 | * Параметры:
100 | * ПолныйПутьКФайлу - Строка - Полный путь к файлу
101 |
102 | ### Функция ЗагрузитьИнформационнуюБазу(ПолныйПутьКФайлу)
103 |
104 | * Загружает информационную базу из указанного файла (dt)
105 | * Параметры:
106 | * ПолныйПутьКФайлу - Строка - Полный путь к файлу
107 |
108 | ### Функция СохранитьКонфигурациюВФайл(ПолныйПутьКФайлу)
109 |
110 | * Сохраняет текущую конфигурацию в указаннй файл (cf)
111 | * Параметры:
112 | * ПолныйПутьКФайлу - Строка - Полный путь к файлу
113 |
114 | ### Функция СохранитьКонфигурациюБазыДанныхВФайл(ПолныйПутьКФайлу)
115 |
116 | * Сохраняет конфигурацию базы данных в указаннй файл (cf)
117 | * Параметры:
118 | * ПолныйПутьКФайлу - Строка - Полный путь к файлу
119 |
120 | ### Функция ЗагрузитьКонфигурациюИзФайла(ПолныйПутьКФайлу)
121 |
122 | * Загружает конфигурацию из указанного файла (cf)
123 | * Параметры:
124 | * ПолныйПутьКФайлу - Строка - Полный путь к файлу
125 |
126 | ### Функция ОбновитьКонфигурациюБазыДанных(ПредупрежденияКакОшибки=Ложь, НаСервере=Ложь)
127 |
128 | * Обновлет конфигурацию базы данных
129 | * Параметры:
130 | * ПредупрежденияКакОшибки - Булево - Если Истина, то все предупреждения трактуются как ошибки.
131 | * НаСервере - Булево - Если Истина, то обновление будет выполняться на сервере (имеет смысл только в клиент-серверном варианте работы).
132 |
133 | ### Функция СравнитьКонфигурации(ПутьИмяФайлаОтчета, ТипПервойКонфигурации = "MainConfiguration", ТипВторойКонфигурации = "DBConfiguration", Знач ДопКлючПервойКонфигурации = "", Знач ДопКлючВторойКонфигурации = "", ТипОтчетаДляСравнения = "Brief", ФорматФайлаОтчета = "txt", ПравилоУстановкиСоответствийОбъектов = "ByObjectName")
134 |
135 | * Сравнивает две конфигурации с выводом отчета в файл
136 | * Параметры:
137 | * ПутьИмяФайлаОтчета - путь к файлу отчета, если файл не существует, будет создан новый;
138 | * ТипПервойКонфигурации - Строка - Тип первой конфигурации. Возможные значния:
139 | * MainConfiguration – основная конфигурация;
140 | * DBConfiguration – конфигурация базы данных;
141 | * VendorConfiguration – конфигурация поставщика;
142 | * ExtensionConfiguration – расширение конфигурации;
143 | * ExtensionDBConfiguration – расширение конфигурации из база данных;
144 | * ConfigurationRepository – конфигурация из хранилища конфигурации;
145 | * File – файл конфигурации/расширения конфигурации.
146 | * ТипВторойКонфигурации - Строка - Тип второй конфигурации. Возможные значения:
147 | * MainConfiguration – основная конфигурация;
148 | * DBConfiguration – конфигурация базы данных;
149 | * VendorConfiguration – конфигурация поставщика;
150 | * ExtensionConfiguration – расширение конфигурации;
151 | * ExtensionDBConfiguration – расширение конфигурации из база данных;
152 | * ConfigurationRepository – конфигурация из хранилища конфигурации;
153 | * File – файл конфигурации/расширения конфигурации.
154 | * ДопКлючПервойКонфигурации - Строка - дополнительный идентификатор первой конфигурации. Возможные значения (в зависимости от типа первой конфигурации):
155 | * MainConfiguration - Не используется
156 | * DBConfiguration - Не используется
157 | * VendorConfiguration - Имя конфигурации поставщика
158 | * ExtensionConfiguration - Имя конфигурации поставщика
159 | * ExtensionDBConfiguration - Имя конфигурации расширения (из базы данных)
160 | * ConfigurationRepository - Версия конфигурации в хранилище
161 | * File - Пусть к файлу конфигурации (.cf-файл) или расширения конфигурации (.cfe-файл)
162 | * ДопКлючВторойКонфигурации - Строка - дополнительный идентификатор второй конфигурации. Возможные значения (в зависимости от типа второй конфигурации):
163 | * MainConfiguration - Не используется
164 | * DBConfiguration - Не используется
165 | * VendorConfiguration - Имя конфигурации поставщика
166 | * ExtensionConfiguration - Имя конфигурации поставщика
167 | * ExtensionDBConfiguration - Имя конфигурации расширения (из базы данных)
168 | * ConfigurationRepository - Версия конфигурации в хранилище
169 | * File - Пусть к файлу конфигурации (.cf-файл) или расширения конфигурации (.cfe-файл)
170 | * ТипОтчетаДляСравнения - Строка - Тип отчета для сравнения. Возможные типы:
171 | * Brief – крайткий отчет;
172 | * Full – полный отчет.
173 | * ФорматФайлаОтчета - Строка - Формат файла отчета. Возможные значения:
174 | * txt – текстовый документ;
175 | * mxl – табличный документ.
176 | * ПравилоУстановкиСоответствийОбъектов - Строка - для тех случаев, когда конфигурации не состоят в отношениях «родитель-потомок», возможные значения:
177 | * ByObjectName – по именам объектов. Используется по умолчанию.
178 | * ByObjectIDs – по внутренним идентификаторам.
179 | * Возвращает:
180 | * Истина - Отчет сформирован успешно
181 | * Ложь - Были ошибки
182 |
183 | ### Функция ЕстьИзмененияВОтчетеОСравненииКраткийТекст(ПутьКФайлуОтчетаОСравнении)
184 |
185 | * Проверяет есть ли записи об изменении в файле отчета о сравнении конфигураций. При условии, что отчет "краткий" в формате txt.
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 | * НомерВерсии (-v [номер версии хранилища]) — номер версии хранилища, если номер версии не указан, или равен -1, будет сохранена последняя версия
215 |
216 | ### Функция ОбновитьКонфигурациюИзХранилища(НомерВерсии="", ПолучатьЗахваченныеОбъекты = Ложь, Форсировать = Истина)
217 |
218 | * Обновляет текущую конфигурацию из хранилища
219 | * Параметры:
220 | * НомерВерсии (-v [номер версии хранилища]) — номер версии хранилища, если номер версии не указан, или равен -1, будет сохранена последняя версия, если конфигурация не подключена к хранилищу, то параметр игнорируется;
221 | * ПолучатьЗахваченныеОбъекты (-revised) — получать захваченные объекты, если потребуется. Если конфигурация не подключена к хранилищу, то параметр игнорируется;
222 | * Форсировать (-force) — если при пакетном обновлении конфигурации из хранилища должны быть получены новые объекты конфигурации или удалиться существующие, указание этого параметра свидетельствует о подтверждении пользователем описанных выше операций. Если параметр не указан — действия выполнены не будут.
223 |
224 | ### Функция ОтключитьКонфигурациюОтХранилища(Форсировать = Истина)
225 |
226 | * Отключает конфигурацию от хранилища
227 | * Параметры:
228 | * Форсировать (-force) Булево — ключ для форсирования отключения от хранилища (пропуск диалога аутентификации, если не указаны параметры пользователя хранилища, игнорирование наличия захваченных и измененных объектов).
229 |
230 | ### ПодключитьКонфигурациюКХранилищу(Форсировать = Истина, ЗаменитьТекущуюКонфигурацию = Истина)
231 |
232 | * Подключает конфигурацию к хранилищу
233 | * Параметры:
234 | * Форсировать (-force) — Булево - выполняет подключение даже в том случае, если для данного пользователя уже есть конфигурация, связанная с данным хранилищем.
235 | * ЗаменитьТекущуюКонфигурацию - Булево - если конфигурация непустая, данный ключ подтверждает замену конфигурации на конфигурацию из хранилища.
236 |
237 | ### Функция ВыполнитьОчисткуЛокальногоКешаХранилища()
238 |
239 | * Выполняет очистку локального кэша хранилища конфигурации
240 |
241 | ### Функция ВыполнитьОчисткуЛокальнойБазыДанныхХранилища()
242 |
243 | * Выполняет очистку локальной базы данных хранилища конфигурации
244 |
245 | ### ЗахватитьВХранилище(ПутьИмяФайлаОбъектов = "", ПолучатьОбъектыИзХранилища = Истина)
246 |
247 | * Выполняет захват объектов из хранилища конфигурации для редактирования (/ConfigurationRepositoryLock [–Objects <имя файла>] [-revised]).
248 | * Параметры:
249 | * ПутьИмяФайлаОбъектов (-Objects <имя файла>) - путь к файлу со списком объектов, которые будут участвовать в операции. Если файл указан – в операции участвуют только указанные в файле объекты, в противном случае участвует вся конфигурация.
250 | * ПолучатьОбъектыИзХранилища(-revised) - получать захваченные объекты, если потребуется.
251 | * Возвращает:
252 | * Истина - операция выполнена успешно;
253 | * Ложь - были ошибки.
254 |
255 | ### Функция ОтменитьЗахватВХранилище(ПутьИмяФайлаОбъектов = "", ОтменитьЛокальныеИзменения = Истина)
256 |
257 | * Выполняет отмену захвата объектов в хранилище конфигурации (/ConfigurationRepositoryUnLock [–Objects <имя файла>] [-force]).
258 | * Параметры:
259 | * ПутьИмяФайлаОбъектов (-Objects <имя файла>) - путь к файлу со списком объектов, которые будут участвовать в операции. Если файл указан – в операции участвуют только указанные в файле объекты, в противном случае участвует вся конфигурация.
260 | * ОтменитьЛокальныеИзменения(-force) - описывает поведение с локально измененными объектами:
261 | * Ключ указан – локально измененные объекты будут получены из хранилища. Изменения будут потеряны.
262 | * Ключ не указан – при наличии локально измененных объектов будет выдана ошибка, и операция будет отменена целиком, для всех объектов, участвующих в операции.
263 | * Возвращает:
264 | * Истина - операция выполнена успешно;
265 | * Ложь - были ошибки.
266 |
267 | ### Функция ПоместитьВХранилище (ПутьИмяФайлаОбъектов = "", ТекстКомментария = "", ОставлятьОбъектыЗахваченными = Ложь, ОчищатьСсылкиНаУдаленныеОбъекты = Истина)
268 |
269 | * Помещает измененные объекты в хранилище (/ConfigurationRepositoryCommit [–Objects <имя файла>] [-comment <текст комментария>] [-keepLocked] [-force])
270 | * Параметры:
271 | * ПутьИмяФайлаОбъектов (–Objects <имя файла>) – путь к файлу со списком объектов, которые будут участвовать в операции. Если файл указан – в операции участвуют только указанные в файле объекты, в противном случае участвует вся конфигурация.
272 | * ТекстКомментария (-comment <текст комментария>) - текст комментария к помещаемым объектам.
273 | * ОставлятьОбъектыЗахваченными (-keepLocked) - оставлять помещенные объекты захваченными. Если не указан, то после помещения изменений будет отменен захват для объектов, участвующих в операции.
274 | * ОчищатьСсылкиНаУдаленныеОбъекты (-force) - описывает поведение при обнаружении ссылок на удаленные объекты:
275 | * Истина – будет выполнена попытка очистки ссылок.
276 | * Ложь – будет выдана ошибка.
277 | * Возвращает:
278 | * Истина - операция выполнена успешно;
279 | * Ложь - были ошибки.
280 |
281 | ### Функция СоздатьФайлСпискаОбъектов(ПолныйПутьКФайлуОтчета="", ПолныйПутьКФайлуСпискаОбъектов="")
282 |
283 | * Создает файл списка объектов на основании отчета о сравнении
284 | * Параметры:
285 | * ПолныйПутьКФайлуОтчета - полный путь к файлу отчета о сравнении (отчет должен быть кратким в формате txt)
286 | * ПолныйПутьКФайлуСпискаОбъектов - полный путь к файлу списка объектов, если путь не указан, будет создан временный.
287 | * Возвращает:
288 | * Неопределено - были ошибки;
289 | * Путь к файлу списка объектов - Файл создан успешно.
290 |
291 | ### Функция ОтменитьНазначениеГлавногоУзлаРИБ()
292 |
293 | * Отменяет назначение главного узла РИБ
294 | * Возвращает:
295 | * Истина - операция выполнена успешно;
296 | * Ложь - были ошибки.
297 |
298 | ### Функция УдалитьИнформационнуюБазу(Режим=0)
299 |
300 | * Удаляет информационную базу.
301 | * Параметры:
302 | * Режим - режим удаления информационной базы:
303 | * 0 - при удалении информационной базы базу данных не удалять;
304 | * 1 - при удалении информационной базы удалить базу данных;
305 | * 2 - при удалении информационной базы очистить базу данных.
306 | * Возвращает:
307 | * Истина - операция выполнена успешно;
308 | * Ложь - были ошибки.
309 |
310 | ## Пример использования
311 |
312 | ``` bsl
313 | #Использовать TRun1C
314 | // Создадим объект
315 | Запуск1С = Новый ТУправлениеЗапуском1С();
316 |
317 | // Введем параметры
318 | ПараметрыЗапуска = Запуск1С.ПараметрыЗапуска;
319 | ПараметрыЗапуска.ПутьКПлатформе1С = "C:\Program Files (x86)\1cv8\8.3.8.2054\bin\1cv8.exe";
320 | ПараметрыЗапуска.ТипБазы = "S";
321 | ПараметрыЗапуска.ИмяБазы = "TestBase";
322 | ПараметрыЗапуска.АдресКластера = "10.1.1.40";
323 | ПараметрыЗапуска.ПортКластера = "2541";
324 | ПараметрыЗапуска.ПортАгента = "2540";
325 | ПараметрыЗапуска.ИмяПользователя = "Администратор";
326 | ПараметрыЗапуска.ПарольПользователя = "";
327 | ПараметрыЗапуска.ВидныДействияВПакетномРежиме = Ложь; //Можно не указывать
328 | ПараметрыЗапуска.АдресХранилища = "C:\repo\OS_TScripts\_Tests\Repository";
329 | ПараметрыЗапуска.ИмяПользователяХранилища = "admin";
330 | ПараметрыЗапуска.ПарольПользователяХранилища = "1";
331 |
332 | // Запустим тест всех процедур
333 | ПолныйТестВсехПроцедур(Запуск1С);
334 |
335 | // Введем параметры
336 | ПараметрыЗапуска.ТипБазы = "F";
337 | ПараметрыЗапуска.ИмяБазы = "C:\repo\OS_TScripts\_Tests\Base";
338 | ПараметрыЗапуска.ИмяПользователя = "";
339 | ПараметрыЗапуска.ПарольПользователя = "";
340 |
341 | // Флаг наличия ошибок
342 | БылиОшибки = Ложь;
343 |
344 | // Создадим необходимые файлы
345 | Если РабочийКаталог = "" Тогда
346 | РабочийКаталог = ".\";
347 | КонецЕсли;
348 | РабочийКаталог = ОбъединитьПути(РабочийКаталог,"Test_TRun1C");
349 | СоздатьКаталог(РабочийКаталог);
350 |
351 | // Результат работы в пакетном режиме
352 | ПараметрыЗапуска = Запуск1С.ПараметрыЗапуска;
353 | ПараметрыЗапуска.ФайлДляЗаписиРезультатовРаботыВПакетномРежиме = ОбъединитьПути(РабочийКаталог,Запуск1С.ИмяФайлаПоИмениБазыНаДату("txt")); //Можно не указывать
354 |
355 | Если ПараметрыЗапуска.ТипБазы = "S" Тогда // Серверная база
356 |
357 | // Запустим 1С:Предприятие
358 | Если Запуск1С.ЗапуститьПредприятие() Тогда
359 | Сообщить("ЗапуститьПредприятие: УСПЕШНО");
360 | Иначе
361 | Сообщить("ЗапуститьПредприятие: " + Запуск1С.ТекстОшибки);
362 | БылиОшибки = Истина;
363 | КонецЕсли;
364 | Приостановить(6000);
365 |
366 | // Запустим Конфигуратор
367 | Если Запуск1С.ЗапуститьКонфигуратор() Тогда
368 | Сообщить("ЗапуститьКонфигуратор: УСПЕШНО");
369 | Иначе
370 | Сообщить("ЗапуститьКонфигуратор: " + Запуск1С.ТекстОшибки);
371 | БылиОшибки = Истина;
372 | КонецЕсли;
373 | Приостановить(6000);
374 |
375 | // Получим список сеансов
376 | ТаблицаСеансов = Запуск1С.ПолучитьСписокСеансов();
377 | Если ТаблицаСеансов <> Неопределено Тогда
378 | Сообщить("ПолучитьСписокСеансов: УСПЕШНО");
379 | Для Каждого Сеанс Из ТаблицаСеансов Цикл
380 | Сообщить(" Номер: " + Сеанс.НомерСоединения + ", Время начала: " + Сеанс.ВремяНачала + ", Имя пользователя: " + Сеанс.ИмяПользователя +
381 | ", Имя компьютера: " + Сеанс.ИмяКомпьютера + ", Приложение: " + Сеанс.Приложение);
382 | КонецЦикла;
383 | Иначе
384 | Сообщить("ПолучитьСписокСеансов: " + Запуск1С.ТекстОшибки);
385 | БылиОшибки = Истина;
386 | КонецЕсли;
387 |
388 | // Заблокируем сеансы
389 | Если Запуск1С.УстановитьБлокировкуНачалаСеансов() Тогда
390 | Сообщить("УстановитьБлокировкуНачалаСеансов: УСПЕШНО");
391 | Иначе
392 | Сообщить("УстановитьБлокировкуНачалаСеансов: " + Запуск1С.ТекстОшибки);
393 | БылиОшибки = Истина;
394 | КонецЕсли;
395 |
396 | // Завершим работу пользователей, наш сеанс должен закрыться
397 | Если Запуск1С.ЗавершитьРаботуПользователей() Тогда
398 | Сообщить("ЗавершитьРаботуПользователей: УСПЕШНО");
399 | Иначе
400 | Сообщить("ЗавершитьРаботуПользователей: " + Запуск1С.ТекстОшибки);
401 | БылиОшибки = Истина;
402 | КонецЕсли;
403 |
404 | ВыполнитьСборкуМусора();
405 |
406 | КонецЕсли;
407 |
408 | // Отключимся от хранилища
409 | Если Запуск1С.ОтключитьКонфигурациюОтХранилища() Тогда
410 | Сообщить("ОтключитьКонфигурациюОтХранилища: УСПЕШНО");
411 | Иначе
412 | Сообщить("ОтключитьКонфигурациюОтХранилища: " + Запуск1С.ТекстОшибки);
413 | БылиОшибки = Истина;
414 | КонецЕсли;
415 |
416 | // Выгрузим информационную базу
417 | ПолныйПутьКФайлу = ОбъединитьПути(РабочийКаталог,Запуск1С.ИмяФайлаПоИмениБазыНаДату("dt"));
418 | Если Запуск1С.ВыгрузитьИнформационнуюБазу(ПолныйПутьКФайлу) Тогда
419 | Сообщить("ВыгрузитьИнформационнуюБазу: УСПЕШНО " + " в " + ПолныйПутьКФайлу);
420 | Иначе
421 | Сообщить("ВыгрузитьИнформационнуюБазу: " + Запуск1С.ТекстОшибки);
422 | БылиОшибки = Истина;
423 | КонецЕсли;
424 |
425 | // Загрузим файл в информационную базу
426 | Если Запуск1С.ЗагрузитьИнформационнуюБазу(ПолныйПутьКФайлу) Тогда
427 | Сообщить("ЗагрузитьИнформационнуюБазу: УСПЕШНО " + " из " + ПолныйПутьКФайлу);
428 | Иначе
429 | Сообщить("ЗагрузитьИнформационнуюБазу: " + Запуск1С.ТекстОшибки);
430 | БылиОшибки = Истина;
431 | КонецЕсли;
432 | УдалитьФайлы(ПолныйПутьКФайлу);
433 |
434 | // Сохраним конфигурацию в файл
435 | ПолныйПутьКФайлу = ОбъединитьПути(РабочийКаталог,Запуск1С.ИмяФайлаПоИмениБазыНаДату("cf"));
436 | Если Запуск1С.СохранитьКонфигурациюВФайл(ПолныйПутьКФайлу) Тогда
437 | Сообщить("СохранитьКонфигурациюВФайл: УСПЕШНО " + " в " + ПолныйПутьКФайлу);
438 | Иначе
439 | Сообщить("СохранитьКонфигурациюВФайл: " + Запуск1С.ТекстОшибки);
440 | БылиОшибки = Истина;
441 | КонецЕсли;
442 |
443 | // Загрузим конфигурацию из файла
444 | Если Запуск1С.ЗагрузитьКонфигурациюИзФайла(ПолныйПутьКФайлу) Тогда
445 | Сообщить("ЗагрузитьКонфигурациюИзФайла: УСПЕШНО " + " из " + ПолныйПутьКФайлу);
446 | Иначе
447 | Сообщить("ЗагрузитьКонфигурациюИзФайла: " + Запуск1С.ТекстОшибки);
448 | БылиОшибки = Истина;
449 | КонецЕсли;
450 |
451 | // Сохраним конфигурацию баз данных в файл
452 | Если Запуск1С.СохранитьКонфигурациюБазыДанныхВФайл(ПолныйПутьКФайлу) Тогда
453 | Сообщить("СохранитьКонфигурациюБазыДанныхВФайл: УСПЕШНО " + " в " + ПолныйПутьКФайлу);
454 | Иначе
455 | Сообщить("СохранитьКонфигурациюБазыДанныхВФайл: " + Запуск1С.ТекстОшибки);
456 | БылиОшибки = Истина;
457 | КонецЕсли;
458 |
459 | // Сохраним конфигурацию хранилища в файл
460 | Если Запуск1С.СохранитьКонфигурациюИзХранилищаВФайл(ПолныйПутьКФайлу) Тогда
461 | Сообщить("СохранитьКонфигурациюИзХранилищаВФайл: УСПЕШНО " + " в " + ПолныйПутьКФайлу);
462 | Иначе
463 | Сообщить("СохранитьКонфигурациюИзХранилищаВФайл: " + Запуск1С.ТекстОшибки);
464 | БылиОшибки = Истина;
465 | КонецЕсли;
466 |
467 | // Обновим конфигурацию из хранилища
468 | Если Запуск1С.ОбновитьКонфигурациюИзХранилища() Тогда
469 | Сообщить("ОбновитьКонфигурациюИзХранилища: УСПЕШНО");
470 | Иначе
471 | Сообщить("ОбновитьКонфигурациюИзХранилища: " + Запуск1С.ТекстОшибки);
472 | БылиОшибки = Истина;
473 | КонецЕсли;
474 |
475 | // Обновим конфигурацию базы данных
476 | Если Запуск1С.ОбновитьКонфигурациюБазыДанных() Тогда
477 | Сообщить("ОбновитьКонфигурациюБазыДанных: УСПЕШНО");
478 | Иначе
479 | Сообщить("ОбновитьКонфигурациюБазыДанных: " + Запуск1С.ТекстОшибки);
480 | БылиОшибки = Истина;
481 | КонецЕсли;
482 |
483 | //Проверим, есть ли изменения в основной конфигурации
484 | ЕстьИзменения = Запуск1С.ЕстьИзмененияОсновнойКонфигурации();
485 | Если ЕстьИзменения <> Неопределено Тогда
486 | Сообщить("ЕстьИзмененияОсновнойКонфигурации: УСПЕШНО, Есть изменения: " + ?(ЕстьИзменения,"Да","Нет"));
487 | Иначе
488 | Сообщить("ЕстьИзмененияОсновнойКонфигурации: " + Запуск1С.ТекстОшибки);
489 | БылиОшибки = Истина;
490 | КонецЕсли;
491 |
492 | // Подключимся к хранилищу
493 | Если Запуск1С.ПодключитьКонфигурациюКХранилищу() Тогда
494 | Сообщить("ПодключитьКонфигурациюКХранилищу: УСПЕШНО");
495 | Иначе
496 | Сообщить("ПодключитьКонфигурациюКХранилищу: " + Запуск1С.ТекстОшибки);
497 | БылиОшибки = Истина;
498 | КонецЕсли;
499 |
500 | // Выполним очистку локального кэша хранилища конфигурации
501 | Если Запуск1С.ВыполнитьОчисткуЛокальногоКешаХранилища() Тогда
502 | Сообщить("ВыполнитьОчисткуЛокальногоКешаХранилища: УСПЕШНО");
503 | Иначе
504 | Сообщить("ВыполнитьОчисткуЛокальногоКешаХранилища: " + Запуск1С.ТекстОшибки);
505 | БылиОшибки = Истина;
506 | КонецЕсли;
507 |
508 | // Выполним очистку локальной базы данных хранилища конфигурации
509 | Если Запуск1С.ВыполнитьОчисткуЛокальнойБазыДанныхХранилища() Тогда
510 | Сообщить("ВыполнитьОчисткуЛокальнойБазыДанныхХранилища: УСПЕШНО");
511 | Иначе
512 | Сообщить("ВыполнитьОчисткуЛокальнойБазыДанныхХранилища: " + Запуск1С.ТекстОшибки);
513 | БылиОшибки = Истина;
514 | КонецЕсли;
515 |
516 | // Проверим, есть ли изменения в хранилище конфигураций
517 | ЕстьИзмененияВХранилище = Запуск1С.ЕстьИзмененияВХранилище();
518 | Если ЕстьИзмененияВХранилище <> Неопределено Тогда
519 | Сообщить("ЕстьИзмененияВХранилище: УСПЕШНО, Есть изменения: " + ?(ЕстьИзмененияВХранилище,"Да","Нет"));
520 | Иначе
521 | Сообщить("ЕстьИзмененияВХранилище: " + Запуск1С.ТекстОшибки);
522 | БылиОшибки = Истина;
523 | КонецЕсли;
524 |
525 | Если ПараметрыЗапуска.ТипБазы = "S" Тогда // Серверная база
526 |
527 | // Снимем блокировку пользователей
528 | Если Запуск1С.СнятьБлокировкуНачалаСеансов() Тогда
529 | Сообщить("СнятьБлокировкуНачалаСеансов: УСПЕШНО");
530 | Иначе
531 | Сообщить("СнятьБлокировкуНачалаСеансов: " + Запуск1С.ТекстОшибки);
532 | БылиОшибки = Истина;
533 | КонецЕсли;
534 |
535 | КонецЕсли;
536 |
537 | ```
538 |
539 |
540 |
--------------------------------------------------------------------------------
/lib.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/opm-metadata.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | TRun1C
4 | 2018.05.11
5 | Onyanov Vitaliy
6 | tavalik@mail.ru
7 | Библиотека для запуска 1С:Предприятие 8 в различных режимах
8 | 1.0.20
9 |
--------------------------------------------------------------------------------
/packagedef:
--------------------------------------------------------------------------------
1 | Описание.Имя("TRun1C")
2 | .Версия("2021.07.19")
3 | .Автор("Onyanov Vitaliy")
4 | .АдресАвтора("tavalik@mail.ru")
5 | .Описание("Библиотека для запуска 1С:Предприятие 8 в различных режимах")
6 | .ВерсияСреды("21.07.19")
7 | .ВключитьФайл("src")
8 | .ВключитьФайл("tests")
9 | .ВключитьФайл("lib.config")
10 | .ВключитьФайл("README.md")
11 | .ВключитьФайл("ПримерИспользования_TRun1C.os")
12 | ;
--------------------------------------------------------------------------------
/src/Classes/ТЗапуск1С.os:
--------------------------------------------------------------------------------
1 | // *****************************************************************
2 | // Библиотека: TRun1C
3 | // Автор: Онянов Виталий (Tavalik.ru)
4 | // Версия от 19.09.2023
5 | //
6 |
7 | // BSLLS:IfElseIfEndsWithElse-off
8 | // BSLLS:NumberOfOptionalParams-off
9 | // BSLLS:NumberOfParams-off
10 | // BSLLS:ExportVariables-off
11 |
12 | #Использовать 1commands
13 |
14 | // *****************************************************************
15 | // ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ
16 |
17 | // Структура параметров запуска, описание в процедуре ИнициироватьПараметры()
18 | Перем ПараметрыЗапуска Экспорт;
19 | // Переменная для возврата ошибки, если таковая имела место быть
20 | Перем ТекстОшибки Экспорт;
21 | // Переменная, отвечающая за вывод запускаемых команд
22 | Перем РежимОтладки Экспорт;
23 |
24 |
25 | // *****************************************************************
26 | // ЛОКАЛЬНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ
27 |
28 | // *****************************************************************
29 | Процедура ИнициироватьПараметры()
30 |
31 | ПараметрыЗапуска = Новый Структура;
32 |
33 | // Путь к платформе 1С,
34 | // Пример:
35 | // C:\Program Files (x86)\1cv8\8.3.8.2054\bin\1cv8.exe
36 | ПараметрыЗапуска.Вставить("ПутьКПлатформе1С", "");
37 |
38 | // Параметры запуска платформы 1С
39 | // Пример:
40 | // /VLen /Len
41 | ПараметрыЗапуска.Вставить("ПараметрыЗапускаПлатформы1С", "");
42 |
43 | // Версия Платформы 1С (Если не заполнена, вычисляется автоматически)
44 | // Пример:
45 | // 81
46 | // 82
47 | // 83
48 | ПараметрыЗапуска.Вставить("ВерсияПлатформы", "");
49 |
50 | // Тип базы 1С
51 | // Варианты:
52 | // F - файловая
53 | // S - серверная
54 | // WS - веб
55 | ПараметрыЗапуска.Вставить("ТипБазы", "S");
56 |
57 | // Имя базы 1С
58 | // Указывается как для файловой, так и для серверной базы:
59 | ПараметрыЗапуска.Вставить("ИмяБазы", "");
60 |
61 | // Параметры сервера 1С
62 | // Указывается только для серверной базы
63 | ПараметрыЗапуска.Вставить("АдресКластера", "localhost");
64 | ПараметрыЗапуска.Вставить("ПортКластера", "1541");
65 | ПараметрыЗапуска.Вставить("ПортАгента", "1540");
66 | ПараметрыЗапуска.Вставить("ИмяПользователяАдминистратораКластера", "");
67 | ПараметрыЗапуска.Вставить("ПарольПользователяАдминистратораКластера", "");
68 | ПараметрыЗапуска.Вставить("КодРазрешения", "987654321");
69 | ПараметрыЗапуска.Вставить("СообщениеПриБлокировке", "Информационная база заблокирована для обслуживания.");
70 | ПараметрыЗапуска.Вставить("АдресСервераАдминистрирования", "");
71 |
72 | // При указании имени файла, результат работы конфигуратора в пакетном режиме будет записан в данные файл файл
73 | ПараметрыЗапуска.Вставить("КоличествоПопытокПодключенияККластеру", 3);
74 |
75 | // Параметры авторизации в информационной базе
76 | ПараметрыЗапуска.Вставить("ИмяПользователя", "");
77 | ПараметрыЗапуска.Вставить("ПарольПользователя", "");
78 |
79 | // Параметры работы с хранилищем
80 | ПараметрыЗапуска.Вставить("АдресХранилища", "");
81 | ПараметрыЗапуска.Вставить("ИмяПользователяХранилища", "");
82 | ПараметрыЗапуска.Вставить("ПарольПользователяХранилища", "");
83 |
84 | // При установке данного флага, все дейстия в пакетном запуске конфигуратора будут видны пользователю
85 | ПараметрыЗапуска.Вставить("ВидныДействияВПакетномРежиме", Ложь);
86 | // При указании имени файла, результат работы конфигуратора в пакетном режиме будет записан в данные файл файл
87 | ПараметрыЗапуска.Вставить("ФайлДляЗаписиРезультатовРаботыВПакетномРежиме", "");
88 |
89 | // Текст ошибки
90 | ТекстОшибки = "";
91 | РежимОтладки = Ложь;
92 |
93 | КонецПроцедуры
94 |
95 | // *****************************************************************
96 | Функция ПолучитьВерсиюПлатформы()
97 |
98 | Если СтрНайти(ПараметрыЗапуска.ПутьКПлатформе1С, "\1cv8\8.3.") > 0 Тогда
99 | Возврат "83";
100 | КонецЕсли;
101 |
102 | Если СтрНайти(ПараметрыЗапуска.ПутьКПлатформе1С, "\1cv82\8.2.") > 0 Тогда
103 | Возврат "82";
104 | КонецЕсли;
105 |
106 | Если СтрНайти(ПараметрыЗапуска.ПутьКПлатформе1С, "\1cv81\") > 0 Тогда
107 | Возврат "81";
108 | КонецЕсли;
109 |
110 | Возврат "";
111 |
112 | КонецФункции
113 |
114 | // *****************************************************************
115 | Функция ВсеПараметрыЗапускаЗаполненыКорректно(ПроверятьАдресХранилища = Ложь, ПроверятьИмяПользователяХранилища = Ложь)
116 |
117 | Если НЕ ЗначениеЗаполнено(ПараметрыЗапуска.ПутьКПлатформе1С) Тогда
118 | ТекстОшибки = "Не заполнен путь к платформе 1С!";
119 | Возврат Ложь;
120 | КонецЕсли;
121 |
122 | Если НЕ ЗначениеЗаполнено(ПараметрыЗапуска.ВерсияПлатформы) Тогда
123 | // Попробуем определить версию платформы
124 | ПараметрыЗапуска.ВерсияПлатформы = ПолучитьВерсиюПлатформы();
125 | Если Не ЗначениеЗаполнено(ПараметрыЗапуска.ВерсияПлатформы) Тогда
126 | ТекстОшибки = "Не заполнена версия COMConnector!";
127 | Возврат Ложь;
128 | КонецЕсли;
129 | КонецЕсли;
130 |
131 | Если НЕ ЗначениеЗаполнено(ПараметрыЗапуска.ТипБазы) Тогда
132 | ТекстОшибки = "Не заполнен тип базы 1С!";
133 | Возврат Ложь;
134 | КонецЕсли;
135 |
136 | Если НЕ ЗначениеЗаполнено(ПараметрыЗапуска.ИмяБазы) Тогда
137 | ТекстОшибки = "Не заполнено имя базы 1С!";
138 | Возврат Ложь;
139 | КонецЕсли;
140 |
141 | Если ПараметрыЗапуска.ТипБазы = "S" Тогда
142 |
143 | Если НЕ ЗначениеЗаполнено(ПараметрыЗапуска.АдресКластера) Тогда
144 | ТекстОшибки = "Не заполнен адрес кластера серверов 1С!";
145 | Возврат Ложь;
146 | КонецЕсли;
147 |
148 | Если НЕ ЗначениеЗаполнено(ПараметрыЗапуска.ПортКластера) Тогда
149 | ТекстОшибки = "Не заполнен порт кластера серверов 1С!";
150 | Возврат Ложь;
151 | КонецЕсли;
152 |
153 | Если НЕ ЗначениеЗаполнено(ПараметрыЗапуска.ПортАгента) Тогда
154 | ТекстОшибки = "Не заполнен порт агента кластера серверов 1С!";
155 | Возврат Ложь;
156 | КонецЕсли;
157 |
158 | Если НЕ ЗначениеЗаполнено(ПараметрыЗапуска.КодРазрешения) Тогда
159 | ТекстОшибки = "Не заполнен код разрешения при блокировке сансов 1С!";
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 | Если СтрДлина(Параметр) = 0 Тогда
192 | Возврат "";
193 | Иначе
194 | Если СтрДлина(Ключ) = 0 Тогда
195 | Если ОбернутьВКавычки Тогда
196 | Возврат ОбернутьВКавычки(СокрЛП(Параметр)) + " ";
197 | Иначе
198 | Возврат Параметр + " ";
199 | КонецЕсли;
200 | Иначе
201 | Если ОбернутьВКавычки Тогда
202 | Возврат СимволКлюча + Ключ + ОбернутьВКавычки(СокрЛП(Параметр)) + " ";
203 | Иначе
204 | Возврат СимволКлюча + Ключ + СокрЛП(Параметр) + " ";
205 | КонецЕсли;
206 | КонецЕсли;
207 | КонецЕсли;
208 |
209 | КонецФункции
210 |
211 | // *****************************************************************
212 | Функция ПрочитатьТекстовыйФайл(ИмяФайла)
213 |
214 | Если ПустаяСтрока(ИмяФайла) Тогда
215 | Возврат "";
216 | КонецЕсли;
217 |
218 | Файл = Новый Файл(ИмяФайла);
219 | Если Не Файл.Существует() Тогда
220 | Возврат "";
221 | КонецЕсли;
222 |
223 | ЧтениеТекста = Новый ЧтениеТекста(ИмяФайла);
224 | ТекстФайла = ЧтениеТекста.Прочитать();
225 | ЧтениеТекста.Закрыть();
226 |
227 | Возврат ТекстФайла;
228 |
229 | КонецФункции
230 |
231 | //*****************************************************************
232 | Функция ВыполнитьЗапуск1С(ТипПриложения = "", ДопСтрокаЗапуска = "", ОжидатьЗавершения = Истина, ТонкийКлиент = Ложь)
233 |
234 | КодВозврата = 0;
235 | ТекстОшибки = "";
236 |
237 | // Проверим ключевые параметры запуска
238 | Если НЕ ВсеПараметрыЗапускаЗаполненыКорректно() Тогда
239 | Возврат Ложь;
240 | КонецЕсли;
241 |
242 | ИмяФайлаЛога = ПолучитьИмяВременногоФайла("txt");
243 |
244 | СтрокаЗапуска =
245 | ВставитьПараметрЗапуска(ПараметрыЗапуска.ПутьКПлатформе1С) +
246 | ВставитьПараметрЗапуска(ТипПриложения, , , Ложь) +
247 | ВставитьПараметрЗапуска(ПараметрыЗапуска.ПараметрыЗапускаПлатформы1С, , , Ложь) +
248 | ?(ПараметрыЗапуска.ТипБазы = "S",
249 | ВставитьПараметрЗапуска(ПараметрыЗапуска.АдресКластера + ":" + ПараметрыЗапуска.ПортКластера +
250 | "\" + ПараметрыЗапуска.ИмяБазы, ПараметрыЗапуска.ТипБазы),
251 | ВставитьПараметрЗапуска(ПараметрыЗапуска.ИмяБазы, ПараметрыЗапуска.ТипБазы)) +
252 | ВставитьПараметрЗапуска(ПараметрыЗапуска.ИмяПользователя, "N") +
253 | ВставитьПараметрЗапуска(ПараметрыЗапуска.ПарольПользователя, "P") +
254 | ВставитьПараметрЗапуска(ПараметрыЗапуска.АдресХранилища,"ConfigurationRepositoryF") +
255 | ВставитьПараметрЗапуска(ПараметрыЗапуска.ИмяПользователяХранилища,"ConfigurationRepositoryN") +
256 | ВставитьПараметрЗапуска(ПараметрыЗапуска.ПарольПользователяХранилища,"ConfigurationRepositoryP") +
257 | ВставитьПараметрЗапуска(ПараметрыЗапуска.КодРазрешения, "UC", , Ложь) +
258 | ВставитьПараметрЗапуска(ИмяФайлаЛога, "Out") +
259 | ?(ПараметрыЗапуска.ВидныДействияВПакетномРежиме, "/Visible ", "") +
260 | ?(ЗначениеЗаполнено(ПараметрыЗапуска.ФайлДляЗаписиРезультатовРаботыВПакетномРежиме),
261 | ВставитьПараметрЗапуска(ПараметрыЗапуска.ФайлДляЗаписиРезультатовРаботыВПакетномРежиме,"DumpResult "),
262 | "") +
263 | "/DisableStartupMessages " +
264 | "/DisableStartupDialogs " +
265 | ДопСтрокаЗапуска;
266 |
267 | Если ТонкийКлиент Тогда
268 | СтрокаЗапуска = СтрЗаменить(СтрокаЗапуска, "1cv8.exe", "1cv8c.exe");
269 | КонецЕсли;
270 |
271 | Если РежимОтладки Тогда
272 | Сообщить(СтрокаЗапуска);
273 | КонецЕсли;
274 |
275 | Попытка
276 | ЗапуститьПриложение(СтрокаЗапуска, , ОжидатьЗавершения, КодВозврата);
277 | Исключение
278 | ТекстОшибки = ОписаниеОшибки();
279 | Возврат Ложь;
280 | КонецПопытки;
281 |
282 | ТекстСообщения = ПрочитатьТекстовыйФайл(ИмяФайлаЛога);
283 | УдалитьФайлы(ИмяФайлаЛога);
284 |
285 | // Проверим код возврата
286 | Если КодВозврата <> 0 Тогда
287 |
288 | ТекстОшибки = "Ошибка запуска выполнения команды, КодВозврата: " + КодВозврата + Символы.ПС +
289 | "Строка запуска: " + СтрокаЗапуска + Символы.ПС +
290 | "Служебные сообщения: " + Символы.ПС + ТекстСообщения;
291 | Возврат Ложь;
292 |
293 | КонецЕсли;
294 |
295 | Возврат Истина;
296 |
297 | КонецФункции
298 |
299 | // *****************************************************************
300 | // ЭКСПОРТНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ
301 |
302 | #Область ПрочиеПроцедурыФункции
303 |
304 | // *****************************************************************
305 | // Выполняет сборс всех параметров запуска к настройкам по умолчанию
306 | //
307 | Процедура ОчиститьПараметры() Экспорт
308 |
309 | ПараметрыЗапуска = Неопределено;
310 | ИнициироватьПараметры();
311 |
312 | КонецПроцедуры
313 |
314 | // *****************************************************************
315 | // Возвращает имя файла, построенном по принципу: ИмяБазы + ДатаВремя + Расширение
316 | // Пример: Base_2017_04_28_19_02_12.dt
317 | //
318 | Функция ИмяФайлаПоИмениБазыНаДату(Расширение) Экспорт
319 |
320 | ТекИмяБазы = СокрЛП(ПараметрыЗапуска.ИмяБазы);
321 | Если ПараметрыЗапуска.ТипБазы = "F" Тогда
322 | НомерСлеша = 0;
323 | Для Сч = 1 По СтрДлина(ТекИмяБазы) Цикл
324 | Если Сред(ТекИмяБазы, Сч, 1) = "\" Тогда
325 | НомерСлеша = Сч;
326 | КонецЕсли;
327 | КонецЦикла;
328 | ТекИмяБазы = Сред(ТекИмяБазы, НомерСлеша + 1);
329 | КонецЕсли;
330 |
331 | Возврат СокрЛП(ТекИмяБазы) + Формат(ТекущаяДата(),"ДФ=_yyyy_MM_dd_ЧЧ_мм_сс") + "." + Расширение;
332 |
333 | КонецФункции
334 |
335 | #КонецОбласти
336 |
337 | #Область УправлениеКластером
338 |
339 | // *****************************************************************
340 | // Получает список текущих сеансов с информационной базой
341 | //
342 | Функция ПолучитьСписокСеансов(ПропускатьКонсольКластера = Ложь) Экспорт
343 |
344 | Если ПустаяСтрока(ПараметрыЗапуска.АдресСервераАдминистрирования) Тогда
345 | Возврат COM_ПолучитьСписокСеансов(ПропускатьКонсольКластера);
346 | Иначе
347 | Возврат СА_ПолучитьСписокСеансов();
348 | КонецЕсли;
349 |
350 | КонецФункции
351 |
352 | // *****************************************************************
353 | // Завершает работу пользователей для серверной базы
354 | //
355 | Функция ЗавершитьРаботуПользователей() Экспорт
356 |
357 | Если ПустаяСтрока(ПараметрыЗапуска.АдресСервераАдминистрирования) Тогда
358 | Возврат COM_ЗавершитьРаботуПользователей();
359 | Иначе
360 | Результат = СА_ЗавершитьСеансы();
361 | Результат = Результат И СА_РазорватьСоединения();
362 | Возврат Результат;
363 | КонецЕсли;
364 |
365 | КонецФункции
366 |
367 | // *****************************************************************
368 | // Устанавливает блокирвку сенасов для серверной базы
369 | //
370 | Функция УстановитьБлокировкуНачалаСеансов(БлокироватьРегламентныеЗадания = Ложь, МинутОжиданияЗавершенияСеансов = 0) Экспорт
371 |
372 | Если ПустаяСтрока(ПараметрыЗапуска.АдресСервераАдминистрирования) Тогда
373 | Успех = COM_ИзменитьБлокировкуНачалаСеансов(Истина, МинутОжиданияЗавершенияСеансов);
374 | Если БлокироватьРегламентныеЗадания Тогда
375 | Успех = Успех И COM_ИзменитьБлокировкуРегламентныхЗаданий(Истина);
376 | КонецЕсли;
377 | Иначе
378 | Успех = СА_ИзменитьБлокировкуНачалаСеансов(Истина, МинутОжиданияЗавершенияСеансов);
379 | Если БлокироватьРегламентныеЗадания Тогда
380 | Успех = Успех И СА_ИзменитьБлокировкуРегламентныхЗаданий(Истина);
381 | КонецЕсли;
382 | КонецЕсли;
383 |
384 | Возврат Успех;
385 |
386 | КонецФункции
387 |
388 | // *****************************************************************
389 | // Снимает блокировку сеансов для серверной базы
390 | //
391 | Функция СнятьБлокировкуНачалаСеансов(СнятьБлокировкуРегламентныхЗаданий = Ложь) Экспорт
392 |
393 | Если ПустаяСтрока(ПараметрыЗапуска.АдресСервераАдминистрирования) Тогда
394 | Успех = COM_ИзменитьБлокировкуНачалаСеансов(Ложь);
395 | Если СнятьБлокировкуРегламентныхЗаданий Тогда
396 | Успех = Успех И COM_ИзменитьБлокировкуРегламентныхЗаданий(Ложь);
397 | КонецЕсли;
398 | Иначе
399 | Успех = СА_ИзменитьБлокировкуНачалаСеансов(Ложь);
400 | Если СнятьБлокировкуРегламентныхЗаданий Тогда
401 | Успех = Успех И СА_ИзменитьБлокировкуРегламентныхЗаданий(Ложь);
402 | КонецЕсли;
403 | КонецЕсли;
404 |
405 | Возврат Успех;
406 |
407 | КонецФункции
408 |
409 | // *****************************************************************
410 | // Устанавливает блокирвку сенасов для серверной базы
411 | //
412 | Функция УстановитьБлокировкуРегламентныхЗаданий() Экспорт
413 |
414 | Если ПустаяСтрока(ПараметрыЗапуска.АдресСервераАдминистрирования) Тогда
415 | Возврат COM_ИзменитьБлокировкуРегламентныхЗаданий(Истина);
416 | Иначе
417 | Возврат СА_ИзменитьБлокировкуРегламентныхЗаданий(Истина);
418 | КонецЕсли;
419 |
420 | КонецФункции
421 |
422 | // *****************************************************************
423 | // Снимает блокирвку сенасов для серверной базы
424 | //
425 | Функция СнятьБлокировкуРегламентныхЗаданий() Экспорт
426 |
427 | Если ПустаяСтрока(ПараметрыЗапуска.АдресСервераАдминистрирования) Тогда
428 | Возврат COM_ИзменитьБлокировкуРегламентныхЗаданий(Ложь);
429 | Иначе
430 | Возврат СА_ИзменитьБлокировкуРегламентныхЗаданий(Ложь);
431 | КонецЕсли;
432 |
433 | КонецФункции
434 |
435 | // *****************************************************************
436 | // Возвращает флог блокирвки сенасов для серверной базы
437 | //
438 | Функция ПолучитьБлокировкуРегламентныхЗаданий() Экспорт
439 |
440 | Если ПустаяСтрока(ПараметрыЗапуска.АдресСервераАдминистрирования) Тогда
441 | Возврат COM_ПолучитьБлокировкуРегламентныхЗаданий();
442 | Иначе
443 | ДанныеИнформационнойБазы = СА_ПолучитьДанныеИнформационнойБазы();
444 | Если ДанныеИнформационнойБазы = Неопределено Тогда
445 | Возврат Неопределено;
446 | Иначе
447 | Возврат ДанныеИнформационнойБазы.scheduledjobsdeny;
448 | КонецЕсли;
449 | КонецЕсли;
450 |
451 | КонецФункции
452 |
453 | // *****************************************************************
454 | // Удаляет информационную базу из кластера
455 | //
456 | // Параметры:
457 | // Режим - режим удаления информационной базы:
458 | // 0 - при удалении информационной базы базу данных не удалять;
459 | // 1 - при удалении информационной базы удалить базу данных;
460 | // 2 - при удалении информационной базы очистить базу данных.
461 | //
462 | Функция УдалитьИнформационнуюБазу(Режим = 0) Экспорт
463 |
464 | Возврат COM_УдалитьИнформационнуюБазу(Режим);
465 | // ДОДЕЛАТЬ ДЛЯ СЕРВЕРА АДМИНИСТРИРОВАНИЯ
466 |
467 | КонецФункции
468 |
469 | #Область УправлениеКластеромЧерезCOM
470 |
471 | // *****************************************************************
472 | // Получает список текущих сеансов с информационной базой
473 | //
474 | Функция COM_ПолучитьСписокСеансов(ПропускатьКонсольКластера = Истина) Экспорт
475 |
476 | БазаБылаНайдена = Ложь;
477 | ТекстОшибки = "";
478 |
479 | // Проверим, не файловая ли база
480 | Если ПараметрыЗапуска.ТипБазы = "F" Тогда
481 | ТекстОшибки = "Недоступно для файловой базы";
482 | Возврат Неопределено;
483 | КонецЕсли;
484 |
485 | // Проверим ключевые параметры запуска
486 | Если Не ВсеПараметрыЗапускаЗаполненыКорректно() Тогда
487 | Возврат Неопределено;
488 | КонецЕсли;
489 |
490 | ТаблицаСеансов = Новый ТаблицаЗначений;
491 | ТаблицаСеансов.Колонки.Добавить("НомерСоединения");
492 | ТаблицаСеансов.Колонки.Добавить("ВремяНачала");
493 | ТаблицаСеансов.Колонки.Добавить("ИмяПользователя");
494 | ТаблицаСеансов.Колонки.Добавить("ИмяКомпьютера");
495 | ТаблицаСеансов.Колонки.Добавить("Приложение");
496 |
497 | Попытка
498 |
499 | // Получаем COMConnector
500 | Коннектор = Новый COMОбъект("v" + ПараметрыЗапуска.ВерсияПлатформы + ".COMConnector");
501 | // Получаем Соединение с агентом сервера
502 | СоединениеСАгентомСервера = Коннектор.ConnectAgent(ПараметрыЗапуска.АдресКластера
503 | + ":" + ПараметрыЗапуска.ПортАгента);
504 |
505 | // Получаем список кластеров
506 | КластерыСерверов = СоединениеСАгентомСервера.GetClusters();
507 | Для Каждого КластерСерверов Из КластерыСерверов Цикл
508 |
509 | // Аутентификация администратора кластера серверов
510 | СоединениеСАгентомСервера.Authenticate(
511 | КластерСерверов,ПараметрыЗапуска.ИмяПользователяАдминистратораКластера,
512 | ПараметрыЗапуска.ПарольПользователяАдминистратораКластера);
513 |
514 | // Получаем все рабочие процессы
515 | РабочиеПроцессы = СоединениеСАгентомСервера.GetWorkingProcesses(КластерСерверов);
516 | Для Каждого РабочийПроцесс Из РабочиеПроцессы Цикл
517 |
518 | // Создаем соединение с рабочим процессом
519 | Если ПараметрыЗапуска.АдресКластера <> РабочийПроцесс.HostName Тогда
520 | Продолжить;
521 | КонецЕсли;
522 |
523 | Попытка
524 | СоединениеСРабочимПроцессом = Коннектор.ConnectWorkingProcess(
525 | ПараметрыЗапуска.АдресКластера + ":" + СтрЗаменить(РабочийПроцесс.MainPort, Символы.НПП, ""));
526 | Исключение
527 | // Рабочего процесса может уже не быть.
528 | Продолжить;
529 | КонецПопытки;
530 |
531 | // Выполняем аутентификацию
532 | СоединениеСРабочимПроцессом.AddAuthentication(
533 | ПараметрыЗапуска.ИмяПользователя,
534 | ПараметрыЗапуска.ПарольПользователя);
535 |
536 | // Получаем информационные базы
537 | ИнформационныеБазы = СоединениеСРабочимПроцессом.GetInfoBases();
538 | Для Каждого ИнформационнаяБаза ИЗ ИнформационныеБазы Цикл
539 |
540 | Если НРег(ИнформационнаяБаза.Name) = НРег(ПараметрыЗапуска.ИмяБазы) Тогда
541 |
542 | // Пометим, что база была найдена
543 | БазаБылаНайдена = Истина;
544 |
545 | // Получаем массив соединений информационной базы
546 | Соединения = СоединениеСРабочимПроцессом.GetInfoBaseConnections(ИнформационнаяБаза);
547 | Для Каждого Соединение Из Соединения Цикл
548 |
549 | // Не трогаем сенасы в коносле кластера
550 | Если ПропускатьКонсольКластера И НРег(Соединение.AppID) = "comconsole" Тогда
551 | Продолжить;
552 | КонецЕсли;
553 |
554 | // Добавить соединение в таблицу
555 | НоваяСтрока = ТаблицаСеансов.Добавить();
556 | НоваяСтрока.НомерСоединения = Соединение.ConnID;
557 | НоваяСтрока.ВремяНачала = Соединение.ConnectedAt;
558 | НоваяСтрока.ИмяКомпьютера = Соединение.HostName;
559 | НоваяСтрока.ИмяПользователя = Соединение.UserName;
560 |
561 | Приложение = Соединение.AppID;
562 | Если Приложение = "1CV8"
563 | ИЛИ Приложение = "1CV8C" Тогда
564 | НоваяСтрока.Приложение = "1С:Предприятие";
565 | ИначеЕсли Приложение = "Designer" Тогда
566 | НоваяСтрока.Приложение = "Конфигуратор";
567 | ИначеЕсли Приложение = "SrvrConsole" Тогда
568 | НоваяСтрока.Приложение = "Консоль кластера";
569 | ИначеЕсли Приложение = "BackgroundJob" Тогда
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 | КонецЕсли;
598 |
599 | КонецФункции
600 |
601 | // *****************************************************************
602 | Функция COM_ЗавершитьРаботуПользователей() Экспорт
603 |
604 | БазаБылаНайдена = Ложь;
605 | ТекстОшибки = "";
606 |
607 | // Проверим, не файловая ли база
608 | Если ПараметрыЗапуска.ТипБазы = "F" Тогда
609 | ТекстОшибки = "Недоступно для файловой базы";
610 | Возврат Ложь;
611 | КонецЕсли;
612 |
613 | // Проверим ключевые параметры запуска
614 | Если НЕ ВсеПараметрыЗапускаЗаполненыКорректно() Тогда
615 | Возврат Ложь;
616 | КонецЕсли;
617 |
618 | Попытка
619 |
620 | // Получаем COMConnector
621 | Коннектор = Новый COMОбъект("v" + ПараметрыЗапуска.ВерсияПлатформы + ".COMConnector");
622 | // Получаем Соединение с агентом сервера
623 | СоединениеСАгентомСервера = Коннектор.ConnectAgent(
624 | ПараметрыЗапуска.АдресКластера + ":" + ПараметрыЗапуска.ПортАгента);
625 |
626 | // Получаем список кластеров
627 | КластерыСерверов = СоединениеСАгентомСервера.GetClusters();
628 | Для Каждого КластерСерверов Из КластерыСерверов Цикл
629 |
630 | // Аутентификация администратора кластера серверов
631 | СоединениеСАгентомСервера.Authenticate(
632 | КластерСерверов,ПараметрыЗапуска.ИмяПользователяАдминистратораКластера,
633 | ПараметрыЗапуска.ПарольПользователяАдминистратораКластера);
634 |
635 | // Получаем все рабочие процессы
636 | РабочиеПроцессы = СоединениеСАгентомСервера.GetWorkingProcesses(КластерСерверов);
637 | Для Каждого РабочийПроцесс Из РабочиеПроцессы Цикл
638 |
639 | // Создаем соединение с рабочим процессом
640 | Если НРег(ПараметрыЗапуска.АдресКластера) <> НРег(РабочийПроцесс.HostName) Тогда
641 | Продолжить;
642 | КонецЕсли;
643 |
644 | Попытка
645 | СоединениеСРабочимПроцессом = Коннектор.ConnectWorkingProcess(
646 | ПараметрыЗапуска.АдресКластера + ":" + СтрЗаменить(РабочийПроцесс.MainPort, Символы.НПП, ""));
647 | Исключение
648 | // Рабочего процесса может уже не быть.
649 | Продолжить;
650 | КонецПопытки;
651 |
652 | // Выполняем аутентификацию
653 | СоединениеСРабочимПроцессом.AddAuthentication(
654 | ПараметрыЗапуска.ИмяПользователя,
655 | ПараметрыЗапуска.ПарольПользователя);
656 |
657 | // Разрываем сеансы для указанной информационной базы
658 | Сеансы = СоединениеСАгентомСервера.GetSessions(КластерСерверов);
659 | Для Каждого Сеанс Из Сеансы Цикл
660 | Если НРег(Сеанс.InfoBase.Name) = НРег(ПараметрыЗапуска.ИмяБазы) Тогда
661 | СоединениеСАгентомСервера.TerminateSession(КластерСерверов, Сеанс);
662 | КонецЕсли;
663 | КонецЦикла;
664 |
665 | // Теперь разрываем соединения
666 | // Получаем информационные базы
667 | ИнформационныеБазы = СоединениеСРабочимПроцессом.GetInfoBases();
668 | Для Каждого ИнформационнаяБаза Из ИнформационныеБазы Цикл
669 |
670 | Если НРег(ИнформационнаяБаза.Name) = НРег(ПараметрыЗапуска.ИмяБазы) Тогда
671 |
672 | // Пометим, что база была найдена
673 | БазаБылаНайдена = Истина;
674 |
675 | // Получаем массив соединений информационной базы
676 | Соединения = СоединениеСРабочимПроцессом.GetInfoBaseConnections(ИнформационнаяБаза);
677 | Для Каждого Соединение Из Соединения Цикл
678 |
679 | // Не трогаем сенасы в коносле кластера
680 | Если НРег(Соединение.AppID) = "comconsole" Тогда
681 | Продолжить;
682 | КонецЕсли;
683 |
684 | // Разрываем соединение
685 | СоединениеСРабочимПроцессом.Disconnect(Соединение);
686 |
687 | КонецЦикла;
688 |
689 | Прервать;
690 |
691 | КонецЕсли;
692 |
693 | КонецЦикла;
694 |
695 | КонецЦикла;
696 |
697 | КонецЦикла;
698 |
699 | Исключение
700 | ТекстОшибки = ОписаниеОшибки();
701 | Возврат Ложь;
702 | КонецПопытки;
703 |
704 | Если НЕ БазаБылаНайдена Тогда
705 | ТекстОшибки = "Информационная база не была найдена в кластере";
706 | Возврат Ложь;
707 | Иначе
708 | Возврат Истина;
709 | КонецЕсли;
710 |
711 | КонецФункции
712 |
713 | // *****************************************************************
714 | Функция COM_ИзменитьБлокировкуНачалаСеансов(Флаг = Истина, МинутОжиданияЗавершенияСеансов = 0) Экспорт
715 |
716 | БазаБылаНайдена = Ложь;
717 | ТекстОшибки = "";
718 |
719 | // Проверим, не файловая ли база
720 | Если ПараметрыЗапуска.ТипБазы = "F" Тогда
721 | ТекстОшибки = "Недоступно для файловой базы";
722 | Возврат Ложь;
723 | КонецЕсли;
724 |
725 | // Проверим ключевые параметры запуска
726 | Если НЕ ВсеПараметрыЗапускаЗаполненыКорректно() Тогда
727 | Возврат Ложь;
728 | КонецЕсли;
729 |
730 | Попытка
731 |
732 | // Получаем COMConnector
733 | Коннектор = Новый COMОбъект("v" + ПараметрыЗапуска.ВерсияПлатформы + ".COMConnector");
734 | // Получаем Соединение с агентом сервера
735 | СоединениеСАгентомСервера = Коннектор.ConnectAgent(
736 | ПараметрыЗапуска.АдресКластера + ":" + ПараметрыЗапуска.ПортАгента);
737 |
738 | // Получаем список кластеров
739 | КластерыСерверов = СоединениеСАгентомСервера.GetClusters();
740 | Для Каждого КластерСерверов Из КластерыСерверов Цикл
741 |
742 | // Аутентификация администратора кластера серверов
743 | СоединениеСАгентомСервера.Authenticate(
744 | КластерСерверов,
745 | ПараметрыЗапуска.ИмяПользователяАдминистратораКластера,
746 | ПараметрыЗапуска.ПарольПользователяАдминистратораКластера);
747 |
748 | // Получаем все рабочие процессы
749 | РабочиеПроцессы = СоединениеСАгентомСервера.GetWorkingProcesses(КластерСерверов);
750 | Для Каждого РабочийПроцесс Из РабочиеПроцессы Цикл
751 |
752 | // Создаем соединение с рабочим процессом
753 | Если ПараметрыЗапуска.АдресКластера <> РабочийПроцесс.HostName Тогда
754 | Продолжить;
755 | КонецЕсли;
756 |
757 | Попытка
758 | СоединениеСРабочимПроцессом = Коннектор.ConnectWorkingProcess(
759 | ПараметрыЗапуска.АдресКластера + ":" + СтрЗаменить(РабочийПроцесс.MainPort, Символы.НПП, ""));
760 | Исключение
761 | // Рабочего процесса может уже не быть.
762 | Продолжить;
763 | КонецПопытки;
764 |
765 | // Выполняем аутентификацию
766 | СоединениеСРабочимПроцессом.AddAuthentication(
767 | ПараметрыЗапуска.ИмяПользователя,
768 | ПараметрыЗапуска.ПарольПользователя);
769 |
770 | // Получаем информационные базы
771 | ИнформационныеБазы = СоединениеСРабочимПроцессом.GetInfoBases();
772 | Для Каждого ИнформационнаяБаза ИЗ ИнформационныеБазы Цикл
773 |
774 | Если НРег(ИнформационнаяБаза.Name) = НРег(ПараметрыЗапуска.ИмяБазы) Тогда
775 |
776 | // Пометим, что база была найдена
777 | БазаБылаНайдена = Истина;
778 |
779 | // Блокируем начало сеансов
780 | Если ПараметрыЗапуска.ВерсияПлатформы = "81" Тогда
781 | ИнформационнаяБаза.ConnectDenied = Флаг;
782 | Иначе
783 | ИнформационнаяБаза.SessionsDenied = Флаг;
784 | КонецЕсли;
785 |
786 | Если Флаг Тогда
787 | ИнформационнаяБаза.PermissionCode = ПараметрыЗапуска.КодРазрешения;
788 | ИнформационнаяБаза.DeniedMessage = ПараметрыЗапуска.СообщениеПриБлокировке;
789 | ИнформационнаяБаза.DeniedFrom = ТекущаяДата() + 60 * МинутОжиданияЗавершенияСеансов;
790 | Иначе
791 | ИнформационнаяБаза.PermissionCode = "";
792 | ИнформационнаяБаза.DeniedMessage = "";
793 | ИнформационнаяБаза.DeniedFrom = Дата("00010101");
794 | КонецЕсли;
795 |
796 | // Изменяем параметры информационной базы
797 | СоединениеСРабочимПроцессом.UpdateInfoBase(ИнформационнаяБаза);
798 |
799 | Прервать;
800 |
801 | КонецЕсли;
802 |
803 | КонецЦикла;
804 |
805 | КонецЦикла;
806 |
807 | КонецЦикла;
808 |
809 | Исключение
810 | ТекстОшибки = ОписаниеОшибки();
811 | Возврат Ложь;
812 | КонецПопытки;
813 |
814 | Если НЕ БазаБылаНайдена Тогда
815 | ТекстОшибки = "Информационная база не была найдена в кластере";
816 | Возврат Ложь;
817 | Иначе
818 | Возврат Истина;
819 | КонецЕсли;
820 |
821 | КонецФункции
822 |
823 | // *****************************************************************
824 | // Устанавливает блокировку регламентных заданий для серверной базы
825 | //
826 | Функция COM_ИзменитьБлокировкуРегламентныхЗаданий(Флаг = Истина) Экспорт
827 |
828 | БазаБылаНайдена = Ложь;
829 | ТекстОшибки = "";
830 |
831 | // Проверим, не файловая ли база
832 | Если ПараметрыЗапуска.ТипБазы = "F" Тогда
833 | ТекстОшибки = "Недоступно для файловой базы";
834 | Возврат Ложь;
835 | КонецЕсли;
836 |
837 | // Проверим ключевые параметры запуска
838 | Если НЕ ВсеПараметрыЗапускаЗаполненыКорректно() Тогда
839 | Возврат Ложь;
840 | КонецЕсли;
841 |
842 | Попытка
843 |
844 | // Получаем COMConnector
845 | Коннектор = Новый COMОбъект("v" + ПараметрыЗапуска.ВерсияПлатформы + ".COMConnector");
846 | // Получаем Соединение с агентом сервера
847 | СоединениеСАгентомСервера = Коннектор.ConnectAgent(
848 | ПараметрыЗапуска.АдресКластера + ":" + ПараметрыЗапуска.ПортАгента);
849 |
850 | // Получаем список кластеров
851 | КластерыСерверов = СоединениеСАгентомСервера.GetClusters();
852 | Для Каждого КластерСерверов Из КластерыСерверов Цикл
853 |
854 | // Аутентификация администратора кластера серверов
855 | СоединениеСАгентомСервера.Authenticate(
856 | КластерСерверов,
857 | ПараметрыЗапуска.ИмяПользователяАдминистратораКластера,
858 | ПараметрыЗапуска.ПарольПользователяАдминистратораКластера);
859 |
860 | // Получаем все рабочие процессы
861 | РабочиеПроцессы = СоединениеСАгентомСервера.GetWorkingProcesses(КластерСерверов);
862 | Для Каждого РабочийПроцесс Из РабочиеПроцессы Цикл
863 |
864 | Попытка
865 | СоединениеСРабочимПроцессом = Коннектор.ConnectWorkingProcess(
866 | ПараметрыЗапуска.АдресКластера + ":" + СтрЗаменить(РабочийПроцесс.MainPort, Символы.НПП, ""));
867 | Исключение
868 | // Рабочего процесса может уже не быть.
869 | Продолжить;
870 | КонецПопытки;
871 |
872 | // Выполняем аутентификацию
873 | СоединениеСРабочимПроцессом.AddAuthentication(
874 | ПараметрыЗапуска.ИмяПользователя,
875 | ПараметрыЗапуска.ПарольПользователя);
876 |
877 | // Получаем информационные базы
878 | ИнформационныеБазы = СоединениеСРабочимПроцессом.GetInfoBases();
879 | Для Каждого ИнформационнаяБаза Из ИнформационныеБазы Цикл
880 |
881 | Если НРег(ИнформационнаяБаза.Name) = НРег(ПараметрыЗапуска.ИмяБазы) Тогда
882 |
883 | // Пометим, что база была найдена
884 | БазаБылаНайдена = Истина;
885 |
886 | // Блокируем регламентные задания
887 | ИнформационнаяБаза.ScheduledJobsDenied = Флаг;
888 |
889 | // Изменяем параметры информационной базы
890 | СоединениеСРабочимПроцессом.UpdateInfoBase(ИнформационнаяБаза);
891 |
892 | Прервать;
893 |
894 | КонецЕсли;
895 |
896 | КонецЦикла;
897 |
898 | КонецЦикла;
899 |
900 | КонецЦикла;
901 |
902 | Исключение
903 | ТекстОшибки = ОписаниеОшибки();
904 | Возврат Ложь;
905 | КонецПопытки;
906 |
907 | Если НЕ БазаБылаНайдена Тогда
908 | ТекстОшибки = "Информационная база не была найдена в кластере";
909 | Возврат Ложь;
910 | Иначе
911 | Возврат Истина;
912 | КонецЕсли;
913 |
914 | КонецФункции
915 |
916 | // *****************************************************************
917 | // Проверяет наличие блокировки регламентных заданий для серверной базы
918 | //
919 | Функция COM_ПолучитьБлокировкуРегламентныхЗаданий() Экспорт
920 |
921 | БазаБылаНайдена = Ложь;
922 | ТекстОшибки = "";
923 |
924 | // Проверим, не файловая ли база
925 | Если ПараметрыЗапуска.ТипБазы = "F" Тогда
926 | ТекстОшибки = "Недоступно для файловой базы";
927 | Возврат Неопределено;
928 | КонецЕсли;
929 |
930 | // Проверим ключевые параметры запуска
931 | Если НЕ ВсеПараметрыЗапускаЗаполненыКорректно() Тогда
932 | Возврат Неопределено;
933 | КонецЕсли;
934 |
935 | Попытка
936 |
937 | // Получаем COMConnector
938 | Коннектор = Новый COMОбъект("v" + ПараметрыЗапуска.ВерсияПлатформы + ".COMConnector");
939 | //Получаем Соединение с агентом сервера
940 | СоединениеСАгентомСервера = Коннектор.ConnectAgent(
941 | ПараметрыЗапуска.АдресКластера + ":" + ПараметрыЗапуска.ПортАгента);
942 |
943 | // Получаем список кластеров
944 | КластерыСерверов = СоединениеСАгентомСервера.GetClusters();
945 | Для Каждого КластерСерверов Из КластерыСерверов Цикл
946 |
947 | // Аутентификация администратора кластера серверов
948 | СоединениеСАгентомСервера.Authenticate(
949 | КластерСерверов,
950 | ПараметрыЗапуска.ИмяПользователяАдминистратораКластера,
951 | ПараметрыЗапуска.ПарольПользователяАдминистратораКластера);
952 |
953 | // Получаем все рабочие процессы
954 | РабочиеПроцессы = СоединениеСАгентомСервера.GetWorkingProcesses(КластерСерверов);
955 | Для Каждого РабочийПроцесс Из РабочиеПроцессы Цикл
956 |
957 | Попытка
958 | СоединениеСРабочимПроцессом = Коннектор.ConnectWorkingProcess(
959 | ПараметрыЗапуска.АдресКластера + ":" + СтрЗаменить(РабочийПроцесс.MainPort, Символы.НПП, ""));
960 | Исключение
961 | // Рабочего процесса может уже не быть.
962 | Продолжить;
963 | КонецПопытки;
964 |
965 | // Выполняем аутентификацию
966 | СоединениеСРабочимПроцессом.AddAuthentication(
967 | ПараметрыЗапуска.ИмяПользователя,
968 | ПараметрыЗапуска.ПарольПользователя);
969 |
970 | // Получаем информационные базы
971 | ИнформационныеБазы = СоединениеСРабочимПроцессом.GetInfoBases();
972 | Для Каждого ИнформационнаяБаза Из ИнформационныеБазы Цикл
973 |
974 | Если НРег(ИнформационнаяБаза.Name) = НРег(ПараметрыЗапуска.ИмяБазы) Тогда
975 |
976 | // Пометим, что база была найдена
977 | БазаБылаНайдена = Истина;
978 |
979 | // Блокируем регламентные задания
980 | Возврат ИнформационнаяБаза.ScheduledJobsDenied;
981 |
982 | КонецЕсли;
983 |
984 | КонецЦикла;
985 |
986 | КонецЦикла;
987 |
988 | КонецЦикла;
989 |
990 | Исключение
991 | ТекстОшибки = ОписаниеОшибки();
992 | Возврат Неопределено;
993 | КонецПопытки;
994 |
995 | Если НЕ БазаБылаНайдена Тогда
996 | ТекстОшибки = "Информационная база не была найдена в кластере";
997 | КонецЕсли;
998 |
999 | Возврат Неопределено;
1000 |
1001 | КонецФункции
1002 |
1003 | // *****************************************************************
1004 | // Удаляет информационную базу из кластера серверов
1005 | //
1006 | // Параметры:
1007 | // Режим - режим удаления информационной базы:
1008 | // 0 - при удалении информационной базы базу данных не удалять;
1009 | // 1 - при удалении информационной базы удалить базу данных;
1010 | // 2 - при удалении информационной базы очистить базу данных.
1011 | //
1012 | Функция COM_УдалитьИнформационнуюБазу(Режим=0) Экспорт
1013 |
1014 | БазаБылаНайдена = Ложь;
1015 | ТекстОшибки = "";
1016 |
1017 | // Проверим, не файловая ли база
1018 | Если ПараметрыЗапуска.ТипБазы = "F" Тогда
1019 | ТекстОшибки = "Недоступно для файловой базы";
1020 | Возврат Ложь;
1021 | КонецЕсли;
1022 |
1023 | // Проверим ключевые параметры запуска
1024 | Если НЕ ВсеПараметрыЗапускаЗаполненыКорректно() Тогда
1025 | Возврат Ложь;
1026 | КонецЕсли;
1027 |
1028 | // Проверим отсутствие сеансов пользователей
1029 | ТаблицаПользователи = ПолучитьСписокСеансов();
1030 | Если ТаблицаПользователи = Неопределено Или ТаблицаПользователи.Количество() > 0 Тогда
1031 | Возврат Ложь;
1032 | КонецЕсли;
1033 |
1034 | Попытка
1035 |
1036 | // Получаем COMConnector
1037 | Коннектор = Новый COMОбъект("v" + ПараметрыЗапуска.ВерсияПлатформы + ".COMConnector");
1038 | // Получаем Соединение с агентом сервера
1039 | СоединениеСАгентомСервера = Коннектор.ConnectAgent(
1040 | ПараметрыЗапуска.АдресКластера + ":" + ПараметрыЗапуска.ПортАгента);
1041 |
1042 | // Получаем список кластеров
1043 | КластерыСерверов = СоединениеСАгентомСервера.GetClusters();
1044 | Для Каждого КластерСерверов Из КластерыСерверов Цикл
1045 |
1046 | // Аутентификация администратора кластера серверов
1047 | СоединениеСАгентомСервера.Authenticate(
1048 | КластерСерверов,
1049 | ПараметрыЗапуска.ИмяПользователяАдминистратораКластера,
1050 | ПараметрыЗапуска.ПарольПользователяАдминистратораКластера);
1051 |
1052 | // Получаем все рабочие процессы
1053 | РабочиеПроцессы = СоединениеСАгентомСервера.GetWorkingProcesses(КластерСерверов);
1054 | Для Каждого РабочийПроцесс Из РабочиеПроцессы Цикл
1055 |
1056 | // Создаем соединение с рабочим процессом
1057 | СоединениеСРабочимПроцессом = Коннектор.ConnectWorkingProcess(
1058 | ПараметрыЗапуска.АдресКластера + ":" + СтрЗаменить(РабочийПроцесс.MainPort, Символы.НПП, ""));
1059 |
1060 | // Выполняем аутентификацию
1061 | СоединениеСРабочимПроцессом.AddAuthentication(
1062 | ПараметрыЗапуска.ИмяПользователя,
1063 | ПараметрыЗапуска.ПарольПользователя);
1064 |
1065 | // Получаем информационные базы
1066 | ИнформационныеБазы = СоединениеСРабочимПроцессом.GetInfoBases();
1067 | Для Каждого ИнформационнаяБаза Из ИнформационныеБазы Цикл
1068 |
1069 | Если НРег(ИнформационнаяБаза.Name) = НРег(ПараметрыЗапуска.ИмяБазы) Тогда
1070 |
1071 | // Пометим, что база была найдена
1072 | БазаБылаНайдена = Истина;
1073 |
1074 | СоединениеСРабочимПроцессом.DropInfoBase(ИнформационнаяБаза, Режим);
1075 | Прервать;
1076 |
1077 | КонецЕсли;
1078 |
1079 | КонецЦикла;
1080 |
1081 | КонецЦикла;
1082 |
1083 | КонецЦикла;
1084 |
1085 | Исключение
1086 | ТекстОшибки = ОписаниеОшибки();
1087 | Возврат Ложь;
1088 | КонецПопытки;
1089 |
1090 | Если НЕ БазаБылаНайдена Тогда
1091 | ТекстОшибки = "Информационная база не была найдена в кластере";
1092 | Возврат Ложь;
1093 | Иначе
1094 | Возврат Истина;
1095 | КонецЕсли;
1096 |
1097 | КонецФункции
1098 |
1099 | #КонецОбласти
1100 |
1101 | #Область СерверАдминистрирования
1102 |
1103 | // *****************************************************************
1104 | Функция СА_ПолучитьПутьКRAC()
1105 |
1106 | ТекстОшибки = "";
1107 |
1108 | Если НРег(Прав(ПараметрыЗапуска.ПутьКПлатформе1С, 8)) = "1cv8.exe" Тогда
1109 | ПутьКRAC = СтрЗаменить(ПараметрыЗапуска.ПутьКПлатформе1С, "1cv8.exe", "rac.exe");
1110 | Иначе
1111 | ПутьКRAC = ОбъединитьПути(ПараметрыЗапуска.ПутьКПлатформе1С, "rac.exe");
1112 | КонецЕсли;
1113 |
1114 | Файл = Новый Файл(ПутьКRAC);
1115 | Если Не Файл.Существует() Тогда
1116 | ТекстОшибки = "Не найдена утилита: " + ПутьКRAC;
1117 | Возврат Неопределено;
1118 | КонецЕсли;
1119 |
1120 | Возврат ПутьКRAC;
1121 |
1122 | КонецФункции
1123 |
1124 | // *****************************************************************
1125 | Функция СА_ПолучитьСписокКластеров()
1126 |
1127 | // Проверим ключевые параметры запуска
1128 | Если НЕ ВсеПараметрыЗапускаЗаполненыКорректно() Тогда
1129 | Возврат Неопределено;
1130 | КонецЕсли;
1131 |
1132 | ПутьКRAC = СА_ПолучитьПутьКRAC();
1133 | Если ПутьКRAC = Неопределено Тогда
1134 | Возврат Неопределено;
1135 | КонецЕсли;
1136 |
1137 | Если РежимОтладки Тогда
1138 | Сообщить("Получаем список кластеров:");
1139 | КонецЕсли;
1140 |
1141 | // Получим список кластеров
1142 | МассивКластеров = Новый Массив;
1143 |
1144 | Команда = Новый Команда;
1145 | Команда.УстановитьКоманду("""" + ПутьКRAC + """");
1146 | Команда.ДобавитьПараметр("""" + ПараметрыЗапуска.АдресСервераАдминистрирования + """");
1147 | Команда.ДобавитьПараметр("cluster list");
1148 |
1149 | Для Сч = 1 По ПараметрыЗапуска.КоличествоПопытокПодключенияККластеру Цикл
1150 |
1151 | КодВозврата = Команда.Исполнить();
1152 | Вывод = Команда.ПолучитьВывод();
1153 |
1154 | Если КодВозврата = 0 Тогда
1155 |
1156 | ТекКластер = "";
1157 | ТекХост = "";
1158 | ТекПорт = "";
1159 | Для Каждого ТекСтрока Из СтрРазделить(Вывод, Символы.ПС) Цикл
1160 |
1161 | ТекПараметры = СтрРазделить(ТекСтрока, ":");
1162 | Если ТекПараметры.Количество() = 2 Тогда
1163 |
1164 | Если СокрЛП(ТекПараметры.Получить(0)) = "cluster" Тогда
1165 | ТекКластер = СокрЛП(ТекПараметры.Получить(1));
1166 | ИначеЕсли СокрЛП(ТекПараметры.Получить(0)) = "host" Тогда
1167 | ТекХост = СокрЛП(ТекПараметры.Получить(1));
1168 | ИначеЕсли СокрЛП(ТекПараметры.Получить(0)) = "port" Тогда
1169 | ТекПорт = СокрЛП(ТекПараметры.Получить(1));
1170 | Иначе
1171 | Продолжить;
1172 | КонецЕсли;
1173 |
1174 | Если НРег(ТекХост) = НРег(ПараметрыЗапуска.АдресКластера)
1175 | И НРег(ТекПорт) = НРег(ПараметрыЗапуска.ПортКластера) Тогда
1176 |
1177 | МассивКластеров.Добавить(ТекКластер);
1178 | Если РежимОтладки Тогда
1179 | Сообщить(" Найден класер: " + ТекКластер + ", хост: " + ТекХост + ", порт: " + ТекПорт);
1180 | КонецЕсли;
1181 |
1182 | ТекКластер = "";
1183 | ТекХост = "";
1184 | ТекПорт = "";
1185 |
1186 | КонецЕсли;
1187 | КонецЕсли;
1188 |
1189 | КонецЦикла;
1190 | Прервать;
1191 |
1192 | ИначеЕсли Сч = ПараметрыЗапуска.КоличествоПопытокПодключенияККластеру Тогда
1193 | ТекстОшибки = "Ошибка получения списка кластеров, код возврата = " + КодВозврата + Символы.ПС + Вывод;
1194 | Возврат Неопределено;
1195 | Иначе
1196 | // Подождем и сделаем еще одну попытку
1197 | Приостановить(1000 * 20 * Сч);
1198 | КонецЕсли;
1199 |
1200 | КонецЦикла;
1201 |
1202 | Возврат МассивКластеров;
1203 |
1204 | КонецФункции
1205 |
1206 | // *****************************************************************
1207 | Функция СА_ПолучитьИДБазыПоИмени()
1208 |
1209 | МассивКластеров = СА_ПолучитьСписокКластеров();
1210 | Если МассивКластеров = Неопределено Тогда
1211 | Возврат Неопределено;
1212 | КонецЕсли;
1213 |
1214 | ПутьКRAC = СА_ПолучитьПутьКRAC();
1215 | Если ПутьКRAC = Неопределено Тогда
1216 | Возврат Неопределено;
1217 | КонецЕсли;
1218 |
1219 | // Получим ИД информационной базы на кластере
1220 | ТекИД = "";
1221 | Для Каждого ТекКластер Из МассивКластеров Цикл
1222 | Команда = Новый Команда;
1223 | Команда.УстановитьКоманду("""" + ПутьКRAC + """");
1224 | Команда.ДобавитьПараметр("""" + ПараметрыЗапуска.АдресСервераАдминистрирования + """");
1225 | Команда.ДобавитьПараметр("infobase");
1226 | Команда.ДобавитьПараметр("--cluster=" + ТекКластер);
1227 | Команда.ДобавитьПараметр("summary list");
1228 | КодВозврата = Команда.Исполнить();
1229 | Вывод = Команда.ПолучитьВывод();
1230 | Если КодВозврата = 0 Тогда
1231 | ТекИД = "";
1232 | ТекИмя = "";
1233 | Для Каждого ТекСтрока Из СтрРазделить(Вывод, Символы.ПС) Цикл
1234 | ТекПараметры = СтрРазделить(ТекСтрока, ":");
1235 | Если ТекПараметры.Количество() = 2 Тогда
1236 |
1237 | Если СокрЛП(ТекПараметры.Получить(0)) = "infobase" Тогда
1238 | ТекИД = СокрЛП(ТекПараметры.Получить(1));
1239 | ИначеЕсли СокрЛП(ТекПараметры.Получить(0)) = "name" Тогда
1240 | ТекИмя = СокрЛП(ТекПараметры.Получить(1));
1241 | Иначе
1242 | Продолжить;
1243 | КонецЕсли;
1244 |
1245 | Если НРег(ТекИмя) = НРег(ПараметрыЗапуска.ИмяБазы) Тогда
1246 | Возврат ТекИД;
1247 | КонецЕсли;
1248 |
1249 | КонецЕсли;
1250 | КонецЦикла;
1251 | Иначе
1252 | ТекстОшибки = "Ошибка получения списка информационных баз, код возврата = " + КодВозврата + Символы.ПС + Вывод;
1253 | Возврат Неопределено;
1254 | КонецЕсли;
1255 | КонецЦикла;
1256 |
1257 | Возврат ТекИД;
1258 |
1259 | КонецФункции
1260 |
1261 | // *****************************************************************
1262 | Функция СА_ПолучитьСписокСоединений()
1263 |
1264 | ПутьКRAC = СА_ПолучитьПутьКRAC();
1265 | Если ПутьКRAC = Неопределено Тогда
1266 | Возврат Неопределено;
1267 | КонецЕсли;
1268 |
1269 | МассивКластеров = СА_ПолучитьСписокКластеров();
1270 | Если МассивКластеров = Неопределено Тогда
1271 | Возврат Неопределено;
1272 | КонецЕсли;
1273 |
1274 | ИДБазы = СА_ПолучитьИДБазыПоИмени();
1275 | Если ИДБазы = "" Или ИДБазы = Неопределено Тогда
1276 | Возврат Неопределено;
1277 | КонецЕсли;
1278 |
1279 | Если РежимОтладки Тогда
1280 | Сообщить("Получаем список соединений:")
1281 | КонецЕсли;
1282 |
1283 | // Получим список соединенией
1284 | ТаблицаСоединений = Новый ТаблицаЗначений;
1285 | ТаблицаСоединений.Колонки.Добавить("Процесс");
1286 | ТаблицаСоединений.Колонки.Добавить("Соединение");
1287 | ТаблицаСоединений.Колонки.Добавить("Кластер");
1288 | ТаблицаСоединений.Колонки.Добавить("База");
1289 | ТаблицаСоединений.Колонки.Добавить("Приложение");
1290 | Для Каждого ТекКластер Из МассивКластеров Цикл
1291 | Команда = Новый Команда;
1292 | Команда.УстановитьКоманду("""" + ПутьКRAC + """");
1293 | Команда.ДобавитьПараметр("""" + ПараметрыЗапуска.АдресСервераАдминистрирования + """");
1294 | Команда.ДобавитьПараметр("connection");
1295 | Команда.ДобавитьПараметр("--cluster=" + ТекКластер);
1296 | Если ЗначениеЗаполнено(ПараметрыЗапуска.ИмяПользователяАдминистратораКластера) Тогда
1297 | Команда.ДобавитьПараметр("--cluster-user=" + """" + ПараметрыЗапуска.ИмяПользователяАдминистратораКластера + """");
1298 | КонецЕсли;
1299 | Если ЗначениеЗаполнено(ПараметрыЗапуска.ПарольПользователяАдминистратораКластера) Тогда
1300 | Команда.ДобавитьПараметр("--cluster-pwd=" + """" + ПараметрыЗапуска.ПарольПользователяАдминистратораКластера + """");
1301 | КонецЕсли;
1302 | Команда.ДобавитьПараметр("list");
1303 | Команда.ДобавитьПараметр("--infobase=" + ИДБазы);
1304 | Команда.ДобавитьПараметр("--infobase-user=" + ПараметрыЗапуска.ИмяПользователя);
1305 | Команда.ДобавитьПараметр("--infobase-pwd=" + ПараметрыЗапуска.ПарольПользователя);
1306 | КодВозврата = Команда.Исполнить();
1307 | Вывод = Команда.ПолучитьВывод();
1308 | Если КодВозврата = 0 Тогда
1309 |
1310 | Для Каждого ТекСтрока Из СтрРазделить(Вывод, Символы.ПС) Цикл
1311 |
1312 | ТекПараметры = СтрРазделить(ТекСтрока, ":");
1313 | Если ТекПараметры.Количество() = 2 Тогда
1314 |
1315 | Если СокрЛП(ТекПараметры.Получить(0)) = "connection" Тогда
1316 | НСтрока = ТаблицаСоединений.Добавить();
1317 | НСтрока.Соединение = СокрЛП(ТекПараметры.Получить(1));
1318 | НСтрока.Кластер = ТекКластер;
1319 | ИначеЕсли СокрЛП(ТекПараметры.Получить(0)) = "process" Тогда
1320 | НСтрока.Процесс = СокрЛП(ТекПараметры.Получить(1));
1321 | ИначеЕсли СокрЛП(ТекПараметры.Получить(0)) = "infobase" Тогда
1322 | НСтрока.База = СокрЛП(ТекПараметры.Получить(1));
1323 | ИначеЕсли СокрЛП(ТекПараметры.Получить(0)) = "application" Тогда
1324 | НСтрока.Приложение = СокрЛП(ТекПараметры.Получить(1));
1325 | Иначе
1326 | Продолжить;
1327 | КонецЕсли;
1328 |
1329 | КонецЕсли;
1330 | КонецЦикла;
1331 |
1332 | Иначе
1333 | ТекстОшибки = "Ошибка получения списка соединений, код возврата = " + КодВозврата + Символы.ПС + Вывод;
1334 | Возврат Неопределено;
1335 | КонецЕсли;
1336 | КонецЦикла;
1337 |
1338 | Если РежимОтладки Тогда
1339 | Для Каждого СтрокаТаблицы Из ТаблицаСоединений Цикл
1340 | Сообщить(" Найдено соединение: " + СтрокаТаблицы.Соединение + ", кластер: " + СтрокаТаблицы.Кластер + ", процесс: " + СтрокаТаблицы.Процесс + ", база: " + СтрокаТаблицы.База + ", приложение: " + СтрокаТаблицы.Приложение);
1341 | КонецЦикла;
1342 | КонецЕсли;
1343 |
1344 | Возврат ТаблицаСоединений;
1345 |
1346 | КонецФункции
1347 |
1348 | // *****************************************************************
1349 | Функция СА_РазорватьСоединения()
1350 |
1351 | ПутьКRAC = СА_ПолучитьПутьКRAC();
1352 | Если ПутьКRAC = Неопределено Тогда
1353 | Возврат Ложь;
1354 | КонецЕсли;
1355 |
1356 | // Получим соединения
1357 | ТаблицаСоединений = СА_ПолучитьСписокСоединений();
1358 | Если ТаблицаСоединений = Неопределено Тогда
1359 | Возврат Ложь;
1360 | КонецЕсли;
1361 |
1362 | Если РежимОтладки Тогда
1363 | Сообщить("Разорвать соединения:")
1364 | КонецЕсли;
1365 |
1366 | ДопустимоеЧислоПопыток = 5;
1367 | СчетчикПопыток = 0;
1368 | Пока ТаблицаСоединений.Количество() > 0 Цикл
1369 |
1370 | Соединение = ТаблицаСоединений.Получить(0);
1371 |
1372 | Команда = Новый Команда;
1373 | Команда.УстановитьКоманду("""" + ПутьКRAC + """");
1374 | Команда.ДобавитьПараметр("""" + ПараметрыЗапуска.АдресСервераАдминистрирования + """");
1375 | Команда.ДобавитьПараметр("connection");
1376 | Команда.ДобавитьПараметр("--cluster=" + Соединение.Кластер);
1377 | Если ЗначениеЗаполнено(ПараметрыЗапуска.ИмяПользователяАдминистратораКластера) Тогда
1378 | Команда.ДобавитьПараметр("--cluster-user=" + """" + ПараметрыЗапуска.ИмяПользователяАдминистратораКластера + """");
1379 | КонецЕсли;
1380 | Если ЗначениеЗаполнено(ПараметрыЗапуска.ПарольПользователяАдминистратораКластера) Тогда
1381 | Команда.ДобавитьПараметр("--cluster-pwd=" + """" + ПараметрыЗапуска.ПарольПользователяАдминистратораКластера + """");
1382 | КонецЕсли;
1383 | Команда.ДобавитьПараметр("disconnect");
1384 | Команда.ДобавитьПараметр("--process=" + Соединение.Процесс);
1385 | Команда.ДобавитьПараметр("--connection=" + Соединение.Соединение);
1386 | Команда.ДобавитьПараметр("--infobase-user=" + ПараметрыЗапуска.ИмяПользователя);
1387 | Команда.ДобавитьПараметр("--infobase-pwd=" + ПараметрыЗапуска.ПарольПользователя);
1388 | КодВозврата = Команда.Исполнить();
1389 | Вывод = Команда.ПолучитьВывод();
1390 | Если КодВозврата <> 0 Тогда
1391 | Если СокрЛП(Вывод) = "Служебное соединение не может быть удалено" Тогда
1392 | Если РежимОтладки Тогда
1393 | Сообщить(" Служебное соединение: " + Соединение.Соединение + " не может быть удалено!");
1394 | КонецЕсли;
1395 | ТаблицаСоединений.Удалить(Соединение);
1396 | Продолжить;
1397 | Иначе
1398 | Если СчетчикПопыток = ДопустимоеЧислоПопыток Тогда
1399 | ТекстОшибки = "Ошибка разрыва соединений, код возврата = " + КодВозврата + Символы.ПС + Вывод;
1400 | Возврат Ложь;
1401 | Иначе
1402 | СчетчикПопыток = СчетчикПопыток + 1;
1403 | Если РежимОтладки Тогда
1404 | Сообщить(" Соединение: " + Соединение.Соединение + " завершить не удалось!" + Символы.ПС + Вывод);
1405 | КонецЕсли;
1406 | КонецЕсли;
1407 | КонецЕсли;
1408 | Иначе
1409 | Если РежимОтладки Тогда
1410 | Сообщить(" Соединение: " + Соединение.Соединение + " завершено!");
1411 | КонецЕсли;
1412 | КонецЕсли;
1413 |
1414 | // Получим соединения снова, т. к. могли появиться новые соединения или отвалиться старые
1415 | ТаблицаСоединений = СА_ПолучитьСписокСоединений();
1416 | Если ТаблицаСоединений = Неопределено Тогда
1417 | Возврат Ложь;
1418 | КонецЕсли;
1419 |
1420 | КонецЦикла;
1421 |
1422 | Если РежимОтладки Тогда
1423 | Сообщить(" УСПЕШНО");
1424 | КонецЕсли;
1425 |
1426 | Возврат Истина;
1427 |
1428 | КонецФункции
1429 |
1430 | // *****************************************************************
1431 | Функция СА_ПолучитьСписокСеансов() Экспорт
1432 |
1433 | Если РежимОтладки Тогда
1434 | Сообщить("Получаем список сеансов:")
1435 | КонецЕсли;
1436 |
1437 | ПутьКRAC = СА_ПолучитьПутьКRAC();
1438 | Если ПутьКRAC = Неопределено Тогда
1439 | Возврат Неопределено;
1440 | КонецЕсли;
1441 |
1442 | МассивКластеров = СА_ПолучитьСписокКластеров();
1443 | Если МассивКластеров = Неопределено Тогда
1444 | Возврат Неопределено;
1445 | КонецЕсли;
1446 |
1447 | ИДБазы = СА_ПолучитьИДБазыПоИмени();
1448 | Если ИДБазы = "" Или ИДБазы = Неопределено Тогда
1449 | Возврат Неопределено;
1450 | КонецЕсли;
1451 |
1452 | // Получим список соединенией
1453 | ТаблицаСеансов = Новый ТаблицаЗначений;
1454 | ТаблицаСеансов.Колонки.Добавить("Кластер");
1455 | ТаблицаСеансов.Колонки.Добавить("Процесс");
1456 | ТаблицаСеансов.Колонки.Добавить("Сеанс");
1457 | ТаблицаСеансов.Колонки.Добавить("Соединение");
1458 | ТаблицаСеансов.Колонки.Добавить("НомерСоединения");
1459 | ТаблицаСеансов.Колонки.Добавить("ВремяНачала");
1460 | ТаблицаСеансов.Колонки.Добавить("База");
1461 | ТаблицаСеансов.Колонки.Добавить("ИмяПользователя");
1462 | ТаблицаСеансов.Колонки.Добавить("ИмяКомпьютера");
1463 | ТаблицаСеансов.Колонки.Добавить("Приложение");
1464 |
1465 | Для Каждого ТекКластер Из МассивКластеров Цикл
1466 | Команда = Новый Команда;
1467 | Команда.УстановитьКоманду("""" + ПутьКRAC + """");
1468 | Команда.ДобавитьПараметр("""" + ПараметрыЗапуска.АдресСервераАдминистрирования + """");
1469 | Команда.ДобавитьПараметр("session");
1470 | Команда.ДобавитьПараметр("--cluster=" + ТекКластер);
1471 | Если ЗначениеЗаполнено(ПараметрыЗапуска.ИмяПользователяАдминистратораКластера) Тогда
1472 | Команда.ДобавитьПараметр("--cluster-user=" + """" + ПараметрыЗапуска.ИмяПользователяАдминистратораКластера + """");
1473 | КонецЕсли;
1474 | Если ЗначениеЗаполнено(ПараметрыЗапуска.ПарольПользователяАдминистратораКластера) Тогда
1475 | Команда.ДобавитьПараметр("--cluster-pwd=" + """" + ПараметрыЗапуска.ПарольПользователяАдминистратораКластера + """");
1476 | КонецЕсли;
1477 | Команда.ДобавитьПараметр("list");
1478 | Команда.ДобавитьПараметр("--infobase=" + ИДБазы);
1479 | КодВозврата = Команда.Исполнить();
1480 | Вывод = Команда.ПолучитьВывод();
1481 | Если КодВозврата = 0 Тогда
1482 | ТекСоединение = "";
1483 | ТекПроцесс = "";
1484 | Для Каждого ТекСтрока Из СтрРазделить(Вывод, Символы.ПС) Цикл
1485 | ТекПараметры = СтрРазделить(ТекСтрока, ":");
1486 | Если ТекПараметры.Количество() = 2 Тогда
1487 |
1488 | Если СокрЛП(ТекПараметры.Получить(0)) = "session" Тогда
1489 | НСтрока = ТаблицаСеансов.Добавить();
1490 | НСтрока.Сеанс = СокрЛП(ТекПараметры.Получить(1));
1491 | НСтрока.Кластер = ТекКластер;
1492 | ИначеЕсли СокрЛП(ТекПараметры.Получить(0)) = "process" Тогда
1493 | НСтрока.Процесс = СокрЛП(ТекПараметры.Получить(1));
1494 | ИначеЕсли СокрЛП(ТекПараметры.Получить(0)) = "connection" Тогда
1495 | НСтрока.Соединение = СокрЛП(ТекПараметры.Получить(1));
1496 | ИначеЕсли СокрЛП(ТекПараметры.Получить(0)) = "infobase" Тогда
1497 | НСтрока.База = СокрЛП(ТекПараметры.Получить(1));
1498 | ИначеЕсли СокрЛП(ТекПараметры.Получить(0)) = "user-name" Тогда
1499 | НСтрока.ИмяПользователя = СокрЛП(ТекПараметры.Получить(1));
1500 | ИначеЕсли СокрЛП(ТекПараметры.Получить(0)) = "host" Тогда
1501 | НСтрока.ИмяКомпьютера = СокрЛП(ТекПараметры.Получить(1));
1502 | ИначеЕсли СокрЛП(ТекПараметры.Получить(0)) = "session-id" Тогда
1503 | НСтрока.НомерСоединения = СокрЛП(ТекПараметры.Получить(1));
1504 | ИначеЕсли СокрЛП(ТекПараметры.Получить(0)) = "started-at" Тогда
1505 | НСтрока.ВремяНачала = СокрЛП(ТекПараметры.Получить(1));
1506 | ИначеЕсли СокрЛП(ТекПараметры.Получить(0)) = "app-id" Тогда
1507 | НСтрока.Приложение = СокрЛП(ТекПараметры.Получить(1));
1508 | Иначе
1509 | Продолжить;
1510 | КонецЕсли;
1511 |
1512 | КонецЕсли;
1513 | КонецЦикла;
1514 |
1515 | Иначе
1516 | ТекстОшибки = "Ошибка получения списка сеансов, код возврата = " + КодВозврата + Символы.ПС + Вывод;
1517 | Возврат Неопределено;
1518 | КонецЕсли;
1519 | КонецЦикла;
1520 |
1521 | Если РежимОтладки Тогда
1522 | Для Каждого СтрокаТаблицы Из ТаблицаСеансов Цикл
1523 | Сообщить(" Получен сеанс: " + СтрокаТаблицы.Сеанс + ", кластер: " + СтрокаТаблицы.Кластер + ", процесс: " + СтрокаТаблицы.Процесс + ", соединение: " + СтрокаТаблицы.Соединение
1524 | + ", база: " + СтрокаТаблицы.База + ", имя пользователя: " + СтрокаТаблицы.ИмяПользователя + ", имя компьютера: " + СтрокаТаблицы.ИмяКомпьютера
1525 | + ", номер соединения: " + СтрокаТаблицы.НомерСоединения + ", время начала: " + СтрокаТаблицы.ВремяНачала + ", приложение: " + СтрокаТаблицы.Приложение);
1526 | КонецЦикла;
1527 | КонецЕсли;
1528 |
1529 | Возврат ТаблицаСеансов;
1530 |
1531 | КонецФункции
1532 |
1533 | // *****************************************************************
1534 | Функция СА_ЗавершитьСеансы() Экспорт
1535 |
1536 | ПутьКRAC = СА_ПолучитьПутьКRAC();
1537 | Если ПутьКRAC = Неопределено Тогда
1538 | Возврат Ложь;
1539 | КонецЕсли;
1540 |
1541 | // Получим сеансы
1542 | ТаблицаСеансов = СА_ПолучитьСписокСеансов();
1543 | Если ТаблицаСеансов = Неопределено Тогда
1544 | Возврат Ложь;
1545 | КонецЕсли;
1546 |
1547 | Если РежимОтладки Тогда
1548 | Сообщить("Завершаем сеансы:")
1549 | КонецЕсли;
1550 |
1551 | ДопустимоеЧислоПопыток = 5;
1552 | СчетчикПопыток = 0;
1553 | Пока ТаблицаСеансов.Количество() > 0 Цикл
1554 |
1555 | Сеанс = ТаблицаСеансов.Получить(0);
1556 |
1557 | Команда = Новый Команда;
1558 | Команда.УстановитьКоманду("""" + ПутьКRAC + """");
1559 | Команда.ДобавитьПараметр("""" + ПараметрыЗапуска.АдресСервераАдминистрирования + """");
1560 | Команда.ДобавитьПараметр("session");
1561 | Команда.ДобавитьПараметр("--cluster=" + Сеанс.Кластер);
1562 | Если ЗначениеЗаполнено(ПараметрыЗапуска.ИмяПользователяАдминистратораКластера) Тогда
1563 | Команда.ДобавитьПараметр("--cluster-user=" + """" + ПараметрыЗапуска.ИмяПользователяАдминистратораКластера + """");
1564 | КонецЕсли;
1565 | Если ЗначениеЗаполнено(ПараметрыЗапуска.ПарольПользователяАдминистратораКластера) Тогда
1566 | Команда.ДобавитьПараметр("--cluster-pwd=" + """" + ПараметрыЗапуска.ПарольПользователяАдминистратораКластера + """");
1567 | КонецЕсли;
1568 | Команда.ДобавитьПараметр("terminate");
1569 | Команда.ДобавитьПараметр("--session=" + Сеанс.Сеанс);
1570 | КодВозврата = Команда.Исполнить();
1571 | Вывод = Команда.ПолучитьВывод();
1572 | Если КодВозврата <> 0 Тогда
1573 | // Сеанс уже может не существовать на сервере
1574 | // или его не удается завершить с первого раза
1575 | Если СчетчикПопыток = ДопустимоеЧислоПопыток Тогда
1576 | ТекстОшибки = "Ошибка завершения сеансов, код возврата = " + КодВозврата + Символы.ПС + Вывод;
1577 | Возврат Ложь;
1578 | Иначе
1579 | СчетчикПопыток = СчетчикПопыток + 1;
1580 | Если РежимОтладки Тогда
1581 | Сообщить(" Сеанс: " + Сеанс.Сеанс + " завершить не удалось!" + Символы.ПС + Вывод);
1582 | КонецЕсли;
1583 | КонецЕсли;
1584 | Иначе
1585 | Если РежимОтладки Тогда
1586 | Сообщить(" Сеанс: " + Сеанс.Сеанс + " завершен!");
1587 | КонецЕсли;
1588 | КонецЕсли;
1589 |
1590 | // Получим сеансы снова, т. к. могли появиться новые сеансы или отвалиться старые
1591 | ТаблицаСеансов = СА_ПолучитьСписокСеансов();
1592 | Если ТаблицаСеансов = Неопределено Тогда
1593 | Возврат Ложь;
1594 | КонецЕсли;
1595 |
1596 | КонецЦикла;
1597 |
1598 | Если РежимОтладки Тогда
1599 | Сообщить(" УСПЕШНО")
1600 | КонецЕсли;
1601 |
1602 | Возврат Истина;
1603 |
1604 | КонецФункции
1605 |
1606 | // *****************************************************************
1607 | Функция СА_ИзменитьБлокировкуНачалаСеансов(Флаг = Истина, МинутОжиданияЗавершенияСеансов = 0) Экспорт
1608 |
1609 | ПутьКRAC = СА_ПолучитьПутьКRAC();
1610 | Если ПутьКRAC = Неопределено Тогда
1611 | Возврат Ложь;
1612 | КонецЕсли;
1613 |
1614 | МассивКластеров = СА_ПолучитьСписокКластеров();
1615 | Если МассивКластеров = Неопределено Тогда
1616 | Возврат Ложь;
1617 | КонецЕсли;
1618 |
1619 | ИДБазы = СА_ПолучитьИДБазыПоИмени();
1620 | Если ИДБазы = "" Или ИДБазы = Неопределено Тогда
1621 | Возврат Ложь;
1622 | КонецЕсли;
1623 |
1624 | Для Каждого ТекКластер Из МассивКластеров Цикл
1625 | Команда = Новый Команда;
1626 | Команда.УстановитьКоманду("""" + ПутьКRAC + """");
1627 | Команда.ДобавитьПараметр("""" + ПараметрыЗапуска.АдресСервераАдминистрирования + """");
1628 | Команда.ДобавитьПараметр("infobase");
1629 | Команда.ДобавитьПараметр("--cluster=" + ТекКластер);
1630 | Если ЗначениеЗаполнено(ПараметрыЗапуска.ИмяПользователяАдминистратораКластера) Тогда
1631 | Команда.ДобавитьПараметр("--cluster-user=" + """" + ПараметрыЗапуска.ИмяПользователяАдминистратораКластера + """");
1632 | КонецЕсли;
1633 | Если ЗначениеЗаполнено(ПараметрыЗапуска.ПарольПользователяАдминистратораКластера) Тогда
1634 | Команда.ДобавитьПараметр("--cluster-pwd=" + """" + ПараметрыЗапуска.ПарольПользователяАдминистратораКластера + """");
1635 | КонецЕсли;
1636 | Команда.ДобавитьПараметр("update");
1637 | Команда.ДобавитьПараметр("--infobase=" + ИДБазы);
1638 | Команда.ДобавитьПараметр("--infobase-user=" + ПараметрыЗапуска.ИмяПользователя);
1639 | Команда.ДобавитьПараметр("--infobase-pwd=" + ПараметрыЗапуска.ПарольПользователя);
1640 | Если Флаг = Истина Тогда
1641 | СтрокаДата = Формат(ТекущаяДата() + 60 * МинутОжиданияЗавершенияСеансов, "ДФ='yyyy-MM-ddTHH:mm:ss'");
1642 | Команда.ДобавитьПараметр("--denied-from=" + """" + СтрокаДата + """");
1643 | Команда.ДобавитьПараметр("--denied-message=" + """" + ПараметрыЗапуска.СообщениеПриБлокировке + """");
1644 | Команда.ДобавитьПараметр("--permission-code=" + ПараметрыЗапуска.КодРазрешения);
1645 | Команда.ДобавитьПараметр("--sessions-deny=" + "on");
1646 | Иначе
1647 | Команда.ДобавитьПараметр("--denied-from=" + """0001-01-01""");
1648 | Команда.ДобавитьПараметр("--sessions-deny=" + "off");
1649 | КонецЕсли;
1650 | КодВозврата = Команда.Исполнить();
1651 | Вывод = Команда.ПолучитьВывод();
1652 | Если КодВозврата <> 0 Тогда
1653 | ТекстОшибки = "Ошибка " + ?(Флаг, "установки", "снятия") + " блокировки начала сеансов, код возврата = " + КодВозврата + Символы.ПС + Вывод;
1654 | Возврат Ложь;
1655 | КонецЕсли;
1656 | КонецЦикла;
1657 |
1658 | Возврат Истина;
1659 |
1660 | КонецФункции
1661 |
1662 | // *****************************************************************
1663 | Функция СА_ИзменитьБлокировкуРегламентныхЗаданий(Флаг = Истина) Экспорт
1664 |
1665 | ПутьКRAC = СА_ПолучитьПутьКRAC();
1666 | Если ПутьКRAC = Неопределено Тогда
1667 | Возврат Ложь;
1668 | КонецЕсли;
1669 |
1670 | МассивКластеров = СА_ПолучитьСписокКластеров();
1671 | Если МассивКластеров = Неопределено Тогда
1672 | Возврат Ложь;
1673 | КонецЕсли;
1674 |
1675 | ИДБазы = СА_ПолучитьИДБазыПоИмени();
1676 | Если ИДБазы = "" Или ИДБазы = Неопределено Тогда
1677 | Возврат Ложь;
1678 | КонецЕсли;
1679 |
1680 | Для Каждого ТекКластер Из МассивКластеров Цикл
1681 | Команда = Новый Команда;
1682 | Команда.УстановитьКоманду("""" + ПутьКRAC + """");
1683 | Команда.ДобавитьПараметр("""" + ПараметрыЗапуска.АдресСервераАдминистрирования + """");
1684 | Команда.ДобавитьПараметр("infobase");
1685 | Команда.ДобавитьПараметр("--cluster=" + ТекКластер);
1686 | Если ЗначениеЗаполнено(ПараметрыЗапуска.ИмяПользователяАдминистратораКластера) Тогда
1687 | Команда.ДобавитьПараметр("--cluster-user=" + """" + ПараметрыЗапуска.ИмяПользователяАдминистратораКластера + """");
1688 | КонецЕсли;
1689 | Если ЗначениеЗаполнено(ПараметрыЗапуска.ПарольПользователяАдминистратораКластера) Тогда
1690 | Команда.ДобавитьПараметр("--cluster-pwd=" + """" + ПараметрыЗапуска.ПарольПользователяАдминистратораКластера + """");
1691 | КонецЕсли;
1692 | Команда.ДобавитьПараметр("update");
1693 | Команда.ДобавитьПараметр("--infobase=" + ИДБазы);
1694 | Команда.ДобавитьПараметр("--infobase-user=" + ПараметрыЗапуска.ИмяПользователя);
1695 | Команда.ДобавитьПараметр("--infobase-pwd=" + ПараметрыЗапуска.ПарольПользователя);
1696 | Команда.ДобавитьПараметр("--scheduled-jobs-deny=" + ?(Флаг, "on", "off"));
1697 | КодВозврата = Команда.Исполнить();
1698 | Вывод = Команда.ПолучитьВывод();
1699 | Если КодВозврата <> 0 Тогда
1700 | ТекстОшибки = "Ошибка " + ?(Флаг, "установки", "снятия") + " блокировки начала сеансов, код возврата = " + КодВозврата + Символы.ПС + Вывод;
1701 | Возврат Ложь;
1702 | КонецЕсли;
1703 | КонецЦикла;
1704 |
1705 | Возврат Истина;
1706 |
1707 | КонецФункции
1708 |
1709 | // *****************************************************************
1710 | Функция СА_ПолучитьДанныеИнформационнойБазы() Экспорт
1711 |
1712 | ПутьКRAC = СА_ПолучитьПутьКRAC();
1713 | Если ПутьКRAC = Неопределено Тогда
1714 | Возврат Неопределено;
1715 | КонецЕсли;
1716 |
1717 | МассивКластеров = СА_ПолучитьСписокКластеров();
1718 | Если МассивКластеров = Неопределено Тогда
1719 | Возврат Неопределено;
1720 | КонецЕсли;
1721 |
1722 | ИДБазы = СА_ПолучитьИДБазыПоИмени();
1723 | Если ИДБазы = "" Или ИДБазы = Неопределено Тогда
1724 | Возврат Неопределено;
1725 | КонецЕсли;
1726 |
1727 | ДанныеИнформационнойБазы = Новый Структура;
1728 |
1729 | Для Каждого ТекКластер Из МассивКластеров Цикл
1730 | Команда = Новый Команда;
1731 | Команда.УстановитьКоманду("""" + ПутьКRAC + """");
1732 | Команда.ДобавитьПараметр("""" + ПараметрыЗапуска.АдресСервераАдминистрирования + """");
1733 | Команда.ДобавитьПараметр("infobase");
1734 | Команда.ДобавитьПараметр("--cluster=" + ТекКластер);
1735 | Если ЗначениеЗаполнено(ПараметрыЗапуска.ИмяПользователяАдминистратораКластера) Тогда
1736 | Команда.ДобавитьПараметр("--cluster-user=" + """" + ПараметрыЗапуска.ИмяПользователяАдминистратораКластера + """");
1737 | КонецЕсли;
1738 | Если ЗначениеЗаполнено(ПараметрыЗапуска.ПарольПользователяАдминистратораКластера) Тогда
1739 | Команда.ДобавитьПараметр("--cluster-pwd=" + """" + ПараметрыЗапуска.ПарольПользователяАдминистратораКластера + """");
1740 | КонецЕсли;
1741 | Команда.ДобавитьПараметр("info");
1742 | Команда.ДобавитьПараметр("--infobase=" + ИДБазы);
1743 | Команда.ДобавитьПараметр("--infobase-user=" + ПараметрыЗапуска.ИмяПользователя);
1744 | Команда.ДобавитьПараметр("--infobase-pwd=" + ПараметрыЗапуска.ПарольПользователя);
1745 | КодВозврата = Команда.Исполнить();
1746 | Вывод = Команда.ПолучитьВывод();
1747 | Если КодВозврата = 0 Тогда
1748 | Для Каждого ТекСтрока Из СтрРазделить(Вывод, Символы.ПС) Цикл
1749 | ТекПараметры = СтрРазделить(ТекСтрока, ":");
1750 | Если ТекПараметры.Количество() = 2 Тогда
1751 |
1752 | ТекИмя = СокрЛП(ТекПараметры.Получить(0));
1753 | ТекЗначение = СокрЛП(ТекПараметры.Получить(1));
1754 |
1755 | Если Не ПустаяСтрока(ТекИмя) Тогда
1756 | ДанныеИнформационнойБазы.Вставить(СтрЗаменить(ТекИмя, "-", ""), ТекЗначение);
1757 | КонецЕсли;
1758 |
1759 | КонецЕсли;
1760 | КонецЦикла;
1761 | Иначе
1762 | ТекстОшибки = "Ошибка получения данных информационной базы, код возврата = " + КодВозврата + Символы.ПС + Вывод;
1763 | Возврат Неопределено;
1764 | КонецЕсли;
1765 | КонецЦикла;
1766 |
1767 | Если ДанныеИнформационнойБазы.Количество() = 0 Тогда
1768 | Возврат Неопределено;
1769 | КонецЕсли;
1770 |
1771 | Возврат ДанныеИнформационнойБазы;
1772 |
1773 | КонецФункции
1774 |
1775 | #КонецОбласти
1776 |
1777 | #КонецОбласти
1778 |
1779 | #Область Запуск1С
1780 |
1781 | // *****************************************************************
1782 | // Запускает 1С:Предприятие
1783 | //
1784 | // Параметры:
1785 | // ПутьКОбработке - Строка - Если указан путь к обработке, то обработка будет открыта после запуска 1С:Предприятие
1786 | // ОжидатьЗавершения - Булево - Ожидать завершения работы 1С:Предприятие, по умолчанию - Ложь
1787 | // ДопПараметрыЗапуска - Строка - Дополнительные параметры запуска
1788 | // ТонкийКлиент - Булево - Если значение = Истина, то будет запускаться тонкий клиент, по умолчанию - Ложь
1789 | //
1790 | Функция ЗапуститьПредприятие(ПутьКОбработке = "", ОжидатьЗавершения = Ложь, ДопПараметрыЗапуска = "", ТонкийКлиент = Ложь) Экспорт
1791 |
1792 | СтрокаЗапуска =
1793 | ?(ПутьКОбработке = "" , "", ВставитьПараметрЗапуска(ПутьКОбработке, "Execute")) +
1794 | ДопПараметрыЗапуска;
1795 |
1796 | Возврат ВыполнитьЗапуск1С("ENTERPRISE", СтрокаЗапуска, ОжидатьЗавершения, ТонкийКлиент);
1797 |
1798 | КонецФункции
1799 |
1800 | // *****************************************************************
1801 | // Запускает конфигуратор
1802 | //
1803 | // Параметры:
1804 | // ОжидатьЗавершения - Булево - Ожидать завершения работы конфигуратора, по умолчанию - Ложь
1805 | //
1806 | Функция ЗапуститьКонфигуратор(ОжидатьЗавершения = Ложь) Экспорт
1807 |
1808 | Возврат ВыполнитьЗапуск1С("DESIGNER", "", ОжидатьЗавершения);
1809 |
1810 | КонецФункции
1811 |
1812 | #КонецОбласти
1813 |
1814 | #Область ВыгрузкаЗагрузкаИБ
1815 |
1816 | // *****************************************************************
1817 | // Выгружает информационную базу в указанный файл (dt)
1818 | //
1819 | // Параметры:
1820 | // ПолныйПутьКФайлу - Строка - Полный путь к файлу
1821 | //
1822 | Функция ВыгрузитьИнформационнуюБазу(ПолныйПутьКФайлу) Экспорт
1823 |
1824 | СтрокаЗапуска = ВставитьПараметрЗапуска(ПолныйПутьКФайлу, "DumpIB ");
1825 |
1826 | Если НЕ ВыполнитьЗапуск1С("DESIGNER", СтрокаЗапуска) Тогда
1827 | Возврат Ложь;
1828 | КонецЕсли;
1829 |
1830 | // Проверим, создался ли файл?
1831 | Если НайтиФайлы(ПолныйПутьКФайлу).Количество() = 0 Тогда
1832 | ТекстОшибки = "Команда выполнена успешно, но файл не найден после завершения.";
1833 | Возврат Ложь;
1834 | КонецЕсли;
1835 |
1836 | Возврат Истина;
1837 |
1838 | КонецФункции
1839 |
1840 | // *****************************************************************
1841 | // Загружает информационную базу из указанного файла (dt)
1842 | //
1843 | // Параметры:
1844 | // ПолныйПутьКФайлу - Строка - Полный путь к файлу
1845 | //
1846 | Функция ЗагрузитьИнформационнуюБазу(ПолныйПутьКФайлу) Экспорт
1847 |
1848 | СтрокаЗапуска = ВставитьПараметрЗапуска(ПолныйПутьКФайлу, "RestoreIB ");
1849 |
1850 | Возврат ВыполнитьЗапуск1С("DESIGNER", СтрокаЗапуска);
1851 |
1852 | КонецФункции
1853 |
1854 | #КонецОбласти
1855 |
1856 | #Область Конфигурация
1857 |
1858 | // *****************************************************************
1859 | // Сохраняет текущую конфигурацию в указаннй файл (cf)
1860 | //
1861 | // Параметры:
1862 | // ПолныйПутьКФайлу - Строка - Полный путь к файлу
1863 | //
1864 | Функция СохранитьКонфигурациюВФайл(ПолныйПутьКФайлу) Экспорт
1865 |
1866 | // Удалим файл, если таковой имеется
1867 | УдалитьФайлы(ПолныйПутьКФайлу);
1868 |
1869 | СтрокаЗапуска = ВставитьПараметрЗапуска(ПолныйПутьКФайлу, "DumpCfg ");
1870 |
1871 | Если НЕ ВыполнитьЗапуск1С("DESIGNER", СтрокаЗапуска) Тогда
1872 | Возврат Ложь;
1873 | КонецЕсли;
1874 |
1875 | // Проверим, создался ли файл?
1876 | Если НайтиФайлы(ПолныйПутьКФайлу).Количество() = 0 Тогда
1877 | ТекстОшибки = "Команда выполнена успешно, но файл не найден после завершения.";
1878 | Возврат Ложь;
1879 | КонецЕсли;
1880 |
1881 | Возврат Истина;
1882 |
1883 | КонецФункции
1884 |
1885 | // *****************************************************************
1886 | // Сохраняет конфигурацию базы данных в указаннй файл (cf)
1887 | //
1888 | // Параметры:
1889 | // ПолныйПутьКФайлу - Строка - Полный путь к файлу
1890 | //
1891 | Функция СохранитьКонфигурациюБазыДанныхВФайл(ПолныйПутьКФайлу) Экспорт
1892 |
1893 | СтрокаЗапуска = ВставитьПараметрЗапуска(ПолныйПутьКФайлу, "DumpDBCfg ");
1894 |
1895 | Если НЕ ВыполнитьЗапуск1С("DESIGNER", СтрокаЗапуска) Тогда
1896 | Возврат Ложь;
1897 | КонецЕсли;
1898 |
1899 | // Проверим, создался ли файл?
1900 | Если НайтиФайлы(ПолныйПутьКФайлу).Количество() = 0 Тогда
1901 | ТекстОшибки = "Команда выполнена успешно, но файл не найден после завершения.";
1902 | Возврат Ложь;
1903 | КонецЕсли;
1904 |
1905 | Возврат Истина;
1906 |
1907 | КонецФункции
1908 |
1909 | // *****************************************************************
1910 | // Загружает конфигурацию из указанного файла (cf)
1911 | //
1912 | // Параметры:
1913 | // ПолныйПутьКФайлу - Строка - Полный путь к файлу
1914 | //
1915 | Функция ЗагрузитьКонфигурациюИзФайла(ПолныйПутьКФайлу, ИмяРасширения = "") Экспорт
1916 |
1917 | СтрокаЗапуска = ВставитьПараметрЗапуска(ПолныйПутьКФайлу, "LoadCfg ") +
1918 | ?(ЗначениеЗаполнено(ИмяРасширения), "-Extension " + ИмяРасширения + "", "");
1919 |
1920 | Возврат ВыполнитьЗапуск1С("DESIGNER", СтрокаЗапуска);
1921 |
1922 | КонецФункции
1923 |
1924 | // *****************************************************************
1925 | // Обновлет конфигурацию базы данных
1926 | //
1927 | // Параметры:
1928 | // ПредупрежденияКакОшибки - Булево - Если Истина, то все предупреждения трактуются как ошибки.
1929 | // НаСервере - Булево - Если Истина, то обновление будет выполняться на сервере (имеет смысл только в клиент-серверном варианте работы).
1930 | //
1931 | Функция ОбновитьКонфигурациюБазыДанных(ПредупрежденияКакОшибки = Ложь, НаСервере = Ложь) Экспорт
1932 |
1933 | СтрокаЗапуска = "/UpdateDBCfg " +
1934 | ?(ПредупрежденияКакОшибки, "-WarningsAsErrors ", "") +
1935 | ?(НаСервере, "-Server ", "");
1936 |
1937 | Возврат ВыполнитьЗапуск1С("DESIGNER", СтрокаЗапуска);
1938 |
1939 | КонецФункции
1940 |
1941 | // **********************************************************************************************
1942 | // Сравнивает две конфигурации с выводом отчета в файл
1943 | //
1944 | // Параметры:
1945 | // ПутьИмяФайлаОтчета - путь к файлу отчета, если файл не существует, будет создан новый;
1946 | // ТипПервойКонфигурации - Строка - Тип первой конфигурации. Возможные значния:
1947 | // MainConfiguration - основная конфигурация;
1948 | // DBConfiguration - конфигурация базы данных;
1949 | // VendorConfiguration - конфигурация поставщика;
1950 | // ExtensionConfiguration - расширение конфигурации;
1951 | // ExtensionDBConfiguration - расширение конфигурации из база данных;
1952 | // ConfigurationRepository - конфигурация из хранилища конфигурации;
1953 | // File - файл конфигурации/расширения конфигурации.
1954 | // ТипВторойКонфигурации - Строка - Тип второй конфигурации. Возможные значения:
1955 | // MainConfiguration - основная конфигурация;
1956 | // DBConfiguration - конфигурация базы данных;
1957 | // VendorConfiguration - конфигурация поставщика;
1958 | // ExtensionConfiguration - расширение конфигурации;
1959 | // ExtensionDBConfiguration - расширение конфигурации из база данных;
1960 | // ConfigurationRepository - конфигурация из хранилища конфигурации;
1961 | // File - файл конфигурации/расширения конфигурации.
1962 | // ДопКлючПервойКонфигурации - Строка - дополнительный идентификатор первой конфигурации. Возможные значения (в зависимости от типа первой конфигурации):
1963 | // MainConfiguration - Не используется
1964 | // DBConfiguration - Не используется
1965 | // VendorConfiguration - Имя конфигурации поставщика
1966 | // ExtensionConfiguration - Имя конфигурации поставщика
1967 | // ExtensionDBConfiguration - Имя конфигурации расширения (из базы данных)
1968 | // ConfigurationRepository - Версия конфигурации в хранилище
1969 | // File - Пусть к файлу конфигурации (.cf-файл) или расширения конфигурации (.cfe-файл)
1970 | // ДопКлючВторойКонфигурации - Строка - дополнительный идентификатор второй конфигурации. Возможные значения (в зависимости от типа второй конфигурации):
1971 | // MainConfiguration - Не используется
1972 | // DBConfiguration - Не используется
1973 | // VendorConfiguration - Имя конфигурации поставщика
1974 | // ExtensionConfiguration - Имя конфигурации поставщика
1975 | // ExtensionDBConfiguration - Имя конфигурации расширения (из базы данных)
1976 | // ConfigurationRepository - Версия конфигурации в хранилище
1977 | // File - Пусть к файлу конфигурации (.cf-файл) или расширения конфигурации (.cfe-файл)
1978 | // ТипОтчетаДляСравнения - Строка - Тип отчета для сравнения. Возможные типы:
1979 | // Brief - крайткий отчет;
1980 | // Full - полный отчет.
1981 | // ФорматФайлаОтчета - Строка - Формат файла отчета. Возможные значения:
1982 | // txt - текстовый документ;
1983 | // mxl - табличный документ.
1984 | // ПравилоУстановкиСоответствийОбъектов - Строка - для тех случаев, когда конфигурации не состоят в отношениях «родитель-потомок», возможные значения:
1985 | // ByObjectName - по именам объектов. Используется по умолчанию.
1986 | // ByObjectIDs - по внутренним идентификаторам.
1987 | //
1988 | // Возвращает:
1989 | // Истина - Отчет сформирован успешно
1990 | // Ложь - Были ошибки
1991 | //
1992 | Функция СравнитьКонфигурации(
1993 | ПутьИмяФайлаОтчета,
1994 | ТипПервойКонфигурации = "MainConfiguration",
1995 | ТипВторойКонфигурации = "DBConfiguration",
1996 | Знач ДопКлючПервойКонфигурации = "",
1997 | Знач ДопКлючВторойКонфигурации = "",
1998 | ТипОтчетаДляСравнения = "Brief",
1999 | ФорматФайлаОтчета = "txt",
2000 | ПравилоУстановкиСоответствийОбъектов = "ByObjectName") Экспорт
2001 |
2002 | // Доработаем и проверим параметры запуска
2003 | Если ТипПервойКонфигурации = "ConfigurationRepository" Тогда
2004 | Если ДопКлючПервойКонфигурации = "" Тогда
2005 | ДопКлючПервойКонфигурации = "0 ";
2006 | КонецЕсли;
2007 | ИначеЕсли ТипПервойКонфигурации = "File" Тогда
2008 | Файл = Новый Файл(ДопКлючПервойКонфигурации);
2009 | Если Не Файл.Существует() Тогда
2010 | ТекстОшибки = "Не найден файл по пути: " + ДопКлючПервойКонфигурации;
2011 | Возврат Ложь;
2012 | КонецЕсли;
2013 | КонецЕсли;
2014 | Если ТипВторойКонфигурации = "ConfigurationRepository" Тогда
2015 | Если ДопКлючВторойКонфигурации = "" Тогда
2016 | ДопКлючВторойКонфигурации = "0 ";
2017 | КонецЕсли;
2018 | ИначеЕсли ТипВторойКонфигурации = "File" Тогда
2019 | Файл = Новый Файл(ДопКлючВторойКонфигурации);
2020 | Если Не Файл.Существует() Тогда
2021 | ТекстОшибки = "Не найден файл по пути: " + ДопКлючВторойКонфигурации;
2022 | Возврат Ложь;
2023 | КонецЕсли;
2024 | КонецЕсли;
2025 |
2026 | СтрокаЗапуска = "/CompareCfg " +
2027 | ВставитьПараметрЗапуска(ТипПервойКонфигурации, "FirstConfigurationType ", "-", Ложь) +
2028 | ?(Найти("MainConfigurationDBConfiguration",ТипПервойКонфигурации) = 0, "-FirstConfigurationKey " + ДопКлючПервойКонфигурации,"") +
2029 | ВставитьПараметрЗапуска(ТипВторойКонфигурации, "SecondConfigurationType ", "-", Ложь) +
2030 | ?(Найти("MainConfigurationDBConfiguration",ТипВторойКонфигурации) = 0, "-SecondConfigurationKey " + ДопКлючВторойКонфигурации,"") +
2031 | ?(ПравилоУстановкиСоответствийОбъектов <> "", ВставитьПараметрЗапуска(ПравилоУстановкиСоответствийОбъектов,"MappingRule ","-",Ложь),"") +
2032 | "-IncludeChangedObjects -IncludeDeletedObjects -IncludeAddedObjects " +
2033 | ВставитьПараметрЗапуска(ТипОтчетаДляСравнения, "ReportType ", "-", Ложь) +
2034 | ВставитьПараметрЗапуска(ФорматФайлаОтчета, "ReportFormat ", "-", Ложь) +
2035 | ВставитьПараметрЗапуска(ПутьИмяФайлаОтчета, "ReportFile ", "-");
2036 |
2037 | Возврат ВыполнитьЗапуск1С("DESIGNER", СтрокаЗапуска);
2038 |
2039 | КонецФункции
2040 |
2041 | // *****************************************************************
2042 | // Проверяет есть ли записи об изменении в файле отчета о сравнении конфигураций.
2043 | // При условии, что отчет "краткий" в формате txt.
2044 | //
2045 | // Параметры:
2046 | // ПутьКФайлуОтчетаОСравнении - Путь к файлу отчета о сравнении
2047 | //
2048 | // Возвращает:
2049 | // Истина - Есть изменения
2050 | // Ложь - Изменений нет
2051 | // Неопределено - Были ошибки
2052 | //
2053 | Функция ЕстьИзмененияВОтчетеОСравненииКраткийТекст(ПутьКФайлуОтчетаОСравнении) Экспорт
2054 |
2055 | // Проверим существование файла
2056 | Файл = Новый Файл(ПутьКФайлуОтчетаОСравнении);
2057 | Если Не Файл.Существует() Тогда
2058 | ТекстОшибки = "Файл " + ПутьКФайлуОтчетаОСравнении + " не найден!";
2059 | Возврат Неопределено;
2060 | КонецЕсли;
2061 |
2062 | ЧислоСтрокВЗаголовке = 4;
2063 |
2064 | ЧтениеТекста = Новый ЧтениеТекста(ПутьКФайлуОтчетаОСравнении);
2065 | Стр = ЧтениеТекста.ПрочитатьСтроку();
2066 | ПрочитаноСтрок = 0;
2067 | Пока Стр <> Неопределено Цикл
2068 | Если СокрЛП(Стр) <> "" Тогда
2069 | ПрочитаноСтрок = ПрочитаноСтрок + 1;
2070 | КонецЕсли;
2071 | Если ПрочитаноСтрок > ЧислоСтрокВЗаголовке Тогда
2072 | ЧтениеТекста.Закрыть();
2073 | Возврат Истина;
2074 | КонецЕсли;
2075 | Стр = ЧтениеТекста.ПрочитатьСтроку();
2076 | КонецЦикла;
2077 | ЧтениеТекста.Закрыть();
2078 |
2079 | Возврат Ложь;
2080 |
2081 | КонецФункции
2082 |
2083 | // *****************************************************************
2084 | // Проверяет, если ли изменения в основной конфигурации относительно конфигурации базы данных
2085 | //
2086 | // Возвращает:
2087 | // Истина - Есть изменения
2088 | // Ложь - Изменений нет
2089 | // Неопределено - Были ошибки
2090 | //
2091 | Функция ЕстьИзмененияОсновнойКонфигурации() Экспорт
2092 |
2093 | // Создадим отчет о сравнении
2094 | ВременныйФайлСравнения = ПолучитьИмяВременногоФайла("txt");
2095 | Если Не СравнитьКонфигурации(ВременныйФайлСравнения, "MainConfiguration", "DBConfiguration") Тогда
2096 | Возврат Неопределено;
2097 | КонецЕсли;
2098 |
2099 | ЕстьИзменения = ЕстьИзмененияВОтчетеОСравненииКраткийТекст(ВременныйФайлСравнения);
2100 |
2101 | // Удалим временный файл
2102 | УдалитьФайлы(ВременныйФайлСравнения);
2103 |
2104 | Возврат ЕстьИзменения;
2105 |
2106 | КонецФункции
2107 |
2108 | // *****************************************************************
2109 | Функция ОбъединитьКонфигурациюСФайлом(ПолныйПутьКФайлуКонфигурации, ПолныйПутьКФайлуНастроек = "") Экспорт
2110 |
2111 | // Проверим, есть ли файл?
2112 | Если НайтиФайлы(ПолныйПутьКФайлуКонфигурации).Количество() = 0 Тогда
2113 | ТекстОшибки = "Не найден файл по пути: " + ПолныйПутьКФайлуКонфигурации;
2114 | Возврат Ложь;
2115 | КонецЕсли;
2116 |
2117 | Если ПолныйПутьКФайлуНастроек <> "" Тогда
2118 | Если НайтиФайлы(ПолныйПутьКФайлуКонфигурации).Количество() = 0 Тогда
2119 | ТекстОшибки = "Не найден файл по пути: " + ПолныйПутьКФайлуНастроек;
2120 | Возврат Ложь;
2121 | КонецЕсли;
2122 | КонецЕсли;
2123 |
2124 | СтрокаЗапуска = ВставитьПараметрЗапуска(ПолныйПутьКФайлуКонфигурации, "MergeCfg ") +
2125 | ?(ПолныйПутьКФайлуНастроек = "", "", ВставитьПараметрЗапуска(ПолныйПутьКФайлуНастроек, "Settings ", "-")) +
2126 | "-ClearUnresolvedRefs " +
2127 | "-force ";
2128 |
2129 | Возврат ВыполнитьЗапуск1С("DESIGNER", СтрокаЗапуска);
2130 |
2131 | КонецФункции
2132 |
2133 | #КонецОбласти
2134 |
2135 | #Область ХранилищеКонфигураций
2136 |
2137 | // *****************************************************************
2138 | // Проверяет, если ли изменения в хранилище относительно основной конфигурации
2139 | //
2140 | // Возвращает:
2141 | // Истина - Есть изменения
2142 | // Ложь - Изменений нет
2143 | // Неопределено - Были ошибки
2144 | //
2145 | Функция ЕстьИзмененияВХранилище() Экспорт
2146 |
2147 | // Создадим отчет о сравнении
2148 | ВременныйФайлСравнения = ПолучитьИмяВременногоФайла("txt");
2149 | Если Не СравнитьКонфигурации(ВременныйФайлСравнения, "MainConfiguration","ConfigurationRepository") Тогда
2150 | Возврат Неопределено;
2151 | КонецЕсли;
2152 |
2153 | ЕстьИзменения = ЕстьИзмененияВОтчетеОСравненииКраткийТекст(ВременныйФайлСравнения);
2154 |
2155 | // Удалим временный файл
2156 | УдалитьФайлы(ВременныйФайлСравнения);
2157 |
2158 | Возврат ЕстьИзменения;
2159 |
2160 | КонецФункции
2161 |
2162 | // *****************************************************************
2163 | // Сохраняет конфигурацию из хранилища в файл
2164 | //
2165 | // Параметры:
2166 | // ПолныйПутьКФайлу - Полный путь к файлу
2167 | // НомерВерсии - номер версии хранилища, если номер версии не указан, или равен -1, будет сохранена последняя версия.
2168 | //
2169 | Функция СохранитьКонфигурациюИзХранилищаВФайл(ПолныйПутьКФайлу, НомерВерсии = "") Экспорт
2170 |
2171 | // Удалим файл, если таковой имеется
2172 | УдалитьФайлы(ПолныйПутьКФайлу);
2173 |
2174 | СтрокаЗапуска = ВставитьПараметрЗапуска(ПолныйПутьКФайлу, "ConfigurationRepositoryDumpCfg ") +
2175 | ?(ЗначениеЗаполнено(НомерВерсии), "-v " + Формат(НомерВерсии, "ЧДЦ=0; ЧГ=0") + " ", "");
2176 |
2177 | Если НЕ ВыполнитьЗапуск1С("DESIGNER", СтрокаЗапуска) Тогда
2178 | Возврат Ложь;
2179 | КонецЕсли;
2180 |
2181 | // Проверим, создался ли файл?
2182 | Если НайтиФайлы(ПолныйПутьКФайлу).Количество() = 0 Тогда
2183 | ТекстОшибки = "Команда выполнена успешно, но файл не найден после завершения.";
2184 | Возврат Ложь;
2185 | КонецЕсли;
2186 |
2187 | Возврат Истина;
2188 |
2189 | КонецФункции
2190 |
2191 | // *****************************************************************
2192 | // Обновляет текущую конфигурацию из хранилища
2193 | //
2194 | // Параметры:
2195 | // НомерВерсии (-v [номер версии хранилища])
2196 | // - номер версии хранилища, если номер версии не указан, или равен -1, будет сохранена последняя версия, если конфигурация не подключена к хранилищу, то параметр игнорируется;
2197 | // ПолучатьЗахваченныеОбъекты (-revised)
2198 | // - получать захваченные объекты, если потребуется. Если конфигурация не подключена к хранилищу, то параметр игнорируется;
2199 | // Форсировать (-force)
2200 | // - если при пакетном обновлении конфигурации из хранилища должны быть получены новые объекты конфигурации или удалиться существующие, указание этого параметра
2201 | // свидетельствует о подтверждении пользователем описанных выше операций. Если параметр не указан - действия выполнены не будут.
2202 | //
2203 | Функция ОбновитьКонфигурациюИзХранилища(НомерВерсии = "", ПолучатьЗахваченныеОбъекты = Ложь, Форсировать = Истина) Экспорт
2204 |
2205 | СтрокаЗапуска = "/ConfigurationRepositoryUpdateCfg " +
2206 | ?(ЗначениеЗаполнено(НомерВерсии), "-v " + Формат(НомерВерсии, "ЧДЦ=0; ЧГ=0") + " ", "") +
2207 | ?(ПолучатьЗахваченныеОбъекты, "-revised ","") +
2208 | ?(Форсировать, "-force ", "");
2209 |
2210 | Возврат ВыполнитьЗапуск1С("DESIGNER", СтрокаЗапуска);
2211 |
2212 | КонецФункции
2213 |
2214 | // *****************************************************************
2215 | // Отключает конфигурацию от хранилища
2216 | //
2217 | // Параметры:
2218 | // Форсировать (-force) Булево - ключ для форсирования отключения от хранилища (пропуск диалога аутентификации, если не указаны параметры пользователя хранилища, игнорирование наличия захваченных и измененных объектов).
2219 | //
2220 | // Возващает:
2221 | // Истина - Операция успешно выполнена
2222 | // Ложь - Были ошибки
2223 | //
2224 | Функция ОтключитьКонфигурациюОтХранилища(Форсировать = Истина) Экспорт
2225 |
2226 | СтрокаЗапуска = "/ConfigurationRepositoryUnbindCfg " +
2227 | ?(Форсировать,"-force ","");
2228 |
2229 | Возврат ВыполнитьЗапуск1С("DESIGNER", СтрокаЗапуска);
2230 |
2231 | КонецФункции
2232 |
2233 | // *****************************************************************
2234 | // Подключает конфигурацию к хранилищу
2235 | //
2236 | // Параметры:
2237 | // Форсировать (-force) - Булево - выполняет подключение даже в том случае, если для данного пользователя уже есть конфигурация, связанная с данным хранилищем.
2238 | // ЗаменитьТекущуюКонфигурацию - Булево - если конфигурация непустая, данный ключ подтверждает замену конфигурации на конфигурацию из хранилища.
2239 | //
2240 | // Возващает:
2241 | // Истина - Операция успешно выполнена
2242 | // Ложь - Были ошибки
2243 | //
2244 | Функция ПодключитьКонфигурациюКХранилищу(Форсировать = Истина, ЗаменитьТекущуюКонфигурацию = Истина) Экспорт
2245 |
2246 | СтрокаЗапуска = "/ConfigurationRepositoryBindCfg " +
2247 | ?(Форсировать, "-forceBindAlreadyBindedUser ", "") +
2248 | ?(ЗаменитьТекущуюКонфигурацию, "-forceReplaceCfg ", "");
2249 |
2250 | Возврат ВыполнитьЗапуск1С("DESIGNER", СтрокаЗапуска);
2251 |
2252 | КонецФункции
2253 |
2254 | // *****************************************************************
2255 | // Выполняет очистку локального кэша хранилища конфигурации
2256 | //
2257 | // Возващает:
2258 | // Истина - Операция успешно выполнена
2259 | // Ложь - Были ошибки
2260 | //
2261 | Функция ВыполнитьОчисткуЛокальногоКешаХранилища() Экспорт
2262 |
2263 | СтрокаЗапуска = "/ConfigurationRepositoryClearLocalCache ";
2264 |
2265 | Возврат ВыполнитьЗапуск1С("DESIGNER", СтрокаЗапуска);
2266 |
2267 | КонецФункции
2268 |
2269 | // *****************************************************************
2270 | // Выполняет очистку локальной базы данных хранилища конфигурации
2271 | //
2272 | // Параметры:
2273 | //
2274 | // Возващает:
2275 | // Истина - Операция успешно выполнена
2276 | // Ложь - Были ошибки
2277 | //
2278 | Функция ВыполнитьОчисткуЛокальнойБазыДанныхХранилища() Экспорт
2279 |
2280 | СтрокаЗапуска = "/ConfigurationRepositoryClearCache ";
2281 |
2282 | Возврат ВыполнитьЗапуск1С("DESIGNER", СтрокаЗапуска);
2283 |
2284 | КонецФункции
2285 |
2286 | // *****************************************************************
2287 | // Выполняет захват объектов из хранилища конфигурации для редактирования (/ConfigurationRepositoryLock [-Objects <имя файла>] [-revised]).
2288 | //
2289 | // Параметры:
2290 | // ПутьИмяФайлаОбъектов (-Objects <имя файла>)
2291 | // - путь к файлу со списком объектов, которые будут участвовать в операции. Если файл указан - в операции участвуют только указанные в файле объекты, в противном случае участвует вся конфигурация.
2292 | // ПолучатьОбъектыИзХранилища(-revised)
2293 | // - получать захваченные объекты, если потребуется.
2294 | // Возвращает:
2295 | // Истина - операция выполнена успешно;
2296 | // Ложь - были ошибки.
2297 | //
2298 | Функция ЗахватитьВХранилище(ПутьИмяФайлаОбъектов = "", ПолучатьОбъектыИзХранилища = Истина) Экспорт
2299 |
2300 | СтрокаЗапуска =
2301 | "/ConfigurationRepositoryLock " +
2302 | ?(ПутьИмяФайлаОбъектов<>"",ВставитьПараметрЗапуска(ПутьИмяФайлаОбъектов,"Objects ","-"),"") +
2303 | ?(ПолучатьОбъектыИзХранилища,"-revised ","") +
2304 | ?(ЗначениеЗаполнено(ПараметрыЗапуска.ФайлДляЗаписиРезультатовРаботыВПакетномРежиме),
2305 | ВставитьПараметрЗапуска(ПараметрыЗапуска.ФайлДляЗаписиРезультатовРаботыВПакетномРежиме,"DumpResult "),"");
2306 |
2307 | Возврат ВыполнитьЗапуск1С("DESIGNER", СтрокаЗапуска);
2308 |
2309 | КонецФункции
2310 |
2311 | // *********************************************************************
2312 | // Выполняет отмену захвата объектов в хранилище конфигурации (/ConfigurationRepositoryUnLock [-Objects <имя файла>] [-force]).
2313 | //
2314 | // Параметры:
2315 | // ПутьИмяФайлаОбъектов (-Objects <имя файла>)
2316 | // - путь к файлу со списком объектов, которые будут участвовать в операции. Если файл указан - в операции участвуют только указанные в файле объекты, в противном случае участвует вся конфигурация.
2317 | // ОтменитьЛокальныеИзменения(-force)
2318 | // - описывает поведение с локально измененными объектами:
2319 | // Ключ указан - локально измененные объекты будут получены из хранилища. Изменения будут потеряны.
2320 | // Ключ не указан - при наличии локально измененных объектов будет выдана ошибка, и операция будет отменена целиком, для всех объектов, участвующих в операции.
2321 | // Возвращает:
2322 | // Истина - операция выполнена успешно;
2323 | // Ложь - были ошибки.
2324 | //
2325 | Функция ОтменитьЗахватВХранилище(ПутьИмяФайлаОбъектов = "", ОтменитьЛокальныеИзменения = Истина) Экспорт
2326 |
2327 | СтрокаЗапуска = "/ConfigurationRepositoryUnLock " +
2328 | ?(ПутьИмяФайлаОбъектов <> "", ВставитьПараметрЗапуска(ПутьИмяФайлаОбъектов, "Objects ", "-"), "") +
2329 | ?(ОтменитьЛокальныеИзменения, "-force ", "");
2330 |
2331 | Возврат ВыполнитьЗапуск1С("DESIGNER", СтрокаЗапуска);
2332 |
2333 | КонецФункции
2334 |
2335 | // *******************************************************************
2336 | // Помещает измененные объекты в хранилище (/ConfigurationRepositoryCommit [-Objects <имя файла>] [-comment <текст комментария>] [-keepLocked] [-force])
2337 | //
2338 | // Параметры:
2339 | // ПутьИмяФайлаОбъектов (-Objects <имя файла>)
2340 | // - путь к файлу со списком объектов, которые будут участвовать в операции. Если файл указан - в операции участвуют только указанные в файле объекты, в противном случае участвует вся конфигурация.
2341 | // ТекстКомментария (-comment <текст комментария>)
2342 | // - текст комментария к помещаемым объектам.
2343 | // ОставлятьОбъектыЗахваченными (-keepLocked)
2344 | // - оставлять помещенные объекты захваченными. Если не указан, то после помещения изменений будет отменен захват для объектов, участвующих в операции.
2345 | // ОчищатьСсылкиНаУдаленныеОбъекты (-force)
2346 | // - описывает поведение при обнаружении ссылок на удаленные объекты:
2347 | // Истина - будет выполнена попытка очистки ссылок.
2348 | // Ложь - будет выдана ошибка.
2349 | // Возвращает:
2350 | // Истина - операция выполнена успешно;
2351 | // Ложь - были ошибки.
2352 | //
2353 | Функция ПоместитьВХранилище(ПутьИмяФайлаОбъектов = "", ТекстКомментария = "", ОставлятьОбъектыЗахваченными = Ложь, ОчищатьСсылкиНаУдаленныеОбъекты = Истина) Экспорт
2354 |
2355 | СтрокаЗапуска = "/ConfigurationRepositoryCommit " +
2356 | ?(ПутьИмяФайлаОбъектов <> "", ВставитьПараметрЗапуска(ПутьИмяФайлаОбъектов, "Objects ", "-"),"") +
2357 | ВставитьПараметрЗапуска(ТекстКомментария,"comment ", "-") +
2358 | ?(ОставлятьОбъектыЗахваченными, "-keepLocked ", "") +
2359 | ?(ОчищатьСсылкиНаУдаленныеОбъекты, "-force ", "");
2360 |
2361 | Возврат ВыполнитьЗапуск1С("DESIGNER", СтрокаЗапуска);
2362 |
2363 | КонецФункции
2364 |
2365 | // *****************************************************************
2366 | Функция ПолучитьИсториюХранилища(ПутьИмяФайлаОбъектов = "", НачальнаяВерсия = -1, КонечнаяВерсия = -1, Формат = "txt") Экспорт
2367 |
2368 | СтрокаЗапуска = "/ConfigurationRepositoryReport " +
2369 | ПутьИмяФайлаОбъектов + " " +
2370 | ВставитьПараметрЗапуска(НачальнаяВерсия, "NBegin ", "-", Ложь) +
2371 | ?(КонечнаяВерсия=-1,"",ВставитьПараметрЗапуска(КонечнаяВерсия, "NEnd ", "-", Ложь)) +
2372 | ВставитьПараметрЗапуска(Формат, "ReportFormat ", "-", Ложь);
2373 |
2374 | Возврат ВыполнитьЗапуск1С("DESIGNER", СтрокаЗапуска);
2375 |
2376 | КонецФункции
2377 |
2378 | #КонецОбласти
2379 |
2380 | #Область СлужебныеФайлы
2381 |
2382 | // *****************************************************************
2383 | // Создает файл списка объектов на основании отчета о сравнении
2384 | //
2385 | // Параметры:
2386 | // ПолныйПутьКФайлуОтчета - полный путь к файлу отчета о сравнении (отчет должен быть кратким в формате txt)
2387 | // ПолныйПутьКФайлуСпискаОбъектов - полный путь к файлу списка объектов, если путь не указан, будет создан временный.
2388 | //
2389 | // Возвращает:
2390 | // Ложь - Были ошибки;
2391 | // Истина - Файл создан успешно.
2392 | //
2393 | Функция СоздатьФайлДляЗахватаОбъектовИзОтчетаОСравнении(ПолныйПутьКФайлуОтчета="", ПолныйПутьКФайлуСпискаОбъектов="") Экспорт
2394 |
2395 | // Читаем файл отчета о сравнении
2396 | Если ПолныйПутьКФайлуОтчета = "" Тогда
2397 | ТекстОшибки = "Не верное количество параметров. Не указан путь к файлу отчета о сравнении!";
2398 | Возврат Ложь;
2399 | КонецЕсли;
2400 | Текст = Новый ТекстовыйДокумент;
2401 | Попытка
2402 | Текст.Прочитать(ПолныйПутьКФайлуОтчета);
2403 | Исключение
2404 | ТекстОшибки = ОписаниеОшибки();
2405 | Возврат Ложь;
2406 | КонецПопытки;
2407 |
2408 | // Создаем массив объектов из файла сравнения
2409 | СписокОбъектов = Новый массив;
2410 | ТекущийИндексМассива = -1;
2411 | Для НомерСтроки = 1 По Текст.КоличествоСтрок() Цикл
2412 | ОбъектФормаИлиМакет = Ложь;
2413 | Стр = Текст.ПолучитьСтроку(НомерСтроки);
2414 | Если Найти(Стр, "- ***") <> 0 или Найти(Стр, "- <--") или Найти(Стр, "- -->") <> 0 Тогда
2415 | НачальнаяПозиция = 1;
2416 | Пока СтрНайти(Стр, " ",,НачальнаяПозиция) <> 0 Цикл
2417 | КоличествоТабов = НачальнаяПозиция;
2418 | НачальнаяПозиция = НачальнаяПозиция + 1;
2419 | КонецЦикла;
2420 | Если КоличествоТабов = 2 Тогда
2421 | СписокОбъектов.Добавить(Сред(Стр,КоличествоТабов + 6));
2422 | ТекущийИндексМассива = ТекущийИндексМассива + 1;
2423 | УровеньПредыдущегоОбъекта = КоличествоТабов;
2424 | КонецЕсли;
2425 | Если КоличествоТабов = 3 Тогда
2426 | ПредОбъект = СписокОбъектов[ТекущийИндексМассива];
2427 | НачальнаяПозиция = КоличествоТабов + 6;
2428 | КонечнаяПозиция = СтрНайти(Стр, ".",,Найти(Стр, ".") + 1);
2429 | ТекОбъект = Сред(Стр,НачальнаяПозиция,КонечнаяПозиция - НачальнаяПозиция);
2430 | Если Найти(Стр, ".Форма.")<>0 Или Найти(Стр, ".Макет.")<>0 Тогда
2431 | ОбъектФормаИлиМакет = Истина;
2432 | КонецЕсли;
2433 | Если ПредОбъект = ТекОбъект и ОбъектФормаИлиМакет и УровеньПредыдущегоОбъекта = 2 Тогда
2434 | СписокОбъектов[ТекущийИндексМассива] = Сред(Стр,КоличествоТабов + 6);
2435 | ИначеЕсли ОбъектФормаИлиМакет Тогда
2436 | СписокОбъектов.Добавить(Сред(Стр,КоличествоТабов + 6));
2437 | ТекущийИндексМассива = ТекущийИндексМассива + 1;
2438 | КонецЕсли;
2439 | УровеньПредыдущегоОбъекта = КоличествоТабов;
2440 | КонецЕсли;
2441 | КонецЕсли;
2442 | КонецЦикла;
2443 |
2444 | Если Не СписокОбъектов.Количество()>0 Тогда
2445 | ТекстОшибки = "Нет элементов для создания файла списка объектов.";
2446 | Возврат Ложь;
2447 | КонецЕсли;
2448 |
2449 | // Создаем файл списка объектов
2450 | Если ПолныйПутьКФайлуСпискаОбъектов = "" Тогда
2451 | // BSLLS:MissingTemporaryFileDeletion-off
2452 | ПолныйПутьКФайлуСпискаОбъектов = ПолучитьИмяВременногоФайла(".xml");
2453 | // BSLLS:MissingTemporaryFileDeletion-off
2454 | КонецЕсли;
2455 | Запись = Новый ЗаписьXML;
2456 | Запись.ОткрытьФайл(ПолныйПутьКФайлуСпискаОбъектов, "UTF-8");
2457 | Запись.ЗаписатьНачалоЭлемента("Objects");
2458 | Запись.ЗаписатьАтрибут("xmlns", "http://v8.1c.ru/8.3/config/objects");
2459 | Запись.ЗаписатьАтрибут("version", "1.0");
2460 | Запись.ЗаписатьНачалоЭлемента("Configuration");
2461 | Запись.ЗаписатьАтрибут("includeChildObjects", "false");
2462 | Запись.ЗаписатьКонецЭлемента();
2463 | // Записываем элемент для каждого объекта из массива
2464 | Для каждого Строка Из СписокОбъектов Цикл
2465 | Запись.ЗаписатьНачалоЭлемента("Object");
2466 | Запись.ЗаписатьАтрибут("fullName", Строка);
2467 | Запись.ЗаписатьАтрибут("includeChildObjects", "false");
2468 | Запись.ЗаписатьКонецЭлемента();
2469 | КонецЦикла;
2470 | Запись.ЗаписатьКонецЭлемента();
2471 | Запись.Закрыть();
2472 |
2473 | Возврат Истина;
2474 |
2475 | КонецФункции
2476 |
2477 | // *****************************************************************
2478 | // Создает файл списка объектов на основании отчета с историей хранилища
2479 | //
2480 | // Параметры:
2481 | // ПолныйПутьКФайлуОбъектов - полный путь к файлу, содержащему список объектов для захвата.
2482 | // ПолныйПутьКФайлуСпискаОбъектов - полный путь к файлу списка объектов, если путь не указан, будет создан временный
2483 | //
2484 | // Возвращает:
2485 | // Ложь - Были ошибки;
2486 | // Истина - Файл создан успешно.
2487 | //
2488 | Функция СоздатьФайлДляЗахватаОбъектов(
2489 | ПолныйПутьКФайлуОбъектов,
2490 | ПолныйПутьКФайлуСпискаОбъектов="") Экспорт
2491 |
2492 | // Читаем файл c объектами
2493 | Если ПолныйПутьКФайлуОбъектов = "" Тогда
2494 | ТекстОшибки = "Не верное количество параметров. Не указан путь к файлу с объектами для захвата!";
2495 | Возврат Ложь;
2496 | КонецЕсли;
2497 |
2498 | Текст = Новый ТекстовыйДокумент;
2499 | Попытка
2500 | Текст.Прочитать(ПолныйПутьКФайлуОбъектов, КодировкаТекста.UTF8);
2501 | Исключение
2502 | ТекстОшибки = ОписаниеОшибки();
2503 | Возврат Ложь;
2504 | КонецПопытки;
2505 |
2506 | Если Текст.КоличествоСтрок() = 0 Тогда
2507 | ТекстОшибки = "Нет элементов для создания файла списка объектов.";
2508 | Возврат Ложь;
2509 | КонецЕсли;
2510 |
2511 | // Создаем файл списка объектов
2512 | Если ПолныйПутьКФайлуСпискаОбъектов = "" Тогда
2513 | ПолныйПутьКФайлуСпискаОбъектов = ПолучитьИмяВременногоФайла(".xml");
2514 | КонецЕсли;
2515 | Запись = Новый ЗаписьXML;
2516 | Запись.ОткрытьФайл(ПолныйПутьКФайлуСпискаОбъектов, "UTF-8");
2517 | Запись.ЗаписатьНачалоЭлемента("Objects");
2518 | Запись.ЗаписатьАтрибут("xmlns", "http://v8.1c.ru/8.3/config/objects");
2519 | Запись.ЗаписатьАтрибут("version", "1.0");
2520 | // Проверим, нужно ли захватывать корень
2521 | Стр = СокрЛП(Текст.ПолучитьСтроку(1));
2522 | Если СтрНайти(Стр, "Configuration") > 0
2523 | Или СтрНайти(Стр, "КореньКонфигурации") > 0 Тогда
2524 | Запись.ЗаписатьНачалоЭлемента("Configuration");
2525 | Запись.ЗаписатьАтрибут("includeChildObjects", "false");
2526 | Запись.ЗаписатьКонецЭлемента();
2527 | КонецЕсли;
2528 | // Записываем элемент для каждого объекта из файла
2529 | Для НомерСтроки = 1 По Текст.КоличествоСтрок() Цикл
2530 | Стр = СокрЛП(Текст.ПолучитьСтроку(НомерСтроки));
2531 | Если ПустаяСтрока(Стр) Тогда
2532 | Продолжить;
2533 | КонецЕсли;
2534 | Если Лев(Стр, 1) = "+" Тогда
2535 | ВключатьПодчиненные = "true";
2536 | Стр = Сред(Стр, 2);
2537 | Иначе
2538 | ВключатьПодчиненные = "false";
2539 | КонецЕсли;
2540 | Запись.ЗаписатьНачалоЭлемента("Object");
2541 | Запись.ЗаписатьАтрибут("fullName", Стр);
2542 | Запись.ЗаписатьАтрибут("includeChildObjects", ВключатьПодчиненные);
2543 | Запись.ЗаписатьКонецЭлемента();
2544 | КонецЦикла;
2545 | Запись.ЗаписатьКонецЭлемента();
2546 | Запись.Закрыть();
2547 |
2548 | Возврат Истина;
2549 |
2550 | КонецФункции
2551 |
2552 | // *****************************************************************
2553 | // Создает файл списка объектов на основании отчета с историей хранилища
2554 | //
2555 | // Параметры:
2556 | // ПолныйПутьКФайлуОтчета - полный путь к файлу отчета с историей хранилища (отчет должен быть в формате txt)
2557 | // ПолныйПутьКФайлуСпискаОбъектов - полный путь к файлу списка объектов, если путь не указан, будет создан временный
2558 | // ПолныйПутьКФайлуРазрешенныхОбъектов - полный путь к файлу, содержащему список объектов для захвата.
2559 | // Если указан, то объекты из файла ПолныйПутьКФайлуОтчета будут фильтроваться объектами из ПолныйПутьКФайлуРазрешенныхОбъектов.
2560 | // ПолныйПутьКФайлуНеВошедшихОбъектов - полный путь к файлу, в который будут записаны объекты,
2561 | // присутствующие в файле с историей хранилища, но не присутствующие в файле ПолныйПутьКФайлуРазрешенныхОбъектов.
2562 | //
2563 | // Возвращает:
2564 | // Ложь - Были ошибки;
2565 | // Истина - Файл создан успешно.
2566 | //
2567 | Функция СоздатьФайлДляЗахватаОбъектовИзФайлаИсторииХранилища(
2568 | ПолныйПутьКФайлуОтчета="",
2569 | ПолныйПутьКФайлуСпискаОбъектов="",
2570 | ПолныйПутьКФайлуРазрешенныхОбъектов = ""
2571 | ПолныйПутьКФайлуНеВошедшихОбъектов) Экспорт
2572 |
2573 | // Читаем путь к файлу разрешенных объектов, если не задан
2574 | СписокРазрешенныхОбъектов = Новый Массив;
2575 | СписокНеВошедшихОбъектов = Новый Массив;
2576 | Если ПолныйПутьКФайлуРазрешенныхОбъектов <> "" Тогда
2577 |
2578 | Текст = Новый ТекстовыйДокумент;
2579 | Попытка
2580 | Текст.Прочитать(ПолныйПутьКФайлуРазрешенныхОбъектов, КодировкаТекста.UTF8);
2581 | Исключение
2582 | ТекстОшибки = ОписаниеОшибки();
2583 | Возврат Ложь;
2584 | КонецПопытки;
2585 |
2586 | Для НомерСтроки = 1 По Текст.КоличествоСтрок() Цикл
2587 | Стр = Текст.ПолучитьСтроку(НомерСтроки);
2588 | СписокРазрешенныхОбъектов.Добавить(СокрЛП(Стр));
2589 | КонецЦикла;
2590 |
2591 | КонецЕсли;
2592 |
2593 | // Читаем файл отчета о сравнении
2594 | Если ПолныйПутьКФайлуОтчета = "" Тогда
2595 | ТекстОшибки = "Не верное количество параметров. Не указан путь к файлу отчета с историей хранилища!";
2596 | Возврат Ложь;
2597 | КонецЕсли;
2598 | Текст = Новый ТекстовыйДокумент;
2599 | Попытка
2600 | Текст.Прочитать(ПолныйПутьКФайлуОтчета, КодировкаТекста.UTF8);
2601 | Исключение
2602 | ТекстОшибки = ОписаниеОшибки();
2603 | Возврат Ложь;
2604 | КонецПопытки;
2605 |
2606 | // Создаем структуру объектов из файла сравнения
2607 | СписокОбъектов = Новый Массив;
2608 | Для НомерСтроки = 1 По Текст.КоличествоСтрок() Цикл
2609 |
2610 | Стр = Текст.ПолучитьСтроку(НомерСтроки);
2611 | Если Лев(Стр, 1) = Символы.Таб Тогда
2612 |
2613 | Стр = СокрЛП(Стр);
2614 | Если Лев(Стр, 8) <> "Изменены" Тогда
2615 |
2616 | Если СписокРазрешенныхОбъектов.Количество() = 0 Тогда
2617 | ПомещатьВСписок = Истина;
2618 | ИначеЕсли СписокРазрешенныхОбъектов.Найти(Стр) = Неопределено Тогда
2619 | СписокНеВошедшихОбъектов.Добавить(Стр);
2620 | ПомещатьВСписок = Ложь;
2621 | Иначе
2622 | ПомещатьВСписок = Истина;
2623 | КонецЕсли;
2624 |
2625 | Если ПомещатьВСписок И СписокОбъектов.Найти(Стр) = Неопределено Тогда
2626 | СписокОбъектов.Добавить(Стр);
2627 | КонецЕсли;
2628 |
2629 | КонецЕсли;
2630 |
2631 | КонецЕсли;
2632 |
2633 | КонецЦикла;
2634 |
2635 | Если ПолныйПутьКФайлуНеВошедшихОбъектов <> ""
2636 | И СписокНеВошедшихОбъектов.Количество() > 0 Тогда
2637 |
2638 | Текст = Новый ТекстовыйДокумент;
2639 | Для Каждого Строка Из СписокНеВошедшихОбъектов Цикл
2640 | Текст.ДобавитьСтроку(Строка);
2641 | КонецЦикла;
2642 | Попытка
2643 | Текст.Записать(ПолныйПутьКФайлуНеВошедшихОбъектов, КодировкаТекста.UTF8);
2644 | Исключение
2645 | ТекстОшибки = ОписаниеОшибки();
2646 | Возврат Ложь;
2647 | КонецПопытки;
2648 |
2649 | КонецЕсли;
2650 |
2651 | Если Не СписокОбъектов.Количество() > 0 Тогда
2652 | ТекстОшибки = "Нет элементов для создания файла списка объектов.";
2653 | Возврат Ложь;
2654 | КонецЕсли;
2655 |
2656 | // Создаем файл списка объектов
2657 | Если ПолныйПутьКФайлуСпискаОбъектов = "" Тогда
2658 | ПолныйПутьКФайлуСпискаОбъектов = ПолучитьИмяВременногоФайла(".xml");
2659 | КонецЕсли;
2660 | Запись = Новый ЗаписьXML;
2661 | Запись.ОткрытьФайл(ПолныйПутьКФайлуСпискаОбъектов, "UTF-8");
2662 | Запись.ЗаписатьНачалоЭлемента("Objects");
2663 | Запись.ЗаписатьАтрибут("xmlns", "http://v8.1c.ru/8.3/config/objects");
2664 | Запись.ЗаписатьАтрибут("version", "1.0");
2665 | Если СписокОбъектов.Найти("Configuration") <> Неопределено Тогда
2666 | Запись.ЗаписатьНачалоЭлемента("Configuration");
2667 | Запись.ЗаписатьАтрибут("includeChildObjects", "false");
2668 | Запись.ЗаписатьКонецЭлемента();
2669 | КонецЕсли;
2670 | // Записываем элемент для каждого объекта из массива
2671 | Для каждого Строка Из СписокОбъектов Цикл
2672 | Запись.ЗаписатьНачалоЭлемента("Object");
2673 | Запись.ЗаписатьАтрибут("fullName", Строка);
2674 | Запись.ЗаписатьАтрибут("includeChildObjects", "false");
2675 | Запись.ЗаписатьКонецЭлемента();
2676 | КонецЦикла;
2677 | Запись.ЗаписатьКонецЭлемента();
2678 | Запись.Закрыть();
2679 |
2680 | Возврат Истина;
2681 |
2682 | КонецФункции
2683 |
2684 | // *****************************************************************
2685 | // Создает файл настроек объединения, в котором не выбран ни один объект для объединения.
2686 | // ПолныйПутьКФайлуСпискаОбъектов - путь к текстовому файлу, содержащему список объектов для создания файл
2687 | // ПолныйПутьКФайлуНастроек - путь для сохранения итогового файла
2688 | //
2689 | // Исплоьзуется для обновления только конфигурации поставщика.
2690 | //
2691 | // Возвращает:
2692 | // Неопределено - были ошибки;
2693 | // Путь к файлу списка объектов - Файл создан успешно.
2694 | //
2695 | Функция СоздатьФайлНастроекОбъединения(ПолныйПутьКФайлуСпискаОбъектов, ПолныйПутьКФайлуНастроек) Экспорт
2696 |
2697 | Текст = Новый ТекстовыйДокумент;
2698 | Попытка
2699 | Текст.Прочитать(ПолныйПутьКФайлуСпискаОбъектов, КодировкаТекста.UTF8);
2700 | Исключение
2701 | ТекстОшибки = ОписаниеОшибки();
2702 | Возврат Ложь;
2703 | КонецПопытки;
2704 |
2705 | Запись = Новый ЗаписьXML;
2706 | Попытка
2707 | Запись.ОткрытьФайл(ПолныйПутьКФайлуНастроек, "UTF-8");
2708 | Исключение
2709 | ТекстОшибки = ОписаниеОшибки();
2710 | Возврат Ложь;
2711 | КонецПопытки;
2712 |
2713 | Запись.ЗаписатьНачалоЭлемента("Settings");
2714 | Запись.ЗаписатьАтрибут("xmlns", "http://v8.1c.ru/8.3/config/merge/settings");
2715 | Запись.ЗаписатьАтрибут("xmlns:xs", "http://www.w3.org/2001/XMLSchema");
2716 | Запись.ЗаписатьАтрибут("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
2717 | Запись.ЗаписатьАтрибут("version", "1.1");
2718 |
2719 | Запись.ЗаписатьНачалоЭлемента("MainConfiguration");
2720 | Запись.ЗаписатьКонецЭлемента();
2721 |
2722 | Запись.ЗаписатьНачалоЭлемента("SecondConfiguration");
2723 | Запись.ЗаписатьКонецЭлемента();
2724 |
2725 | Запись.ЗаписатьНачалоЭлемента("Parameters");
2726 | Запись.ЗаписатьКонецЭлемента();
2727 |
2728 | Запись.ЗаписатьНачалоЭлемента("Objects");
2729 |
2730 | Для НомерСтроки = 1 По Текст.КоличествоСтрок() Цикл
2731 | Стр = СокрЛП(Текст.ПолучитьСтроку(НомерСтроки));
2732 | Запись.ЗаписатьНачалоЭлемента("Object");
2733 | Запись.ЗаписатьАтрибут("fullName", Стр);
2734 | Запись.ЗаписатьНачалоЭлемента("ObjectOrder");
2735 | Запись.ЗаписатьАтрибут("GetFromMainConfiguration");
2736 | Запись.ЗаписатьКонецЭлемента();
2737 | Запись.ЗаписатьКонецЭлемента();
2738 | КонецЦикла;
2739 |
2740 | Запись.ЗаписатьКонецЭлемента();
2741 | Запись.Закрыть();
2742 |
2743 | Возврат Истина;
2744 |
2745 | КонецФункции
2746 |
2747 | #КонецОбласти
2748 |
2749 | #Область РИБ
2750 |
2751 | // *****************************************************************
2752 | // Отменяет назначение главного узла РИБ
2753 | //
2754 | Функция ОтменитьНазначениеГлавногоУзлаРИБ() Экспорт
2755 |
2756 | ТекстОшибки = "";
2757 |
2758 | // Проверим ключевые параметры запуска
2759 | Если НЕ ВсеПараметрыЗапускаЗаполненыКорректно() Тогда
2760 | Возврат Ложь;
2761 | КонецЕсли;
2762 |
2763 | Если ПараметрыЗапуска.ТипБазы = "S" Тогда
2764 | СтрокаСоединения = "Srvr='" + ПараметрыЗапуска.АдресКластера + ":"
2765 | + ПараметрыЗапуска.ПортКластера + "'; Ref='" + ПараметрыЗапуска.ИмяБазы + "';";
2766 | Иначе
2767 | СтрокаСоединения = "File='" + ПараметрыЗапуска.ИмяБазы + "';";
2768 | КонецЕсли;
2769 | СтрокаСоединения = СтрокаСоединения + "usr='" + ПараметрыЗапуска.ИмяПользователя
2770 | + "'; pwd='" + ПараметрыЗапуска.ПарольПользователя + "';";
2771 |
2772 | Попытка
2773 |
2774 | // Получаем COMConnector
2775 | Коннектор = Новый COMОбъект("v" + ПараметрыЗапуска.ВерсияПлатформы + ".COMConnector");
2776 | // Устанавливаем соединение с информационной базой
2777 | СоединениеСИБ = Коннектор.Connect(СтрокаСоединения);
2778 |
2779 | // Отменяем назначение главного узла РИБ
2780 | СоединениеСИБ.ПланыОбмена.УстановитьГлавныйУзел(Неопределено);
2781 |
2782 | Исключение
2783 | ТекстОшибки = ОписаниеОшибки();
2784 | Возврат Ложь;
2785 | КонецПопытки;
2786 |
2787 | Возврат Истина;
2788 |
2789 | КонецФункции
2790 |
2791 | #КонецОбласти
2792 |
2793 | // *****************************************************************
2794 | // Сразу при создании инициируем параметры
2795 | ИнициироватьПараметры();
2796 |
2797 |
--------------------------------------------------------------------------------
/ПримерИспользования_TRun1C.os:
--------------------------------------------------------------------------------
1 | // При подключении библиотеки необходиомо указать путь к каталогу TRun1C с библиотекой TRun1C.
2 | // Путь указывается относительно расположения данного файла.
3 | #Использовать "."
4 |
5 | //*****************************************************************
6 | Процедура ПолныйТестВсехПроцедур(Запуск1С, Знач РабочийКаталог = "")
7 |
8 | // Флаг наличия ошибок
9 | БылиОшибки = Ложь;
10 |
11 | // Создадим необходимые файлы
12 | Если РабочийКаталог = "" Тогда
13 | РабочийКаталог = ".\";
14 | КонецЕсли;
15 | РабочийКаталог = ОбъединитьПути(РабочийКаталог,"Test_TRun1C");
16 | СоздатьКаталог(РабочийКаталог);
17 |
18 | // Результат работы в пакетном режиме
19 | ПараметрыЗапуска = Запуск1С.ПараметрыЗапуска;
20 | ПараметрыЗапуска.ФайлДляЗаписиРезультатовРаботыВПакетномРежиме = ОбъединитьПути(РабочийКаталог,Запуск1С.ИмяФайлаПоИмениБазыНаДату("txt")); //Можно не указывать
21 |
22 | Если ПараметрыЗапуска.ТипБазы = "S" Тогда // Серверная база
23 |
24 | // Запустим 1С:Предприятие
25 | Если Запуск1С.ЗапуститьПредприятие() Тогда
26 | Сообщить("ЗапуститьПредприятие: УСПЕШНО");
27 | Иначе
28 | Сообщить("ЗапуститьПредприятие: " + Запуск1С.ТекстОшибки);
29 | БылиОшибки = Истина;
30 | КонецЕсли;
31 | Приостановить(6000);
32 |
33 | // Запустим Конфигуратор
34 | Если Запуск1С.ЗапуститьКонфигуратор() Тогда
35 | Сообщить("ЗапуститьКонфигуратор: УСПЕШНО");
36 | Иначе
37 | Сообщить("ЗапуститьКонфигуратор: " + Запуск1С.ТекстОшибки);
38 | БылиОшибки = Истина;
39 | КонецЕсли;
40 | Приостановить(6000);
41 |
42 | // Получим список сеансов
43 | ТаблицаСеансов = Запуск1С.ПолучитьСписокСеансов();
44 | Если ТаблицаСеансов <> Неопределено Тогда
45 | Сообщить("ПолучитьСписокСеансов: УСПЕШНО");
46 | Для Каждого Сеанс Из ТаблицаСеансов Цикл
47 | Сообщить(" Номер: " + Сеанс.НомерСоединения + ", Время начала: " + Сеанс.ВремяНачала + ", Имя пользователя: " + Сеанс.ИмяПользователя +
48 | ", Имя компьютера: " + Сеанс.ИмяКомпьютера + ", Приложение: " + Сеанс.Приложение);
49 | КонецЦикла;
50 | Иначе
51 | Сообщить("ПолучитьСписокСеансов: " + Запуск1С.ТекстОшибки);
52 | БылиОшибки = Истина;
53 | КонецЕсли;
54 |
55 | // Заблокируем сеансы
56 | Если Запуск1С.УстановитьБлокировкуНачалаСеансов() Тогда
57 | Сообщить("УстановитьБлокировкуНачалаСеансов: УСПЕШНО");
58 | Иначе
59 | Сообщить("УстановитьБлокировкуНачалаСеансов: " + Запуск1С.ТекстОшибки);
60 | БылиОшибки = Истина;
61 | КонецЕсли;
62 |
63 | // Завершим работу пользователей, наш сеанс должен закрыться
64 | Если Запуск1С.ЗавершитьРаботуПользователей() Тогда
65 | Сообщить("ЗавершитьРаботуПользователей: УСПЕШНО");
66 | Иначе
67 | Сообщить("ЗавершитьРаботуПользователей: " + Запуск1С.ТекстОшибки);
68 | БылиОшибки = Истина;
69 | КонецЕсли;
70 |
71 | ВыполнитьСборкуМусора();
72 |
73 | КонецЕсли;
74 |
75 | // Отключимся от хранилища
76 | Если Запуск1С.ОтключитьКонфигурациюОтХранилища() Тогда
77 | Сообщить("ОтключитьКонфигурациюОтХранилища: УСПЕШНО");
78 | Иначе
79 | Сообщить("ОтключитьКонфигурациюОтХранилища: " + Запуск1С.ТекстОшибки);
80 | БылиОшибки = Истина;
81 | КонецЕсли;
82 |
83 | // Выгрузим информационную базу
84 | ПолныйПутьКФайлу = ОбъединитьПути(РабочийКаталог,Запуск1С.ИмяФайлаПоИмениБазыНаДату("dt"));
85 | Если Запуск1С.ВыгрузитьИнформационнуюБазу(ПолныйПутьКФайлу) Тогда
86 | Сообщить("ВыгрузитьИнформационнуюБазу: УСПЕШНО " + " в " + ПолныйПутьКФайлу);
87 | Иначе
88 | Сообщить("ВыгрузитьИнформационнуюБазу: " + Запуск1С.ТекстОшибки);
89 | БылиОшибки = Истина;
90 | КонецЕсли;
91 |
92 | // Загрузим файл в информационную базу
93 | Если Запуск1С.ЗагрузитьИнформационнуюБазу(ПолныйПутьКФайлу) Тогда
94 | Сообщить("ЗагрузитьИнформационнуюБазу: УСПЕШНО " + " из " + ПолныйПутьКФайлу);
95 | Иначе
96 | Сообщить("ЗагрузитьИнформационнуюБазу: " + Запуск1С.ТекстОшибки);
97 | БылиОшибки = Истина;
98 | КонецЕсли;
99 | УдалитьФайлы(ПолныйПутьКФайлу);
100 |
101 | // Сохраним конфигурацию в файл
102 | ПолныйПутьКФайлу = ОбъединитьПути(РабочийКаталог,Запуск1С.ИмяФайлаПоИмениБазыНаДату("cf"));
103 | Если Запуск1С.СохранитьКонфигурациюВФайл(ПолныйПутьКФайлу) Тогда
104 | Сообщить("СохранитьКонфигурациюВФайл: УСПЕШНО " + " в " + ПолныйПутьКФайлу);
105 | Иначе
106 | Сообщить("СохранитьКонфигурациюВФайл: " + Запуск1С.ТекстОшибки);
107 | БылиОшибки = Истина;
108 | КонецЕсли;
109 |
110 | // Загрузим конфигурацию из файла
111 | Если Запуск1С.ЗагрузитьКонфигурациюИзФайла(ПолныйПутьКФайлу) Тогда
112 | Сообщить("ЗагрузитьКонфигурациюИзФайла: УСПЕШНО " + " из " + ПолныйПутьКФайлу);
113 | Иначе
114 | Сообщить("ЗагрузитьКонфигурациюИзФайла: " + Запуск1С.ТекстОшибки);
115 | БылиОшибки = Истина;
116 | КонецЕсли;
117 |
118 | // Сохраним конфигурацию баз данных в файл
119 | Если Запуск1С.СохранитьКонфигурациюБазыДанныхВФайл(ПолныйПутьКФайлу) Тогда
120 | Сообщить("СохранитьКонфигурациюБазыДанныхВФайл: УСПЕШНО " + " в " + ПолныйПутьКФайлу);
121 | Иначе
122 | Сообщить("СохранитьКонфигурациюБазыДанныхВФайл: " + Запуск1С.ТекстОшибки);
123 | БылиОшибки = Истина;
124 | КонецЕсли;
125 |
126 | // Сохраним конфигурацию хранилища в файл
127 | Если Запуск1С.СохранитьКонфигурациюИзХранилищаВФайл(ПолныйПутьКФайлу) Тогда
128 | Сообщить("СохранитьКонфигурациюИзХранилищаВФайл: УСПЕШНО " + " в " + ПолныйПутьКФайлу);
129 | Иначе
130 | Сообщить("СохранитьКонфигурациюИзХранилищаВФайл: " + Запуск1С.ТекстОшибки);
131 | БылиОшибки = Истина;
132 | КонецЕсли;
133 |
134 | // Обновим конфигурацию из хранилища
135 | Если Запуск1С.ОбновитьКонфигурациюИзХранилища() Тогда
136 | Сообщить("ОбновитьКонфигурациюИзХранилища: УСПЕШНО");
137 | Иначе
138 | Сообщить("ОбновитьКонфигурациюИзХранилища: " + Запуск1С.ТекстОшибки);
139 | БылиОшибки = Истина;
140 | КонецЕсли;
141 |
142 | // Обновим конфигурацию базы данных
143 | Если Запуск1С.ОбновитьКонфигурациюБазыДанных() Тогда
144 | Сообщить("ОбновитьКонфигурациюБазыДанных: УСПЕШНО");
145 | Иначе
146 | Сообщить("ОбновитьКонфигурациюБазыДанных: " + Запуск1С.ТекстОшибки);
147 | БылиОшибки = Истина;
148 | КонецЕсли;
149 |
150 | //Проверим, есть ли изменения в основной конфигурации
151 | ЕстьИзменения = Запуск1С.ЕстьИзмененияОсновнойКонфигурации();
152 | Если ЕстьИзменения <> Неопределено Тогда
153 | Сообщить("ЕстьИзмененияОсновнойКонфигурации: УСПЕШНО, Есть изменения: " + ?(ЕстьИзменения,"Да","Нет"));
154 | Иначе
155 | Сообщить("ЕстьИзмененияОсновнойКонфигурации: " + Запуск1С.ТекстОшибки);
156 | БылиОшибки = Истина;
157 | КонецЕсли;
158 |
159 | // Подключимся к хранилищу
160 | Если Запуск1С.ПодключитьКонфигурациюКХранилищу() Тогда
161 | Сообщить("ПодключитьКонфигурациюКХранилищу: УСПЕШНО");
162 | Иначе
163 | Сообщить("ПодключитьКонфигурациюКХранилищу: " + Запуск1С.ТекстОшибки);
164 | БылиОшибки = Истина;
165 | КонецЕсли;
166 |
167 | // Выполним очистку локального кэша хранилища конфигурации
168 | Если Запуск1С.ВыполнитьОчисткуЛокальногоКешаХранилища() Тогда
169 | Сообщить("ВыполнитьОчисткуЛокальногоКешаХранилища: УСПЕШНО");
170 | Иначе
171 | Сообщить("ВыполнитьОчисткуЛокальногоКешаХранилища: " + Запуск1С.ТекстОшибки);
172 | БылиОшибки = Истина;
173 | КонецЕсли;
174 |
175 | // Выполним очистку локальной базы данных хранилища конфигурации
176 | Если Запуск1С.ВыполнитьОчисткуЛокальнойБазыДанныхХранилища() Тогда
177 | Сообщить("ВыполнитьОчисткуЛокальнойБазыДанныхХранилища: УСПЕШНО");
178 | Иначе
179 | Сообщить("ВыполнитьОчисткуЛокальнойБазыДанныхХранилища: " + Запуск1С.ТекстОшибки);
180 | БылиОшибки = Истина;
181 | КонецЕсли;
182 |
183 | // Проверим, есть ли изменения в хранилище конфигураций
184 | ЕстьИзмененияВХранилище = Запуск1С.ЕстьИзмененияВХранилище();
185 | Если ЕстьИзмененияВХранилище <> Неопределено Тогда
186 | Сообщить("ЕстьИзмененияВХранилище: УСПЕШНО, Есть изменения: " + ?(ЕстьИзмененияВХранилище,"Да","Нет"));
187 | Иначе
188 | Сообщить("ЕстьИзмененияВХранилище: " + Запуск1С.ТекстОшибки);
189 | БылиОшибки = Истина;
190 | КонецЕсли;
191 |
192 | Если ПараметрыЗапуска.ТипБазы = "S" Тогда // Серверная база
193 |
194 | // Снимем блокировку пользователей
195 | Если Запуск1С.СнятьБлокировкуНачалаСеансов() Тогда
196 | Сообщить("СнятьБлокировкуНачалаСеансов: УСПЕШНО");
197 | Иначе
198 | Сообщить("СнятьБлокировкуНачалаСеансов: " + Запуск1С.ТекстОшибки);
199 | БылиОшибки = Истина;
200 | КонецЕсли;
201 |
202 | КонецЕсли;
203 |
204 | ВыполнитьСборкуМусора();
205 | УдалитьФайлы(ПолныйПутьКФайлу);
206 | УдалитьФайлы(ПараметрыЗапуска.ФайлДляЗаписиРезультатовРаботыВПакетномРежиме);
207 | УдалитьФайлы(РабочийКаталог);
208 |
209 | // Отчет о работче процедуры
210 | Сообщить("");
211 | Сообщить("-----------------------------------------------");
212 | Сообщить("Результат работы тестирования модуля: " + ?(БылиОшибки,"БЫЛИ ОШИБКИ!","УСПЕШНО."));
213 | Сообщить("-----------------------------------------------");
214 | Сообщить("");
215 |
216 | КонецПроцедуры
217 |
218 |
219 | //*****************************************************************
220 |
221 | // Создадим объект
222 | Запуск1С = Новый ТУправлениеЗапуском1С();
223 |
224 | // Введем параметры
225 | ПараметрыЗапуска = Запуск1С.ПараметрыЗапуска;
226 | ПараметрыЗапуска.ПутьКПлатформе1С = "C:\Program Files (x86)\1cv8\8.3.8.2054\bin\1cv8.exe";
227 | ПараметрыЗапуска.ТипБазы = "S";
228 | ПараметрыЗапуска.ИмяБазы = "TestBase";
229 | ПараметрыЗапуска.АдресКластера = "10.1.1.40";
230 | ПараметрыЗапуска.ПортКластера = "2541";
231 | ПараметрыЗапуска.ПортАгента = "2540";
232 | ПараметрыЗапуска.ИмяПользователя = "Администратор";
233 | ПараметрыЗапуска.ПарольПользователя = "";
234 | ПараметрыЗапуска.ВидныДействияВПакетномРежиме = Ложь; //Можно не указывать
235 | ПараметрыЗапуска.АдресХранилища = "C:\repo\OS_TScripts\_Tests\Repository";
236 | ПараметрыЗапуска.ИмяПользователяХранилища = "admin";
237 | ПараметрыЗапуска.ПарольПользователяХранилища = "1";
238 |
239 | // Запустим тест всех процедур
240 | ПолныйТестВсехПроцедур(Запуск1С);
241 |
242 | // Введем параметры
243 | ПараметрыЗапуска.ТипБазы = "F";
244 | ПараметрыЗапуска.ИмяБазы = "C:\repo\OS_TScripts\_Tests\Base";
245 | ПараметрыЗапуска.ИмяПользователя = "";
246 | ПараметрыЗапуска.ПарольПользователя = "";
247 |
248 | // Запустим тест всех процедур
249 | ПолныйТестВсехПроцедур(Запуск1С);
250 |
251 |
252 |
253 |
254 |
--------------------------------------------------------------------------------