11 июн. 2016 г.

OneScript, сделай мне много баз, бесплатно, без СМС


После первых экспериментов с OneScript решил сделать себе создавалку баз на сервере 1С по списку. Реализовать такую задачу можно двумя путями. Через COM-соединение с агентом сервера и запуск 1С с ключом CreateInfoBase. Решил сделать оба варианта для оценки плюсов и минусов, и само собой, ради практики. Кстати, оказалось, вовремя сделал скрипты. Коллега вчера попробовал залить дамп базы, но не угадал со свободным место на диске. В итоге файл настроек кластера повредился. Лекарство в этом случае одно - снести каталог кластера и настроить все руками заново. Как вариант, можно попробовать бэкапить все файлы *.lst в каталоге. В моем случае половина файла 1CV8Clst.lst после падения оказалась забита нулями. Но вернемся к скриптам.

Скрипт настроек config.os из прошлого примера расширен значениями АдминистраторКластера, ПарольАдминистратораКластера, ВерсияСервераРазработки.

Перем СерверРазработки Экспорт;
Перем КластерСервераРазработки Экспорт;
Перем ТестоваяБаза Экспорт;
Перем Пользователь1С Экспорт;
Перем Пароль1С Экспорт;
Перем ВерсияCOM_1С Экспорт;
Перем АдминистраторКластера Экспорт;
Перем ПарольАдминистратораКластера Экспорт;
Перем ВерсияСервераРазработки Экспорт;

Перем СерверSQL Экспорт;
Перем ПользовательSQL Экспорт;
Перем ПарольSQL Экспорт;
Перем КаталогФайловДанных Экспорт;
Перем КаталогФайловЖурналов Экспорт;
Перем КаталогБэкапа Экспорт;

//1С
КластерСервераРазработки = "localhost:2541";
СерверРазработки = "localhost:2540";
ТестоваяБаза = "test_base";
Пользователь1С = "";
Пароль1С = "";
ВерсияCOM_1С = "V83.COMConnector";
АдминистраторКластера = "";
ПарольАдминистратораКластера = "";
ВерсияСервераРазработки = "8.3.7.2008";
//SQL
СерверSQL = "localhost\dev";
ПользовательSQL = "sa";
ПарольSQL = "";
КаталогФайловДанных = "F:\SQL_Data\BD";
КаталогФайловЖурналов = "F:\SQL_Logs\BD";
КаталогБэкапа = "F:\SQL_Backup";

Скрипт create_base_agent.os работает через COM-соединение. Недостаток этого подхода в том, что если на сервере поднято несколько кластеров 1С различных версий, то может потребоваться перерегистрация библиотеки comcntr.dll для необходимой версии.

Процедура СоздатьБазыЧерезАгентКластера(СписокИмен, ПутьКШаблону = "")
 
 ПодключитьСценарий("config.os", "ПараметрыСкрипта");
 Параметры = Новый ПараметрыСкрипта;
 
 Конфигуратор = Новый УправлениеКонфигуратором();
 ПутьКПлатформе = Конфигуратор.ПолучитьПутьКВерсииПлатформы(Параметры.ВерсияСервераРазработки);
 Конфигуратор.ПутьКПлатформе1С(ПутьКПлатформе);
 
 Коннектор = Новый COMОбъект(Параметры.ВерсияCOM_1С);
 
 АгентСервера = Коннектор.ConnectAgent(Параметры.СерверРазработки);
 Кластеры = АгентСервера.getClusters();
 Кластер = Кластеры[0];
 АгентСервера.Authenticate(Кластер, Параметры.АдминистраторКластера, Параметры.ПарольАдминистратораКластера);
 Процессы = АгентСервера.GetWorkingProcesses(Кластер);
 
 РабочийПроцесс = Коннектор.ConnectWorkingProcess(Процессы[0].HostName + ":" 
 + СтрЗаменить(Процессы[0].MainPort, Символы.НПП, ""));
 
 ШаблонБазы = РабочийПроцесс.CreateInfoBaseInfo();
 
 Для Каждого БазаИмя Из СписокИмен Цикл
  
  ШаблонБазы.Name = БазаИмя.Значение;
  ШаблонБазы.DBMS = "MSSQLServer";
  ШаблонБазы.dbName = БазаИмя.Значение;
  ШаблонБазы.Descr = ?(ПустаяСтрока(БазаИмя.Представление), БазаИмя.Значение, БазаИмя.Представление);
  ШаблонБазы.dbServerName = Параметры.СерверSQL;
  ШаблонБазы.dbUser = Параметры.ПользовательSQL;
  ШаблонБазы.dbPassword = Параметры.ПарольSQL;
  ШаблонБазы.Locale = "ru_Ru";
  ШаблонБазы.DateOffset  = 2000;
  ШаблонБазы.ScheduledJobsDenied = Истина;
  
  РабочийПроцесс.CreateInfoBase(ШаблонБазы, 1);
  
  Если НЕ ПустаяСтрока(ПутьКШаблону) Тогда
   Конфигуратор.УстановитьКонтекст("/IBConnectionString""Srvr=" 
   + Параметры.КластерСервераРазработки + "; Ref='" + БазаИмя.Значение + "'""","", "");
   РасширениеШаблона = Прав(ПутьКШаблону, 2);
   Если РасширениеШаблона = "dt" Тогда
    Конфигуратор.ЗагрузитьИнформационнуюБазу(ПутьКШаблону);
   ИначеЕсли РасширениеШаблона = "cf" Тогда
    Конфигуратор.ЗагрузитьКонфигурациюИзФайла(ПутьКШаблону, Истина);
   Иначе
    Продолжить;
   КонецЕсли;
  КонецЕсли;
  
 КонецЦикла;
 
 РабочийПроцесс = Неопределено;
 Коннектор = Неопределено;
 
КонецПроцедуры

ПутьКШаблону = "E:\1c\templates\cf\1cv8_test.cf"; //*.cf, *.dt
мБазы = Новый СписокЗначений;
мБазы.Добавить("test_base_1");
мБазы.Добавить("test_base_2");
СоздатьБазыЧерезАгентКластера(мБазы, ПутьКШаблону);

Второй вариант скрипта потребует модификации файла v8runner.os, идущего в поставке OneScript. По умолчанию располагается в каталоге установки OneScript \lib\v8runner\src.

Скрипт create_base_batch.os по сравнению с предыдущим скриптом,на мой взгляд, более практичен, поскольку нет необходимости манипуляций с библиотекой COM-соединений.

#Использовать v8runner

Процедура СоздатьБазыЧерезПакетныйРежим(СписокИмен, Знач ПутьКШаблону="")

 ПодключитьСценарий("config.os", "ПараметрыСкрипта");
 Параметры = Новый ПараметрыСкрипта;

 Конфигуратор = Новый УправлениеКонфигуратором(); 
 ПутьКПлатформе = Конфигуратор.ПолучитьПутьКВерсииПлатформы(Параметры.ВерсияСервераРазработки);
 Конфигуратор.ПутьКПлатформе1С(ПутьКПлатформе);
 
 Для Каждого БазаИмя Из СписокИмен Цикл
  Конфигуратор.СоздатьБазуSQL(БазаИмя.Значение, Параметры, ПутьКШаблону, БазаИмя.Представление);
 КонецЦикла

КонецПроцедуры

ПутьКШаблону = "E:\1c\templates\cf\1cv8_test.cf"; //*.cf, *.dt
мБазы = Новый СписокЗначений;
мБазы.Добавить("test_base_1");
мБазы.Добавить("test_base_2");
СоздатьБазыЧерезПакетныйРежим(мБазы, ПутьКШаблону);

v8runner.os

Процедура СоздатьБазуSQL(Знач ИмяБазы, Знач Параметры, Знач ПутьКШаблону="", Знач ИмяБазыВСписке="") Экспорт
 
 Лог.Отладка("Создаю базу SQL "+ИмяБазы);
 
 ПараметрыЗапуска = Новый Массив;
 ПараметрыЗапуска.Добавить("CREATEINFOBASE");
 
 ПараметрыЗапуска.Добавить("Srvr=""" + Параметры.КластерСервераРазработки + """;");
 ПараметрыЗапуска.Добавить("Ref=""" + ИмяБазы + """;");
 ПараметрыЗапуска.Добавить("DBMS=""" + "MSSQLServer" + """;");
 ПараметрыЗапуска.Добавить("DBSrvr=""" + Параметры.СерверSQL + """;");
 ПараметрыЗапуска.Добавить("DB=""" + ИмяБазы + """;");
 ПараметрыЗапуска.Добавить("DBUID=""" + Параметры.ПользовательSQL + """;");
 ПараметрыЗапуска.Добавить("DBPwd=""" + Параметры.ПарольSQL + """;"); 
 ПараметрыЗапуска.Добавить("SQLYOffs=""" + "2000" + """;"); 
 ПараметрыЗапуска.Добавить("Locale=""" + "Ru_ru" + """;"); 
 ПараметрыЗапуска.Добавить("CrSQLDB=""" + "Y" + """;");
 ПараметрыЗапуска.Добавить("SchJobDn=""" + "Y" + """;");
 ПараметрыЗапуска.Добавить("LicDstr=""" + "Y" + """;");
 ПараметрыЗапуска.Добавить("SUsr=""" + Параметры.АдминистраторКластера + """;");
 ПараметрыЗапуска.Добавить("SPwd=""" + Параметры.ПарольАдминистратораКластера + """;");
 
 ПараметрыЗапуска.Добавить("/Out""" + ФайлИнформации() + """");
 
 Если ИмяБазыВСписке <> "" Тогда
  ПараметрыЗапуска.Добавить("/AddInList"""+ ИмяБазыВСписке + """");
 КонецЕсли;
 Если ПутьКШаблону<> "" Тогда
  ПараметрыЗапуска.Добавить("/UseTemplate"""+ ПутьКШаблону + """");
 КонецЕсли;
 
 КодВозврата = ЗапуститьИПодождать(ПараметрыЗапуска);
 УстановитьВывод(ПрочитатьФайлИнформации());
 Если КодВозврата <> 0 Тогда
  ВызватьИсключение ВыводКоманды();
 КонецЕсли;
 
КонецПроцедуры

Комментариев нет:

Отправить комментарий