-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathTDeploy1C.os
2075 lines (1716 loc) · 123 KB
/
TDeploy1C.os
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
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
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
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
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
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
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
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
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
// ********************************************************************************************
// Автор: Онянов Виталий (Tavalik.ru)
// Описание:
// Выполняет различные сценарии по запуску 1С (и не только)
// Поддерживаемые сценарии:
//
// Общие:
// Wait - Ждать
// RunApp[1|2|3|4|5][NoWaitCompletion] - ЗапуститьПриложение[1|2|3|4|5][НеЖдатьЗавершения]
// WriteStatusToFile - ЗаписатьСтатусВФайл
// Записывает результат выполнения сценария в файл "TDeploy_Status.txt" в каталоге сценария:
// 0 - ошибок не было, 1 - были ошибки
// Сеансы:
// GetListOfSessions - ПолучитьСписокСеансов
// CloseAllSessions - ЗавершитьВсеСеансы
// LockStartSession - УстановитьБлокировкуНачалаСеансов
// UnlockStartSessions - СнятьБлокировкуНачалаСеансов
// LockScheduledJobs - УстановитьБлокировкуРегламентныхЗаданий
// UnlockScheduledJobs - СнятьБлокировкуРегламентныхЗаданий
// Запуск:
// StartEnterprise[ThinClient][TestManager][WithProcessing[1|2|3|4|5]][ClearCache][NoWaitCompletion]
// - ЗапуститьПредприятие[ТонкийКлиент][МенеджерТестирования][СОбработкой[1|2|3|4|5]][ОчиститьКеш][НеЖдатьЗавершения]
// StartDesigner[NoWaitCompletion] - ЗапуститьКонфигуратор[НеЖдатьЗавершения]
// Конфигурация:
// CheckChangesMainCfg - ПроверитьИзмененияОсновнойКонфигурации
// - В случае, если есть изменения, генерируется ошибка
// UpdateDBCfg - ОбновитьКонфигурациюБазыДанных
// DumpCfg - СохранитьКонфигурацию
// LoadCfg - ЗагрузитьКонфигурацию
// MergeCfg - ОбъединитьКонфигурацию
// Расширения:
// LoadExtension[1|2|3|4|5] - ЗагрузитьРасширение[1|2|3|4|5]
// Работа с хранилищем
// CheckChangesInRepository - ПроверитьИзмененияВХранилище
// - В случае, если изменений нет, сценарий прекращается
// ConfigurationRepositoryUpdateCfg - ОбновитьКонфигурациюИзХранилища
// ConfigurationRepositoryLock - ЗахватитьОбъектыИзХранилища
// ConfigurationRepositoryUnLock - ОтменитьЗахватОбъектовИзХранилища
// ConfigurationRepositoryCommit[UnLock] - ПоместитьОбъектыВХранилище[ОтменитьЗахват]
// ConfigurationRepositoryBindCfg - ПодключитьсяКХранилищу
// ConfigurationRepositoryUnbindCfg - ОтключитьсяОтХранилища
// ConfigurationRepositoryDumpCfg - СохранитьКонфигурациюХранилища
// ConfigurationRepositoryReport - ОтчетПоИсторииХранилища
// Файлы:
// DeleteFiles[Cf|dt|Bak|Trn][СurrentBase] - УдалитьФайлы[Cf|dt|Bak|Trn][ТекущейБазы]
// CreateFileForRepositoryLockFromReport - СоздатьФайлДляЗахватаОбъектовПоФайлуИсторииХранилища
// CreateFileForRepositoryLock - СоздатьФайлДляЗахватаОбъектов
// SQL:
// SQLBackup[Full|Differential|Log][CopyOnly] - SQLРезервнаяКопия[Full|Differential|Log][CopyOnly]
// SQLRestore - SQLВосстановитьИзРезервнойКопии
// GIT:
// GitPull[1|2|3|4|5] - ОбновитьИзГитРепозитория[1|2|3|4|5]
//
// BSLLS:NestedStatements-off
// BSLLS:IfElseIfEndsWithElse-off
// ********************************************************************************************
// ПОДКЛЮЧАЕМЫЕ БИБЛИОТЕКИ
#Использовать TLog
#Использовать TRun1C
#Использовать TMSSQL
#Использовать TMail
#Использовать json
// ПЕРЕМЕННЫЕ
Перем Логирование;
Перем КаталогСценария;
// ********************************************************************************************
Процедура Инициализация()
////////////////////////////////////////
// Установим глобальные перменные
УправлениеЭП = Новый ТУправлениеЭлектроннойПочтой();
РежимОтладки = Ложь;
РежимТестирования = Ложь;
РежимЗадания = Ложь;
ИдентификаторЗадания = "TDeploy1C";
КаталогХраненияЛогов = "";
КаталогСценария = ТекущийСценарий().Каталог;
#Область ЧтениеПараметровКоманднойСтроки
МассивФайловНастроек = Новый Массив;
МассивФайловСценариев = Новый Массив;
МассивИБДляОбновления = Новый Массив;
МассивСкриптов = Новый Массив;
Для Сч = 0 По АргументыКоманднойСтроки.Количество() - 1 Цикл
Аргумент = Нрег(СокрЛП(АргументыКоманднойСтроки.Получить(Сч)));
Если Лев(Аргумент, 1) = "-" Тогда
// Специальные параметры
Если Аргумент = "-path" Тогда
Сч = Сч + 1;
КаталогСценария = СокрЛП(АргументыКоманднойСтроки.Получить(Сч));
ИначеЕсли Аргумент = "-settings" Тогда
Сч = Сч + 1;
ПараметрИсточник = СокрЛП(АргументыКоманднойСтроки.Получить(Сч));
МассивФайловНастроек = СтрРазделить(ПараметрИсточник, ";");
ИначеЕсли Аргумент = "-ib" Тогда
Сч = Сч + 1;
ПараметрИсточник = СокрЛП(АргументыКоманднойСтроки.Получить(Сч));
МассивИБДляОбновления = СтрРазделить(ПараметрИсточник, ";");
ИначеЕсли Аргумент = "-script" Тогда
Сч = Сч + 1;
ПараметрИсточник = СокрЛП(АргументыКоманднойСтроки.Получить(Сч));
МассивСкриптов = СтрРазделить(ПараметрИсточник, ";");
ИначеЕсли Аргумент = "-scripts" Тогда
Сч = Сч + 1;
ПараметрИсточник = СокрЛП(АргументыКоманднойСтроки.Получить(Сч));
МассивФайловСценариев = СтрРазделить(ПараметрИсточник, ";");
ИначеЕсли Аргумент = "-logs" Тогда
Сч = Сч + 1;
КаталогХраненияЛогов = СокрЛП(АргументыКоманднойСтроки.Получить(Сч));
ИначеЕсли Аргумент = "-task" Тогда
РежимЗадания = Истина;
Сообщить("--------------------------------------------");
Сообщить("ЗАПУСК В РЕЖИМЕ ВЫПОЛЕНИЯ ЗАДАНИЯ");
Сообщить("--------------------------------------------");
Сч = Сч + 1;
ИдентификаторЗадания = СокрЛП(АргументыКоманднойСтроки.Получить(Сч));
ИначеЕсли Аргумент = "-debug" Тогда
РежимОтладки = Истина;
Сообщить("--------------------------------------------");
Сообщить("ЗАПУСК В РЕЖИМЕ ОТЛАДКИ");
Сообщить("--------------------------------------------");
ИначеЕсли Аргумент = "-testsettings" Тогда
РежимТестирования = Истина;
Сообщить("--------------------------------------------");
Сообщить("ЗАПУСК В РЕЖИМЕ ТЕСТИРОВАНИЯ НАСТРОЕК");
Сообщить("--------------------------------------------");
Иначе
Сообщить("Неизвестный параметр: " + Аргумент);
КонецЕсли;
КонецЕсли;
КонецЦикла;
#КонецОбласти
#Область НастройкиЛогирования
Если КаталогХраненияЛогов = "" Тогда
КаталогХраненияЛогов = ОбъединитьПути(КаталогСценария, "_Logs\");
КонецЕсли;
Логирование = Новый ТУправлениеЛогированием(); // TLog
Логирование.ДатаВремяВКаждойСтроке = Истина;
Логирование.ВыводитьСообщенияПриЗаписи = Истина;
Логирование.СоздатьФайлЛога(ИдентификаторЗадания, КаталогХраненияЛогов);
#КонецОбласти
#Область СозданиеКонфигурационныхФайлов
// Если файл с настройками не был передан в параметрах, найдем его в каталоге
ЗавершитьРаботу = 0;
Если МассивФайловНастроек.Количество() = 0 Тогда
// Попробуем найти файл настроек в текущем каталоге
МассивФайлов = НайтиФайлы(КаталогСценария, "TDeploy1C_Settings*.json");
Если МассивФайлов.Количество() = 0 Тогда
Если СоздатьШаблонФайлаНастроек(ОбъединитьПути(КаталогСценария, "TDeploy1C_Settings.json")) Тогда
Сообщить("Создан шаблон файла настроек. Заполните файл и перезапустите программу.");
ЗавершитьРаботу = 1;
Иначе
ЗавершитьРаботу = 2;
КонецЕсли;
Иначе
Для Каждого Файл Из МассивФайлов Цикл
МассивФайловНастроек.Добавить(Файл.ПолноеИмя);
КонецЦикла
КонецЕсли;
КонецЕсли;
// Если файл с скриптами не был передан в параметрах, найдем его в каталоге
Если МассивСкриптов.Количество() = 0
И МассивФайловСценариев.Количество() = 0 Тогда
// Попробуем найти файл сценариев в текущем каталоге
ПутьКФайлу = ОбъединитьПути(КаталогСценария, "TDeploy1C_Scripts.json");
Файл = Новый Файл(ПутьКФайлу);
Если Не файл.Существует() Тогда
Если СоздатьШаблонФайлаСкриптов(ПутьКФайлу) Тогда
Сообщить("Создан шаблон файла скриптов. Заполните файл и перезапустите программу.");
ЗавершитьРаботу = 1;
Иначе
ЗавершитьРаботу = 2;
КонецЕсли;
КонецЕсли;
МассивФайловСценариев.Добавить(ПутьКФайлу);
КонецЕсли;
Если ЗавершитьРаботу = 1 Тогда
ЗавершитьРаботуСПаузой();
ИначеЕсли ЗавершитьРаботу = 2 Тогда
ЗавершитьРаботу(1);
КонецЕсли;
#КонецОбласти
#Область ФормированиеТаблицыНастроек
// Заполняем список обновляемых баз
ТаблицаБазДанных = Новый ТаблицаЗначений;
ТаблицаБазДанных.Колонки.Добавить("Имя");
ТаблицаБазДанных.Колонки.Добавить("Синоним");
ТаблицаБазДанных.Колонки.Добавить("ПутьКПлатформе1С");
ТаблицаБазДанных.Колонки.Добавить("ПараметрыЗапускаПлатформы1С");
ТаблицаБазДанных.Колонки.Добавить("ТипБазы");
ТаблицаБазДанных.Колонки.Добавить("ВерсияCOMConnector");
ТаблицаБазДанных.Колонки.Добавить("ИмяБазы");
ТаблицаБазДанных.Колонки.Добавить("АдресКластера");
ТаблицаБазДанных.Колонки.Добавить("ПортКластера");
ТаблицаБазДанных.Колонки.Добавить("ПортАгента");
ТаблицаБазДанных.Колонки.Добавить("АдресСервераАдминистрирования");
ТаблицаБазДанных.Колонки.Добавить("СообщениеПриБлокировке");
ТаблицаБазДанных.Колонки.Добавить("МинутОжиданияЗавершенияСеансов");
ТаблицаБазДанных.Колонки.Добавить("ИмяПользователяАдминистратораКластера");
ТаблицаБазДанных.Колонки.Добавить("ПарольПользователяАдминистратораКластера");
ТаблицаБазДанных.Колонки.Добавить("ИмяПользователя");
ТаблицаБазДанных.Колонки.Добавить("ПарольПользователя");
ТаблицаБазДанных.Колонки.Добавить("АдресХранилища");
ТаблицаБазДанных.Колонки.Добавить("ИмяПользователяХранилища");
ТаблицаБазДанных.Колонки.Добавить("ПарольПользователяХранилища");
ТаблицаБазДанных.Колонки.Добавить("КомментарийВХранилище");
ТаблицаБазДанных.Колонки.Добавить("GitПутьКИсполняемомуФайлу");
ТаблицаБазДанных.Колонки.Добавить("GitЛокальныйРепозиторий");
ТаблицаБазДанных.Колонки.Добавить("GitУдаленныйРепозиторий");
ТаблицаБазДанных.Колонки.Добавить("GitИмяВетки");
ТаблицаБазДанных.Колонки.Добавить("РабочийКаталог");
ТаблицаБазДанных.Колонки.Добавить("ПутьКОбработке");
ТаблицаБазДанных.Колонки.Добавить("ПараметрыЗапуска");
ТаблицаБазДанных.Колонки.Добавить("ИмяРасширения");
ТаблицаБазДанных.Колонки.Добавить("ПутьКРасширению");
ТаблицаБазДанных.Колонки.Добавить("ПутьКПриложению");
Для Сч = 1 По 5 Цикл
ТаблицаБазДанных.Колонки.Добавить("ПутьКОбработке" + Сч);
ТаблицаБазДанных.Колонки.Добавить("ПараметрыЗапуска" + Сч);
ТаблицаБазДанных.Колонки.Добавить("ИмяРасширения" + Сч);
ТаблицаБазДанных.Колонки.Добавить("ПутьКРасширению" + Сч);
ТаблицаБазДанных.Колонки.Добавить("ПутьКПриложению" + Сч);
ТаблицаБазДанных.Колонки.Добавить("GitПутьКИсполняемомуФайлу" + Сч);
ТаблицаБазДанных.Колонки.Добавить("GitЛокальныйРепозиторий" + Сч);
ТаблицаБазДанных.Колонки.Добавить("GitУдаленныйРепозиторий" + Сч);
ТаблицаБазДанных.Колонки.Добавить("GitИмяВетки" + Сч);
КонецЦикла;
ТаблицаБазДанных.Колонки.Добавить("АдресСервераSQL");
ТаблицаБазДанных.Колонки.Добавить("ИмяПользователяSQL");
ТаблицаБазДанных.Колонки.Добавить("ПарольПользователяSQL");
ТаблицаБазДанных.Колонки.Добавить("ИмяБазыДанныхSQL");
ТаблицаБазДанных.Колонки.Добавить("AllureПутьКИсполняемомуФайлу");
ТаблицаБазДанных.Колонки.Добавить("AllureКаталогИсточник");
ТаблицаБазДанных.Колонки.Добавить("AllureКаталогОтчетов");
// Обработаем файлы настроек
Сч = 0;
Пока Истина Цикл
Если Сч = МассивФайловНастроек.Количество() Тогда
Прервать;
КонецЕсли;
ПутьКФайлу = МассивФайловНастроек.Получить(Сч);
Файл = Новый Файл(ПутьКФайлу);
Если файл.Существует() Тогда
// Сформируем таблицы
ТаблицаОбщихНастроек = ТаблицаБазДанных.Скопировать();
ТаблицаТекущихНастроек = ТаблицаБазДанных.Скопировать();
// Получим текст файла
ЧтениеТекста = Новый ЧтениеТекста(ПутьКФайлу, КодировкаТекста.UTF8);
ТекстФайла = ЧтениеТекста.Прочитать();
ЧтениеТекста.Закрыть();
Сообщить("Прочитан файл настроек: " + Файл.ПолноеИмя);
Попытка
ЧтениеJSON = Новый ПарсерJSON;
ПараметрыИзФайла = ЧтениеJSON.ПрочитатьJSON(ТекстФайла, , , Истина);
СтруктураДанных = Новый Структура;
СтруктураДанных.Вставить("общие", ТаблицаОбщихНастроек);
СтруктураДанных.Вставить("списокиб", ТаблицаТекущихНастроек);
СтруктураДанных.Вставить("настройкиsmtp", УправлениеЭП.УчетнаяЗаписьЭП);
СтруктураДанных.Вставить("получателисообщений", УправлениеЭП.СтруктураСообщения);
ПрочитатьПараметрыРекурсивно(ПараметрыИзФайла, СтруктураДанных);
Исключение
Сообщить(ОписаниеОшибки());
ЗавершитьРаботу(1);
КонецПопытки;
// Сформируем итоговую таблицу настроек
Для Каждого СтрокаТекущихНастроек Из ТаблицаТекущихНастроек Цикл
СтрокаБД = ТаблицаБазДанных.Добавить();
Для Каждого Колонка Из ТаблицаТекущихНастроек.Колонки Цикл
ИмяКолонки = Колонка.Имя;
Значение = СтрокаТекущихНастроек[ИмяКолонки];
// Заполним из общих настроек
Если Не ЗначениеЗаполнено(Значение) Тогда
Для Каждого СтрокаОбщихНастроек Из ТаблицаОбщихНастроек Цикл
Значение = СтрокаОбщихНастроек[ИмяКолонки];
КонецЦикла;
Если ИмяКолонки = "Синоним" Тогда
Значение = СтрокаТекущихНастроек.Имя;
КонецЕсли;
Если ИмяКолонки = "ИмяБазы" Тогда
Значение = СтрокаТекущихНастроек.Имя;
КонецЕсли;
Если ИмяКолонки = "ИмяБазыДанныхSQL" Тогда
Значение = СтрокаТекущихНастроек.Имя;
КонецЕсли;
КонецЕсли;
// Обработаем специальные параметры
Если НРег(Значение) = "&пустоезначение" ИЛИ НРег(Значение) = "&emptyvalue" Тогда
Значение = "";
КонецЕсли;
СтрокаБД[ИмяКолонки] = Значение;
КонецЦикла;
КонецЦикла;
Сч = Сч + 1;
Иначе
Сообщить("Не найден файл настроек по пути: " + ПутьКФайлу);
МассивФайловНастроек.Удалить(Сч);
КонецЕсли;
КонецЦикла;
// Проверим, все ли заполнено
Если ТаблицаБазДанных.Количество() = 0 Тогда
Логирование.ЗаписатьСтрокуЛога("Не найдены ИБ для выполнения сценария!");
Возврат;
КонецЕсли;
#КонецОбласти
#Область ФормированиеТаблицыСценариев
ТаблицаСценариев = Новый ТаблицаЗначений;
ТаблицаСценариев.Колонки.Добавить("СписокИБ");
ТаблицаСценариев.Колонки.Добавить("Сценарий");
// Обработаем файлы сценариев
Сч = 0;
Пока Истина Цикл
Если Сч = МассивФайловСценариев.Количество() Тогда
Прервать;
КонецЕсли;
ПутьКФайлу = МассивФайловСценариев.Получить(Сч);
Файл = Новый Файл(ПутьКФайлу);
Если Не Файл.Существует() Тогда
Сообщить("Не найден файл сценария по пути: " + ПутьКФайлу);
ПутьКФайлу = ОбъединитьПути(КаталогСценария, ПутьКФайлу);
КонецЕсли;
Файл = Новый Файл(ПутьКФайлу);
Если Файл.Существует() Тогда
// Получим текст файла
ЧтениеТекста = Новый ЧтениеТекста(ПутьКФайлу, КодировкаТекста.UTF8);
ТекстФайла = ЧтениеТекста.Прочитать();
ЧтениеТекста.Закрыть();
Сообщить("Прочитан файл сценария: " + Файл.ПолноеИмя);
Попытка
ЧтениеJSON = Новый ПарсерJSON;
ПараметрыИзФайла = ЧтениеJSON.ПрочитатьJSON(ТекстФайла, , , Истина);
СтруктураДанных = Новый Структура;
СтруктураДанных.Вставить("сценарии", ТаблицаСценариев);
ПрочитатьПараметрыРекурсивно(ПараметрыИзФайла, СтруктураДанных);
Исключение
Сообщить(ОписаниеОшибки());
ЗавершитьРаботу(1);
КонецПопытки;
Сч = Сч + 1;
Иначе
Сообщить("Не найден файл сценария по пути: " + ПутьКФайлу);
МассивФайловСценариев.Удалить(Сч);
КонецЕсли;
КонецЦикла;
// Добавим базы и параметры запуска из строки запуска
Если МассивСкриптов.Количество() > 0 Тогда
СтрокаСценария = ТаблицаСценариев.Добавить();
СтрокаСценария.СписокИБ = Новый Массив;
СтрокаСценария.Сценарий = МассивСкриптов;
КонецЕсли;
Если МассивИБДляОбновления.Количество() > 0 Тогда
Для Каждого СтрокаСценария Из ТаблицаСценариев Цикл
Если СтрокаСценария.СписокИБ.Количество() = 0 Тогда
СтрокаСценария.СписокИБ = МассивИБДляОбновления;
КонецЕсли;
КонецЦикла;
КонецЕсли;
// Проверим, все ли заполнено
Если ТаблицаСценариев.Количество() = 0 Тогда
Логирование.ЗаписатьСтрокуЛога("Не найдены сценарии для выполнения!");
Возврат;
КонецЕсли;
#КонецОбласти
#Область ВыполнениеСценариев
////////////////////////////////////////
// Если режим тестирования - завершить работу
Сообщить("--------------------------------------------");
Если РежимТестирования Тогда
// Тестирование
БылиОшибки = ВыполнитьТестНастроек(ТаблицаБазДанных);
Иначе
// Выведем итоговые настройки для режима отладки
Если РежимОтладки Тогда
Сообщить("Прочитаны настройки:");
Для Каждого СтрокаБД Из ТаблицаБазДанных Цикл
Сообщить("ИБ : " + СтрокаБД.Имя);
Для Каждого Колонка Из ТаблицаБазДанных.Колонки Цикл
ИмяКолонки = Колонка.Имя;
Сообщить(" " + ИмяКолонки + " : " + СтрокаБД[ИмяКолонки]);
КонецЦикла;
КонецЦикла;
Сообщить("Выполняются сценарии:");
Для Каждого СтрокаСценария Из ТаблицаСценариев Цикл
Сообщить("Сценарий № : " + (ТаблицаСценариев.Индекс(СтрокаСценария) + 1));
Сообщить(" Список ИБ : ");
Для Каждого ТекЭлемент Из СтрокаСценария.СписокИБ Цикл
Сообщить(" - " + ТекЭлемент);
КонецЦикла;
Сообщить(" Сценарий : ");
Для Каждого ТекЭлемент Из СтрокаСценария.Сценарий Цикл
Сообщить(" - " + ТекЭлемент);
КонецЦикла;
КонецЦикла;
КонецЕсли;
// Заполним скрипты в Таблице Информационных баз
БылиОшибки = ВыполнитьОперацииПоСписку(
ТаблицаБазДанных,
ТаблицаСценариев,
РежимЗадания,
ИдентификаторЗадания,
РежимОтладки);
Если РежимЗадания Тогда
// Отправляем эклектронное сообщение с файлом лога во вложении
ОтправитьУведомлениеОператору(УправлениеЭП, БылиОшибки, ИдентификаторЗадания);
Иначе
// Ожидаем ответа администратора
ЗавершитьРаботуСПаузой();
КонецЕсли;
КонецЕсли;
#КонецОбласти
КонецПроцедуры
// ********************************************************************************************
Процедура ПрочитатьПараметрыРекурсивно(Параметры, Данные, СтруктураЗначений = "")
Если ТипЗнч(Параметры) = Тип("Структура") Тогда
Для Каждого Параметр Из Параметры Цикл
Ключ = НРег(СокрЛП(Параметр.Ключ));
Значение = Параметр.Значение;
Если ТипЗнч(Значение) = Тип("Структура")
Или ТипЗнч(Значение) = Тип("Соответствие") Тогда
Если Данные.Свойство(Ключ) Тогда
СтруктураЗначений = Данные[Ключ];
Если ТипЗнч(СтруктураЗначений) = Тип("ТаблицаЗначений")
Или ТипЗнч(СтруктураЗначений) = Тип("СписокЗначений") Тогда
СтруктураЗначений = СтруктураЗначений.Добавить();
КонецЕсли;
КонецЕсли;
ПрочитатьПараметрыРекурсивно(Значение, Данные, СтруктураЗначений);
ИначеЕсли ТипЗнч(Значение) = Тип("Массив") Тогда
Для Каждого ЭлементМассива Из Значение Цикл
Если Данные.Свойство(Ключ) Тогда
СтруктураЗначений = Данные[Ключ];
Если ТипЗнч(СтруктураЗначений) = Тип("ТаблицаЗначений")
Или ТипЗнч(СтруктураЗначений) = Тип("СписокЗначений") Тогда
СтруктураЗначений = СтруктураЗначений.Добавить();
КонецЕсли;
Если Ключ = "сценарии" Тогда
СтруктураЗначений.СписокИБ = Новый Массив;
Данные.Вставить("списокиб", СтруктураЗначений.СписокИБ);
СтруктураЗначений.Сценарий = Новый Массив;
Данные.Вставить("сценарий", СтруктураЗначений.Сценарий);
КонецЕсли;
КонецЕсли;
ПрочитатьПараметрыРекурсивно(ЭлементМассива, Данные, СтруктураЗначений);
КонецЦикла;
Иначе
Если СтруктураЗначений = "" Тогда
Сообщить("Неверные параметры файла");
ИначеЕсли ТипЗнч(СтруктураЗначений) = Тип("Массив") Тогда
СтруктураЗначений.Добавить(Параметр.Значение);
Иначе
СтруктураЗначений[Параметр.Ключ] = Параметр.Значение;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Иначе
Если СтруктураЗначений = "" Тогда
Сообщить("Неверные параметры файла");
ИначеЕсли ТипЗнч(СтруктураЗначений) = Тип("Массив") Тогда
СтруктураЗначений.Добавить(Параметры);
Иначе
СтруктураЗначений[Параметр.Ключ] = Параметры;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
// ********************************************************************************************
Функция СоздатьШаблонФайлаНастроек(ПУтьКФайлу)
Попытка
ЗаписьТекста = Новый ЗаписьТекста();
ЗаписьТекста.Открыть(ПУтьКФайлу, КодировкаТекста.UTF8);
ЗаписьТекста.ЗаписатьСтроку("
| {
| ""Общие"":
| {
| ""ПутьКПлатформе1С"" : ""C:\\Program Files\\1cv8\\8.3.X.XXXX\\bin\\1cv8.exe"",
| ""ТипБазы"" : ""S"",
| ""ВерсияCOMConnector"" : ""83"",
| ""АдресКластера"" : """",
| ""ПортКластера"" : ""1541"",
| ""ПортАгента"" : ""1540"",
| ""АдресСервераАдминистрирования"" ""localhost:1545""
| ""СообщениеПриБлокировке"" : ""Информационная база заблокирована для обновления"",
| ""МинутОжиданияЗавершенияСеансов"" : ""2"",
| ""ИмяПользователяАдминистратораКластера"" : """",
| ""ПарольПользователяАдминистратораКластера"" : """",
| ""РабочийКаталог"" : """",
| ""ПутьКОбработке"" : """",
| ""ИмяРасширения"" : """",
| ""ПутьКРасширению"" : """",
| ""АдресСервераSQL"" : """",
| ""ИмяПользователяSQL"" : """",
| ""ПарольПользователяSQL"" : """",
| },
| ""СписокИБ"":
| [
| {
| ""Имя"" : ""Base_Name"",
| ""Синоним"" : ""Base Name"",
| ""ИмяБазы"" : ""Base_Name"",
| ""ИмяПользователя"" : """",
| ""ПарольПользователя"" : """",
| ""АдресХранилища"" : """",
| ""ИмяПользователяХранилища"" : """",
| ""ПарольПользователяХранилища"" : """",
| ""КомментарийВХранилище"" : """",
| ""ИмяБазыДанныхSQL"" : """"
| }
| ],
| ""ЭлектроннаяПочта"":
| {
| ""НастройкиSMTP"":
| {
| ""АдресSMTP"" : ""smtp.ya.ru"",
| ""ПортSMTP"" : 465,
| ""ПользовательSMTP"" : ""ВашаПочта@yandex.ru"",
| ""ПарольSMTP"" : ""ВашПароль"",
| ""ИспользоватьSSL"" : true
| },
| ""ПолучателиСообщений"":
| {
| ""АдресЭлектроннойПочтыПолучателя"" : ""ВашаПочта[email protected]; ВашаПочта[email protected]""
| }
| }
| }
|");
ЗаписьТекста.Закрыть();
Исключение
Сообщить(ОписаниеОшибки());
Возврат Ложь;
КонецПопытки;
Возврат Истина;
КонецФункции
// ********************************************************************************************
Функция СоздатьШаблонФайлаСкриптов(ПУтьКФайлу)
Попытка
ЗаписьТекста = Новый ЗаписьТекста();
ЗаписьТекста.Открыть(ПУтьКФайлу, КодировкаТекста.UTF8);
ЗаписьТекста.ЗаписатьСтроку("
|{
| ""Сценарии"":
| [
| {
| ""СписокИБ"" :
| [
| ""Base_Name1"",
| ""Base_Name2""
| ],
| ""Сценарий"":
| [
| ""ПолучитьСписокСеансов"",
| ""УстановитьБлокировкуНачалаСеансов"",
| ""Ждать"",
| ""ЗавершитьВсеСеансы"",
| ""ОбновитьКонфигурациюИзХранилища"",
| ""ОбновитьКонфигурациюБазыДанных"",
| ""ПроверитьИзмененияОсновнойКонфигурации"",
| ""СнятьБлокировкуНачалаСеансов"",
| ""УдалитьФайлыКонфигураций"",
| ""СохранитьКонфигурациюВФайл""
| ]
| },
| {
| ""СписокИБ"":
| [
| ""Base_Name1""
| ],
| ""Сценарий"":
| [
| ""ЗапуститьПредприятиеСОбработкой""
| ]
| }
| ]
|}
|");
ЗаписьТекста.Закрыть();
Исключение
Сообщить(ОписаниеОшибки());
Возврат Ложь;
КонецПопытки;
Возврат Истина;
КонецФункции
// ********************************************************************************************
Функция ВыполнитьТестНастроек(ТаблицаБазДанныхИтог)
Запуск1С = Новый ТУправлениеЗапуском1С();
БылиОшибки = Ложь;
ЕстьДоступККонсолиКластера = Ложь;
// Начало выполнения обработки
Логирование.ЗаписатьСтрокуЛога("Начало выполнения тестирования настроек");
// Цикл по всем базам
Для Каждого СтрокаОбновления Из ТаблицаБазДанныхИтог Цикл
БылиОшибкиТекБД = Ложь;
Логирование.ЗаписатьСтрокуЛога("-------------------------------------------------------");
Логирование.ЗаписатьСтрокуЛога("Тест информационной базы: """ + СтрокаОбновления.Имя + """", 1);
// Параметры базы
ЗаполнитьЗначенияСвойств(Запуск1С.ПараметрыЗапуска, СтрокаОбновления);
// Получим список активных соединений БД
// Если список сеансов получен, считаем, что настройки базы заданы корректно
Логирование.ЗаписатьСтрокуЛога("Получить список сеансов БД: ", 2);
ТаблицаСеансов = Запуск1С.ПолучитьСписокСеансов();
Если ТаблицаСеансов <> Неопределено Тогда
Логирование.ЗаписатьСтрокуЛога("- УСПЕШНО, количество сеансов: " + ТаблицаСеансов.Количество(), 3);
Для Каждого Сеанс ИЗ ТаблицаСеансов Цикл
Логирование.ЗаписатьСтрокуЛога(Сеанс.Приложение + ", " + Сеанс.ИмяПользователя + ", " + Сеанс.ИмяКомпьютера, 5);
КонецЦикла;
Иначе
Логирование.ЗаписатьСтрокуЛога("- ОШИБКА: " + Запуск1С.ТекстОшибки, 3);
БылиОшибкиТекБД = Истина;
КонецЕсли;
// Выполним очистку локального кэша хранилища конфигурации
// Если получилось очистить, считаем, что настройки хранилища и настройки 1С:Предприятие заданы корректно
Логирование.ЗаписатьСтрокуЛога("Очистить локальный кэш хранилища конфигурации: ", 2);
Если НЕ БылиОшибкиТекБД И ЗначениеЗаполнено(Запуск1С.ПараметрыЗапуска.АдресХранилища) Тогда
Если Запуск1С.ВыполнитьОчисткуЛокальногоКешаХранилища() Тогда
Логирование.ЗаписатьСтрокуЛога("- УСПЕШНО", 3);
Иначе
Логирование.ЗаписатьСтрокуЛога("- ОШИБКА: " + Запуск1С.ТекстОшибки, 3);
БылиОшибкиТекБД = Истина;
КонецЕсли;
КонецЕсли;
Логирование.ЗаписатьСтрокуЛога("Тест информационной базы " + СтрокаОбновления.Имя
+ " выполнен: " + ?(БылиОшибкиТекБД, "С ОШИБКАМИ!", "УСПЕШНО!"), 1);
Логирование.ЗаписатьСтрокуЛога("-------------------------------------------------------");
БылиОшибки = БылиОшибки ИЛИ БылиОшибкиТекБД;
КонецЦикла;
Логирование.ЗаписатьСтрокуЛога("Тестирование настроек выполнено " + ?(БылиОшибкиТекБД, "С ОШИБКАМИ!", "УСПЕШНО!"));
Возврат БылиОшибки;
КонецФункции
// ********************************************************************************************
Процедура ЗавершитьРаботуСПаузой()
Сообщить("Для продолжения нажмите любую клавишу...");
Консоль = Новый Консоль();
ОбщееОжидание = 0;
Пока Не Консоль.НажатаКлавиша Цикл
Приостановить(100);
КонецЦикла;
ЗавершитьРаботу(1);
КонецПроцедуры
// ********************************************************************************************
Процедура ОтправитьУведомлениеОператору(УправлениеЭП, БылиОшибки, ИдентификаторЗадания)
Если ЗначениеЗаполнено(УправлениеЭП.УчетнаяЗаписьЭП.АдресSMTP) Тогда
Сообщить("--------------------------------------------");
Логирование.УвеличитьУровень();
СИ = Новый СистемнаяИнформация();
СтруктураСообщения = УправлениеЭП.СтруктураСообщения;
Если БылиОшибки Тогда
СтруктураСообщения.ТемаСообщения = "[" + ИдентификаторЗадания + " - ОШИБКА ВЫПОЛНЕНИЯ]";
СтруктураСообщения.ТекстСообщения = "ВНИМАНИЕ! Задание """ + ИдентификаторЗадания
+ """ на сервере " + СИ.ИмяКомпьютера + " завершено с ошибками";
Иначе
СтруктураСообщения.ТемаСообщения = "[" + ИдентификаторЗадания + " - УСПЕШНОЕ ВЫПОЛНЕНИЕ]";
СтруктураСообщения.ТекстСообщения = "Успешное выполнение задания """ + ИдентификаторЗадания
+ """ на сервере " + СИ.ИмяКомпьютера;
КонецЕсли;
// Часть имеющегося лога добавим в письмо
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("txt");
КопироватьФайл(Логирование.ИмяФайлаЛога, ИмяВременногоФайла);
СтруктураСообщения.Вложения = ИмяВременногоФайла;
// Отправим сообщение
Логирование.ЗаписатьСтрокуЛога("Отправить электронное сообщение: ");
Если УправлениеЭП.ОтправитьСообщение() Тогда
Логирование.ЗаписатьСтрокуЛога("- УСПЕШНО. Адреса: " + СтруктураСообщения.АдресЭлектроннойПочтыПолучателя, 1);
Иначе
Логирование.ЗаписатьСтрокуЛога("- ОШИБКА: " + УправлениеЭП.ТекстОшибки, 1);
БылиОшибки = Истина;
КонецЕсли;
УдалитьФайлы(ИмяВременногоФайла);
Логирование.УменьшитьУровень();
КонецЕсли;
КонецПроцедуры
// ********************************************************************************************
Функция ВыполнитьОперацииПоСписку(ТаблицаБазДанных, ТаблицаСценариев, РежимЗадания = Ложь, ИдентификаторЗадания = "", РежимОтладки = Ложь)
Запуск1С = Новый ТУправлениеЗапуском1С();
Запуск1С.РежимОтладки = РежимОтладки;
РаботаСSQL = Новый УправлениеMSSQL();
РаботаСSQL.РежимОтладки = РежимОтладки;
БылиОшибки = Ложь;
Логирование.ЗаписатьСтрокуЛога("Начало выполнения операций с информационными базами по списку");
// Цикл по базам для обновления
Для Каждого СтрокаСценария Из ТаблицаСценариев Цикл
Для Каждого ТекущяИБ Из СтрокаСценария.СписокИБ Цикл
СтрокаОбновления = ТаблицаБазДанных.Найти(ТекущяИБ, "Имя");
Если СтрокаОбновления = Неопределено Тогда
Логирование.ЗаписатьСтрокуЛога("В файле настроек не найдена ИБ с именем """ + ТекущяИБ + """ ...", 1);
Продолжить;
КонецЕсли;
БылиОшибкиТекБД = Ложь;
ПрекратитьВыполнениеСценария = Ложь;
Логирование.ЗаписатьСтрокуЛога("-------------------------------------------------------");
Логирование.ЗаписатьСтрокуЛога("Операции над ИБ """ + СтрокаОбновления.Имя + """ ...", 1);
// Параметры базы
ЗаполнитьЗначенияСвойств(Запуск1С.ПараметрыЗапуска, СтрокаОбновления);
ЗаполнитьЗначенияСвойств(РаботаСSQL.ПараметрыПодключения, СтрокаОбновления);
Для Каждого Скрипт Из СтрокаСценария.Сценарий Цикл
Скрипт = НРег(СокрЛП(Скрипт));
// Выпоняются всегда, даже если были ошибки
#Область Общие
// Ждать - Подождем определенное количество минут
Если Скрипт = НРег("Wait")
Или Скрипт = НРег("Ждать") Тогда
Логирование.ЗаписатьСтрокуЛога("Ожидание: " + СтрокаОбновления.МинутОжиданияЗавершенияСеансов + " мин.", 2);
Приостановить(СтрокаОбновления.МинутОжиданияЗавершенияСеансов * 60000);
КонецЕсли;
// ЗапуститьПриложение - Запустить произвольное приложение
Если Лев(Скрипт, 6) = НРег("RunApp")
Или Лев(Скрипт, 19) = НРег("ЗапуститьПриложение") Тогда
НомерПриложения = "";
Для Сч = 1 По 5 Цикл
Если Лев(Скрипт, 7) = НРег("RunApp" + Сч)
Или Лев(Скрипт, 20) = НРег("ЗапуститьПриложение" + Сч) Тогда
НомерПриложения = Сч;
Прервать;
КонецЕсли;
КонецЦикла;
ПутьКПриложению = СтрокаОбновления["ПутьКПриложению" + НомерПриложения];
Логирование.ЗаписатьСтрокуЛога("Запускаем приложение: " + ПутьКПриложению, 2);
Если ПустаяСтрока(ПутьКПриложению) Тогда
Логирование.ЗаписатьСтрокуЛога("- ОШИБКА: Не задан путь к приложению №" + НомерПриложения, 3);
БылиОшибкиТекБД = Истина;
КонецЕсли;
Если ЗначениеЗаполнено(СтрокаОбновления.РабочийКаталог) Тогда
РабочийКаталог = СтрокаОбновления.РабочийКаталог;
Иначе
РабочийКаталог = КаталогСценария;
КонецЕсли;
Если СтрНайти(Скрипт, "NoWaitCompletion") > 0
Или СтрНайти(Скрипт, "НеЖдатьЗавершения") > 0 Тогда
ЖдатьЗавершения = Ложь;
Иначе
ЖдатьЗавершения = Истина;
КонецЕсли;
Если Не БылиОшибкиТекБД Тогда
Попытка
КодВозврата = 0;
ЗапуститьПриложение(ПутьКПриложению, РабочийКаталог, ЖдатьЗавершения, КодВозврата);
Логирование.ЗаписатьСтрокуЛога("- УСПЕШНО", 3);
Исключение
Логирование.ЗаписатьСтрокуЛога("- ОШИБКА, код возврата: " + КодВозврата, 3);
БылиОшибкиТекБД = Истина;
КонецПопытки;
КонецЕсли;
КонецЕсли;
// ЗаписатьСтатусВФайл - Запись статуса в файл
Если Скрипт = НРег("WriteStatusToFile")
Или Скрипт = НРег("ЗаписатьСтатусВФайл") Тогда
ИмяФайла = КаталогСценария + "\TDeploy_Status.txt";
Логирование.ЗаписатьСтрокуЛога("Запишем статус """ + БылиОшибки + """ в файл: " + ИмяФайла, 2);
Попытка
ТекстовыйДокумент = Новый ТекстовыйДокумент();
ТекстовыйДокумент.ДобавитьСтроку(?(БылиОшибки,"1","0"));
ТекстовыйДокумент.Записать(ИмяФайла);
Логирование.ЗаписатьСтрокуЛога("- УСПЕШНО", 3);
Исключение
ТекстОшибки = ОписаниеОшибки();
Логирование.ЗаписатьСтрокуЛога("- ОШИБКА, причина: " + ТекстОшибки, 3);
БылиОшибкиТекБД = Истина;
КонецПопытки;
КонецЕсли;
#КонецОбласти
#Область Сеансы
// СнятьБлокировкуНачалаСеансов - Снимем блокировку начала сеансов
Если (Скрипт = НРег("UnlockStartSessions")
Или Скрипт = НРег("СнятьБлокировкуНачалаСеансов")) Тогда
Логирование.ЗаписатьСтрокуЛога("Снять блокировку начала сеансов: ", 2);
Если Запуск1С.СнятьБлокировкуНачалаСеансов(Ложь) Тогда
Логирование.ЗаписатьСтрокуЛога("- УСПЕШНО", 3);
Иначе
Логирование.ЗаписатьСтрокуЛога("- ОШИБКА: " + Запуск1С.ТекстОшибки, 3);
БылиОшибкиТекБД = Истина;
КонецЕсли;
КонецЕсли;
Если БылиОшибкиТекБД
Или ПрекратитьВыполнениеСценария Тогда
БылиОшибки = Истина;
Продолжить;
КонецЕсли;
// ПолучитьСписокСеансов - Получим список активных соединений БД
Если Скрипт = НРег("GetListOfSessions")
Или Скрипт = НРег("ПолучитьСписокСеансов") Тогда
Логирование.ЗаписатьСтрокуЛога("Получить список сеансов БД: ", 2);
ТаблицаСеансов = Запуск1С.ПолучитьСписокСеансов();
Если ТаблицаСеансов <> Неопределено Тогда
Логирование.ЗаписатьСтрокуЛога("- УСПЕШНО, количество сеансов: " + ТаблицаСеансов.Количество(), 3);
Для Каждого Сеанс Из ТаблицаСеансов Цикл
Логирование.ЗаписатьСтрокуЛога(Сеанс.Приложение + ", " + Сеанс.ИмяПользователя + ", " + Сеанс.ИмяКомпьютера, 5);
КонецЦикла;
Иначе
Логирование.ЗаписатьСтрокуЛога("- ОШИБКА: " + Запуск1С.ТекстОшибки, 3);
БылиОшибкиТекБД = Истина;
КонецЕсли;
КонецЕсли;
// ЗавершитьВсеСеансы - Завершим все сеансы
Если Скрипт = НРег("CloseAllSessions")
Или Скрипт = НРег("ЗавершитьВсеСеансы") Тогда
Логирование.ЗаписатьСтрокуЛога("Завершить работу пользователей: ",2);
Если Запуск1С.ЗавершитьРаботуПользователей() Тогда
Логирование.ЗаписатьСтрокуЛога("- УСПЕШНО",3);
Иначе
Логирование.ЗаписатьСтрокуЛога("- ОШИБКА: " + Запуск1С.ТекстОшибки,3);
БылиОшибкиТекБД = Истина;
КонецЕсли;
КонецЕсли;
// УстановитьБлокировкуНачалаСеансов - Установим блокировку начала сеансов
Если Скрипт = НРег("LockStartSession")
Или Скрипт = НРег("УстановитьБлокировкуНачалаСеансов") Тогда
Логирование.ЗаписатьСтрокуЛога("Установить блокировку начала сеансов: ", 2);
Если Запуск1С.УстановитьБлокировкуНачалаСеансов(Ложь, СтрокаОбновления.МинутОжиданияЗавершенияСеансов) Тогда
Логирование.ЗаписатьСтрокуЛога("- УСПЕШНО", 3);
Иначе
Логирование.ЗаписатьСтрокуЛога("- ОШИБКА: " + Запуск1С.ТекстОшибки, 3);
БылиОшибкиТекБД = Истина;
КонецЕсли;
КонецЕсли;
// УстановитьБлокировкуРегламентныхЗаданий - Установим блокировку регламентных заданий
Если Скрипт = НРег("LockScheduledJobs")
Или Скрипт = НРег("УстановитьБлокировкуРегламентныхЗаданий") Тогда
Логирование.ЗаписатьСтрокуЛога("Установить блокировку регламентных заданий: ", 2);
Если Запуск1С.УстановитьБлокировкуРегламентныхЗаданий() Тогда
Логирование.ЗаписатьСтрокуЛога("- УСПЕШНО", 3);
Иначе
Логирование.ЗаписатьСтрокуЛога("- ОШИБКА: " + Запуск1С.ТекстОшибки, 3);
БылиОшибкиТекБД = Истина;
КонецЕсли;
КонецЕсли;
// СнятьБлокировкуРегламентныхЗаданий - Снимем блокировку регламентных заданий
Если Скрипт = НРег("UnlockScheduledJobs")
Или Скрипт = НРег("СнятьБлокировкуРегламентныхЗаданий") Тогда
Логирование.ЗаписатьСтрокуЛога("Снять блокировку регламентных заданий: ", 2);
Если Запуск1С.СнятьБлокировкуРегламентныхЗаданий() Тогда
Логирование.ЗаписатьСтрокуЛога("- УСПЕШНО", 3);
Иначе
Логирование.ЗаписатьСтрокуЛога("- ОШИБКА: " + Запуск1С.ТекстОшибки, 3);
БылиОшибкиТекБД = Истина;
КонецЕсли;
КонецЕсли;
#КонецОбласти
#Область Запуск1С
// Запустим 1С:Предприятие
Если Лев(Скрипт, 15) = НРег("StartEnterprise")