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