Практика применения 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С OneScript
Для работы которой требуется база 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С.
Еще можно посмотреть
Подключение репозитория под ОС Linux
Инструкции по подключению репозитория как под CentOS так и под РЕД ОС.
Разворачиваем виртуальный сервер VirtualBox для 1С и не только
Рассмотрим как разворачивать виртуальный сервер VirtualBox для установки сервера 1С на Linux
Настройка выделенного сервера лицензий 1С Предприятия
Настраиваем сервер лицензий 1С на выделенном компьютере. Пошаговый процесс настройки.
Настройка DNS-адресации для 1С сервера
Рассмотрим важность настройки DNS-адресации для 1С сервера или как сэкономить кучу времени на исправлении ошибок подключения к 1С серверу.
Командная строка 1С и примеры ее использования
Приведены примеры использования команд и параметров для запуска программы 1С:Предприятие из командной строки
Очистка кэша: серверного и клиентского для 1С:Предприятия
Лечим непонятные ошибки 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