Практика применения OneScript (он же OScript, он же 1 Script) для 1С с примерами
Примеры скриптов на OneScript для управления кластером 1С:Предприятие
Специалисты 1С, не располагающие знаниями других языков программирования, которым необходимо автоматизировать «админскую» часть своих обязанностей по сопровождению систем на базе 1С:Предпрятие – могут воспользоваться интерпретатором OneScript для осуществления DevOps разработки.
Для написания приведенных далее скриптов использовалась библиотека управления кластером irac.
Установка OneScript и irac.
1. Скачаем дистрибутив интерпретатора.
Это можно сделать с сайта разработчика https://oscript.io/, там же можно почитать подробнее о самом OneScript.
2. Распакуем архив и поместим файлы интерпретатора OneScript на компьютер администратора.
Например в такую папку:
C:\OneScript
Размещать OneScript и библиотеку irac можно по любому пути на компьютере.
Но надо понимать, что данный путь указывается в скриптах, для подключения библиотеки.
3. Скачаем так же библиотеку управления кластером 1С irac.
4. Распакуем архив и поместим каталог irac в каталог с OneScript.
Например так:
C:\OneScript\irac-master
Примеры скриптов и их описание
В моем случае управление скриптами осуществляется внешней обработкой 1С:Предприятия.
Для работы которой требуется база 1С:Предприятия с доступной клиентской лицензией.
Из обработки осуществляется запуск командных строк вызова скриптов. Примеры использования командной строки можно прочитать можно посмотреть в статье*статья*.
Пример командной строки запуска:
1 |
C:\OneScript\bin\oscript.exe C:\1s_on_src\block_base.os 1s-on-1c-1 1541 base Администратор "" 1545 C:\1s_on_logs\log.txt Admin 1234 |
Вызываем скрипт:
block_base.os
Передаем в качестве параметров:
- Имя сервера;
- Порт кластера;
- Имя информационной базы;
- Имя пользователя (администратора) информационной базы;
- Пароль пользователя (администратора) информационной базы;
- Порт RAC;
- Путь к расположению логов, куда скрипт будет записывать информацию о выполнении;
- Имя администратора кластера;
- Пароль администратора кластера.
Скрипт блокировки базы
Устанавливает свойства базы:
- Блокировка начала сеансов включена;
- Блокировка регламентных заданий включена;
в истину.
Текст скрипта:
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 |
#Использовать "C:\OneScript\irac-master" Перем мСерверИмя; Перем мПортКластера; Перем мБазаИмя; Перем мАдминистраторИмя; Перем мПароль; Перем мПортРАС; Перем мФайлЛогов; Перем ТекИБ; Перем мАдминКластера; Перем мПарольКластера; Процедура ИнициализироватьПеременные() мСерверИмя = АргументыКоманднойСтроки[0]; мПортКластера = АргументыКоманднойСтроки[1]; мБазаИмя = АргументыКоманднойСтроки[2]; мАдминистраторИмя = АргументыКоманднойСтроки[3]; мПароль = АргументыКоманднойСтроки[4]; мПортРАС = АргументыКоманднойСтроки[5]; мФайлЛогов = АргументыКоманднойСтроки[6]; мАдминКластера = АргументыКоманднойСтроки[7]; мПарольКластера = АргументыКоманднойСтроки[8]; КонецПроцедуры Процедура ЗаблокироватьБазу() МассивСообщений = Новый Массив; Админка = Новый АдминистрированиеКластера(НРЕг(мСерверИмя), мПортРАС, "8.3"); Кластер = Админка.Кластеры().Получить(НРЕг(мСерверИмя) + ":" + мПортКластера, Истина); Если НЕ мАдминКластера = "" тогда Кластер.УстановитьАдминистратора(мАдминКластера, мПарольКластера); // - указывается если задан администратор кластера КонецЕсли; Серверы = Кластер.Серверы(); ИБ = Кластер.ИнформационныеБазы(); ТекИБ = ИБ.Получить(мБазаИмя, Истина); ТекИБ.УстановитьАдминистратора(мАдминистраторИмя, мПароль); ПараметрыИББлокировка = Новый Структура(); Для каждого стр из ТекИБ.ПараметрыОбъекта() цикл ПараметрыИББлокировка.Вставить(Стр.Ключ, ТекИБ.Получить(Стр.Ключ, Истина)); КонецЦикла; ПараметрыИББлокировка.БлокировкаРегламентныхЗаданийВключена = "on"; ПараметрыИББлокировка.БлокировкаСеансовВключена = "on"; ПараметрыИББлокировка.КодРазрешения = "12345"; // КодРазрешения ТекИБ.Изменить(ПараметрыИББлокировка); КодВозврата = Админка.КодВозврата(); ОбработатьРезультатВыполнения(КодВозврата, Админка, МассивСообщений); КонецПроцедуры Процедура ОбработатьРезультатВыполнения(КодВозврата, Админка, МассивСообщений) Если КодВозврата = 0 Тогда ТекстСообщения = "Операция по блокировке базы: " + ТекИБ.Имя() + " " + ТекИБ.Ид() + " завершилась успешно. КодВозврата: " + КодВозврата; ЗарегистрироватьСообщение(МассивСообщений, ТекстСообщения); Сообщить(ТекстСообщения); Иначе ТекстСообщения = "Операция по блокировке базы: " + ТекИБ.Имя() + " " + ТекИБ.Ид() + " завершилась с ошибками. КодВозврата: " + КодВозврата; ЗарегистрироватьСообщение(МассивСообщений, ТекстСообщения); КонецЕсли; ЗаписатьЛогВФайл(МассивСообщений); КонецПроцедуры Процедура ЗарегистрироватьСообщение(МассивСообщений, ТекстСообщения, Ошибка = ложь) Сообщить(ТекстСообщения); ТекстСообщенияМассива = ?(Ошибка, "!","") + ТекущаяДата() + " : " + ТекстСообщения; МассивСообщений.Добавить(ТекстСообщенияМассива); КонецПроцедуры Процедура ЗаписатьЛогВФайл(МассивСообщений) СписокСообщений = СтрСоединить(МассивСообщений, " |"); Текст = Новый ЗаписьТекста(мФайлЛогов); Текст.ЗаписатьСтроку(СписокСообщений); Текст.Закрыть(); КонецПроцедуры ИнициализироватьПеременные(); ЗаблокироватьБазу(); |
Аналогичным образом можно выполнить разблокировку базы, задав параметры в значение «off».
ПараметрыИББлокировка.БлокировкаРегламентныхЗаданийВключена = «off»;
ПараметрыИББлокировка.БлокировкаСеансовВключена = «off»;
Скрипт редактирования требований назначений функциональности
Добавляет в кластер требование назначения, чтобы клиентские соединения выполнялись только на 1-м сервере кластера.
Текст скрпита добавления требований:
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 |
#Использовать "C:\OneScript\irac-master" Перем мСерверИмя; Перем мПортКластера; Перем мБазаИмя; Перем мАдминистраторИмя; Перем мПароль; Перем мПортРАС; Перем мФайлЛогов; Перем мАдминКластера; Перем мПарольКластера; Процедура ИнициализироватьПеременные() мСерверИмя = АргументыКоманднойСтроки[0]; мПортКластера = АргументыКоманднойСтроки[1]; мБазаИмя = АргументыКоманднойСтроки[2]; мАдминистраторИмя = АргументыКоманднойСтроки[3]; мПароль = АргументыКоманднойСтроки[4]; мПортРАС = АргументыКоманднойСтроки[5]; мФайлЛогов = АргументыКоманднойСтроки[6]; мАдминКластера = АргументыКоманднойСтроки[7]; мПарольКластера = АргументыКоманднойСтроки[8]; КонецПроцедуры Процедура ДобавитьТребованияНазначенияИПрименитьВсе() МассивСообщений = Новый Массив; Админка = Новый АдминистрированиеКластера(НРЕг(мСерверИмя), мПортРАС, "8.3"); Кластер = Админка.Кластеры().Получить(НРЕг(мСерверИмя) + ":" + мПортКластера, Истина); Если НЕ мАдминКластера = "" тогда Кластер.УстановитьАдминистратора(мАдминКластера, мПарольКластера); // - указывается если задан администратор кластера КонецЕсли; Серверы = Кластер.Серверы(); Для каждого Сервер Из Серверы.Список() Цикл СерверНФ = Сервер.НазначенияФункциональности(); Если НРЕг(Сервер.Получить("СерверАгента", Истина)) = НРЕг(мСерверИмя) Тогда // на сервер 1-м сервере назначаем соединения ПараметрыТребования = Новый Структура(); ПараметрыТребования.Вставить("ТипОбъекта" , Перечисления.ОбъектыНазначенияФункциональности.КлиентскиеСоединения); ПараметрыТребования.Вставить("ИмяИБ" , ""); ПараметрыТребования.Вставить("ТипНазначения" , Перечисления.ТипыНазначенияФункциональности.Назначать); ПараметрыТребования.Вставить("Приоритет" , 0); СерверНФ.Добавить(0, ПараметрыТребования); Иначе // на всех остальных серверах запрещаем соединения ПараметрыТребования = Новый Структура(); ПараметрыТребования.Вставить("ТипОбъекта" , Перечисления.ОбъектыНазначенияФункциональности.КлиентскиеСоединения); ПараметрыТребования.Вставить("ИмяИБ" , ""); ПараметрыТребования.Вставить("ТипНазначения" , Перечисления.ТипыНазначенияФункциональности.НеНазначать); ПараметрыТребования.Вставить("Приоритет" , 0); СерверНФ.Добавить(0, ПараметрыТребования); КонецЕсли; КодВозврата = Админка.КодВозврата(); Текст = "Операция добавления требования " + ПараметрыТребования.ТипОбъекта + " " + ПараметрыТребования.ТипНазначения + " на сервер: " + мСерверИмя; ОбработатьРезультатВыполнения(КодВозврата, Текст, МассивСообщений); КонецЦикла; СерверНФ.ПрименитьВсе(); КодВозврата = Админка.КодВозврата(); Текст = "Операция применения требований(полное): " + мСерверИмя; ОбработатьРезультатВыполнения(КодВозврата, Текст, МассивСообщений); КонецПроцедуры Процедура ОбработатьРезультатВыполнения(КодВозврата, Текст, МассивСообщений) Если КодВозврата = 0 Тогда ТекстСообщения = Текст + " завершилась успешно. КодВозврата: " + КодВозврата; ЗарегистрироватьСообщение(МассивСообщений, ТекстСообщения); Сообщить(ТекстСообщения); Иначе ТекстСообщения = Текст + " завершилась с ошибками. КодВозврата: " + КодВозврата; ЗарегистрироватьСообщение(МассивСообщений, ТекстСообщения); КонецЕсли; ЗаписатьЛогВФайл(МассивСообщений); КонецПроцедуры Процедура ЗарегистрироватьСообщение(МассивСообщений, ТекстСообщения, Ошибка = ложь) Сообщить(ТекстСообщения); ТекстСообщенияМассива = ?(Ошибка, "!","") + ТекущаяДата() + " : " + ТекстСообщения; МассивСообщений.Добавить(ТекстСообщенияМассива); КонецПроцедуры Процедура ЗаписатьЛогВФайл(МассивСообщений) СписокСообщений = СтрСоединить(МассивСообщений, " |"); Файл = Новый ЗаписьТекста(мФайлЛогов); Файл.ЗаписатьСтроку(СписокСообщений); Файл.Закрыть(); КонецПроцедуры ИнициализироватьПеременные(); ДобавитьТребованияНазначенияИПрименитьВсе(); |
Текст скрипта удаления требований:
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 |
#Использовать "C:\OneScript\irac-master" Перем мСерверИмя; Перем мПортКластера; Перем мБазаИмя; Перем мАдминистраторИмя; Перем мПароль; Перем мПортРАС; Перем мФайлЛогов; Перем мАдминКластера; Перем мПарольКластера; Процедура ИнициализироватьПеременные() мСерверИмя = АргументыКоманднойСтроки[0]; мПортКластера = АргументыКоманднойСтроки[1]; мБазаИмя = АргументыКоманднойСтроки[2]; мАдминистраторИмя = АргументыКоманднойСтроки[3]; мПароль = АргументыКоманднойСтроки[4]; мПортРАС = АргументыКоманднойСтроки[5]; мФайлЛогов = АргументыКоманднойСтроки[6]; мАдминКластера = АргументыКоманднойСтроки[7]; мПарольКластера = АргументыКоманднойСтроки[8]; КонецПроцедуры Процедура УдалитьТребованиеНазначенияИПрименитьВсе() МассивСообщений = Новый Массив; Админка = Новый АдминистрированиеКластера(НРЕг(мСерверИмя), мПортРАС, "8.3"); Кластер = Админка.Кластеры().Получить(НРЕг(мСерверИмя) + ":" + мПортКластера, Истина); Если НЕ мАдминКластера = "" тогда Кластер.УстановитьАдминистратора(мАдминКластера, мПарольКластера); // - указывается если задан администратор кластера КонецЕсли; Серверы = Кластер.Серверы(); Для каждого Сервер Из Серверы.Список() Цикл СерверНФ = Сервер.НазначенияФункциональности(); ОтборТребований = Новый Структура(); ОтборТребований.Вставить("ТипОбъекта", Служебный.ОбернутьВКавычки(Перечисления.ОбъектыНазначенияФункциональности.КлиентскиеСоединения)); //Перечисления.ОбъектыНазначенияФункциональности.КлиентскиеСоединения + """"); Требования = СерверНФ.Список(ОтборТребований, Истина); Для каждого Требование из Требования Цикл //Отбор не работает, т.к. возвращается значение в "" Если Требование.Получить("ТипОбъекта", Истина) = Служебный.ОбернутьВКавычки(Перечисления.ОбъектыНазначенияФункциональности.КлиентскиеСоединения) Тогда СерверНФ.Удалить(Требование.Ид()); КодВозврата = Админка.КодВозврата(); Текст = "Операция удаления требования " + Требование.Получить("ТипОбъекта", Истина) + " " + Требование.Ид() + " на сервер: " + мСерверИмя; ОбработатьРезультатВыполнения(КодВозврата, Текст, МассивСообщений); КонецЕсли; КонецЦикла; СерверНФ.ПрименитьВсе(); КодВозврата = Админка.КодВозврата(); Текст = "Операция применения требований(полное): " + мСерверИмя; ОбработатьРезультатВыполнения(КодВозврата, Текст, МассивСообщений); КонецЦикла; КонецПроцедуры Процедура ОбработатьРезультатВыполнения(КодВозврата, Текст, МассивСообщений) Если КодВозврата = 0 Тогда ТекстСообщения = Текст + " завершилась успешно. КодВозврата: " + КодВозврата; ЗарегистрироватьСообщение(МассивСообщений, ТекстСообщения); Сообщить(ТекстСообщения); Иначе ТекстСообщения = Текст + " завершилась с ошибками. КодВозврата: " + КодВозврата; ЗарегистрироватьСообщение(МассивСообщений, ТекстСообщения); КонецЕсли; ЗаписатьЛогВФайл(МассивСообщений); КонецПроцедуры Процедура ЗарегистрироватьСообщение(МассивСообщений, ТекстСообщения, Ошибка = ложь) Сообщить(ТекстСообщения); ТекстСообщенияМассива = ?(Ошибка, "!","") + ТекущаяДата() + " : " + ТекстСообщения; МассивСообщений.Добавить(ТекстСообщенияМассива); КонецПроцедуры Процедура ЗаписатьЛогВФайл(МассивСообщений) СписокСообщений = СтрСоединить(МассивСообщений, " |"); Файл = Новый ЗаписьТекста(мФайлЛогов); Файл.ЗаписатьСтроку(СписокСообщений); Файл.Закрыть(); КонецПроцедуры ИнициализироватьПеременные(); УдалитьТребованиеНазначенияИПрименитьВсе(); |
Скрипт удаления сеансов в базе
Удаляет все активные сессии в базе.
Текст скрипта:
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 |
#Использовать "C:\OneScript\irac-master" Перем мСерверИмя; Перем мПортКластера; Перем мБазаИмя; Перем мАдминистраторИмя; Перем мПароль; Перем мПортРАС; Перем мФайлЛогов; Перем мАдминКластера; Перем мПарольКластера; Процедура ИнициализироватьПеременные() мСерверИмя = АргументыКоманднойСтроки[0]; мПортКластера = АргументыКоманднойСтроки[1]; мБазаИмя = АргументыКоманднойСтроки[2]; мАдминистраторИмя = АргументыКоманднойСтроки[3]; мПароль = АргументыКоманднойСтроки[4]; мПортРАС = АргументыКоманднойСтроки[5]; мФайлЛогов = АргументыКоманднойСтроки[6]; мАдминКластера = АргументыКоманднойСтроки[7]; мПарольКластера = АргументыКоманднойСтроки[8]; КонецПроцедуры Процедура ЗавершитьАктивныеСансыВБазе() МассивСообщений = Новый Массив; Админка = Новый АдминистрированиеКластера(НРЕг(мСерверИмя), мПортРАС, "8.3"); Кластеры = Админка.Кластеры(); Кластер = Админка.Кластеры().Получить(НРЕг(мСерверИмя) + ":" + мПортКластера, Истина); Если НЕ мАдминКластера = "" тогда Кластер.УстановитьАдминистратора(мАдминКластера, мПарольКластера); // - указывается если задан администратор кластера КонецЕсли; Серверы = Кластер.Серверы(); ИБ = Кластер.ИнформационныеБазы(); ТекИБ = ИБ.Получить(мБазаИмя, Истина); ТекИБ.УстановитьАдминистратора(мАдминистраторИмя, мПароль); ТекстСообщения = "Удаляются сеансы в базе: " + ТекИБ.Имя() + " " + ТекИБ.Ид(); ЗарегистрироватьСообщение(МассивСообщений, ТекстСообщения); Сеансы = ТекИБ.Сеансы().Список(); Если Сеансы.Количество()>0 Тогда Для каждого Сеанс Из Сеансы Цикл Сообщить(Сеанс.Ид()); Сеанс.Завершить(); КонецЦикла; КонецЕсли; // получаем повторно, так как не перечитывает данные по умолчанию Серверы = Кластер.Серверы(); ИБ = Кластер.ИнформационныеБазы(); ТекИБ = ИБ.Получить(мБазаИмя, Истина); ТекИБ.УстановитьАдминистратора(мАдминистраторИмя, мПароль); Сеансы = ТекИБ.Сеансы().Список(); КодВозврата = ?(Сеансы.Количество()>0, 1, 0); Текст = "Операция удаления сеансов в базе: " + ТекИБ.Имя() + " " + ТекИБ.Ид(); ОбработатьРезультатВыполнения(КодВозврата, Текст, МассивСообщений); КонецПроцедуры Процедура ОбработатьРезультатВыполнения(КодВозврата, Текст, МассивСообщений) Если КодВозврата = 0 Тогда ТекстСообщения = Текст + " завершилась успешно. КодВозврата: " + КодВозврата; ЗарегистрироватьСообщение(МассивСообщений, ТекстСообщения); Сообщить(ТекстСообщения); Иначе ТекстСообщения = Текст + " завершилась с ошибками. КодВозврата: " + КодВозврата; ЗарегистрироватьСообщение(МассивСообщений, ТекстСообщения); КонецЕсли; ЗаписатьЛогВФайл(МассивСообщений); КонецПроцедуры Процедура ЗарегистрироватьСообщение(МассивСообщений, ТекстСообщения, Ошибка = ложь) Сообщить(ТекстСообщения); ТекстСообщенияМассива = ?(Ошибка, "!","") + ТекущаяДата() + " : " + ТекстСообщения; МассивСообщений.Добавить(ТекстСообщенияМассива); КонецПроцедуры Процедура ЗаписатьЛогВФайл(МассивСообщений) СписокСообщений = СтрСоединить(МассивСообщений, " |"); Файл = Новый ЗаписьТекста(мФайлЛогов); Файл.ЗаписатьСтроку(СписокСообщений); Файл.Закрыть(); КонецПроцедуры ИнициализироватьПеременные(); ЗавершитьАктивныеСансыВБазе(); |
Итоги
Как видим рутинные операции по обслуживанию 1С, для автоматизации которых ранее надо было исхищраться с shell-интерпритаторами операционной системы, теперь доступны в кофмотрной для «1С-ника» обертке. Это позволяет более гибко и управляемо подходить к процессу сопровождения системы прорамм 1С.
Еще можно посмотреть
Похожие записи
- Расследование конфликтов управляемых блокировок (TTIMEOUT) 1С:Предприятия
- Что такое PG_TEMP в PostgreSQL для 1С
- НАСТРОЙКА PG_PROFILE ДЛЯ POSTGRESQL 1.
- Статистика PostgreSQL при работе с 1С:Предприятием
- Настройка непрерывного архивирования (point-in-time-recovery, PITR) в PostgresPro 11 Linux
- Пропажа индексов дескрипторов в 1С:Документообороте
- Технологический журнал 1С и бесконечный цикл в коде 1С
- 1C тормозит и возникают ошибки. С чего начать расследование?
- Хранение файлов 1С в томах на nfs-шаре Linux
- Администрирование серверов 1С на Linux