В мире OneScript давно существуют библиотеки для облегчения работы с каким-либо классом программного обеспечения, например v8runner - помощник выполнения команд конфигуратора или gitrunner - программная обертка для запуска команд git.
Есть библиотека и для работы с автономным сервером 1с. Однако библиотеке ibcmdrunner уже три года, а про нее нет ни одной публикации на инфостарте. Исправляю эту несправедливость.
Что за автономный сервер?
Прежде чем начнем, пару слов о самом автономном сервере. Впервые эта технология появилась в платформе 8.3.14, причем автономный сервер тогда служил только заменой кластера серверов, с особенной фишкой - встроенным веб-сервером. Позже автономный сервер стал гораздо бОльшим, чем средство доступа клиентских приложений к базе 1с. Для меня он стал интересен, когда с помощью автономного сервера стало возможно выполнять операции с исходным кодом и всякие штуки девопс. Сравним описания автономного сервера, данные самим вендором.
Это с 8.3.14:
Автономный сервер - это специальное серверное приложение, которое предназначено для обеспечения работы с информационной базой клиентских приложений: тонкий клиент, веб-клиент, мобильный клиент.
А это уже с последних версий:
Автономный сервер - это специальное серверное приложение, которое предназначено для обеспечения работы с информационной базой управляемого приложения любого клиентского приложения и Конфигуратора.
Автономный сервер представляет из себя утилиты ibsrv (собственно, само приложение автономного сервера) и ibcmd (приложение командной строки для управления автономным сервером).
Сейчас это целый комбайн. Подробнее можно почитать в статьях и посмотреть в видео:
Автономный сервер. Часть 1 - новый вариант сервера
Автономный сервер. Часть 2 - утилита управления
Вебинар "5 примеров использования ibcmd на каждый день" (канал Инфостарт)
Что за OneScript?
Все уже наверное знают, но повторение не будет лишним.
OneScript – это независимая кроссплатформенная реализация виртуальной машины, исполняющей скрипты на языке 1С:Предприятие
Смотрите oscript.io, OneScript для новичков и прочие материалы по ссылке
Что такое ibcmdrunner
Как известно, в OneScript есть два типа пакетов - библиотеки и приложения. И те, и те устанавливаются через пакетный менеджер opm, однако, после установки приложения в параметрах системы PATH появляется короткая ссылка на приложение, так что условный gitsync можно запускать, просто написав в консоли gitsync. Библиотека же - это особым образом упакованный сценарий, который можно использовать в своих скриптах, предварительно подключив его инструкцией #Использовать.
ibcmdrunner - это библиотека.
Для ее использования сначала установим ее в систему. Для этого нужно выполнить в командной строке следующую команду:
opm install ibcmdrunner
А затем в начале своего скрипта указать использование этой библиотеки:
#Использовать ibcmdrunner
Библиотека позволяет подключить отдельные классы УправлениеИБ, УправлениеАС, КонфигурационныйФайлАС. УправлениеИБ - экземпляр этого класса используется для манипулирования информационной базой. УправлениеАС и КонфигурационныйФайлАС -для управления автономным сервером (настройки, запуск и так далее) и конфигурационным файлом соответственно.
Автор библиотеки - Алексей Бобылкин, ну и, конечно, большое количество членов сообщества OneScript.
Используем библиотеку ibcmdrunner
Пример №1
Давайте напишем простой пример. Создаем объект УправлениеИБ, указываем параметры информационной базы, указываем авторизацию, выполняем для примера выгрузку базы в dt.
#Использовать ibcmdrunner
УправлениеИБ = Новый УправлениеИБ;
УправлениеИБ.УстановитьПараметрыСервернойИБ(ТипБД, Сервер, ИмяБД, ПользовательБД, ПарольБД);
УправлениеИБ.УстановитьПараметрыАвторизацииИБ(Пользователь1С, Пароль1С);
УправлениеИБ.ВыгрузитьДанныеИБ("Путь/К/Каталогу/ПередОбновлением.dt");
Смотрите, нам не нужно заглядывать в справку приложения ibcmd, чтобы написать правильную команду выгрузки в dt с кучей аргументов (ibcmd infobase dump --user=... --password=... и так далее). Мы просто пишем на русском языке понятную команду и все.
Кстати, справка о доступных командах библиотеки есть тут же, в репозитории проекта - github.com/vanessa-opensource/ibcmdrunner.
Пример №2
Давайте напишем скрипт посложнее.
Представим, что нам поручили обновить некую базу - загрузить в нее подготовленный cf, загрузить новые расширения. У нас есть каталог, в котором лежат несколько расширений (неважно сколько) и файл new.cf
Сделаем скрипт обновления базы - сначала выгрузка в dt на случай, если что-то пойдет не так (это мы уже умеем), потом загрузим новый cf файл, загрузим расширения.
Загрузка cf и cfe делается методом ЗагрузитьКонфигурацию с указанием пути к файлу и имени расширения (если это cfe).
После загрузки делаем обновление конфигурации базы данных (программное нажатие на "бочонок"), удивительно, но метод, который это делает, так и называется - ОбновитьКонфигурациюБазыДанных
Ищем расширения в каталоге и устанавливаем их.
#Использовать ibcmdrunner
КаталогРелиза = "Путь/К/Каталогу";
УправлениеИБ = Новый УправлениеИБ;
УправлениеИБ.УстановитьПараметрыСервернойИБ(ТипБД, Сервер, ИмяБД, ПользовательБД, ПарольБД);
УправлениеИБ.УстановитьПараметрыАвторизацииИБ(Пользователь1С, Пароль1С);
УправлениеИБ.ВыгрузитьДанныеИБ("ПередОбновлением.dt");
УправлениеИБ.ЗагрузитьКонфигурацию(ОбъединитьПути(КаталогРелиза , "new.cf"));
УправлениеИБ.ОбновитьКонфигурациюБазыДанных(, "disable", "force");
РасширенияДляЗагрузки = НайтиФайлы(КаталогРелиза , "*.cfe");
Для Каждого ФайлРасширения Из РасширенияДляЗагрузки Цикл
ИмяРасширения = СтрЗаменить(ФайлРасширения.Имя, ".cfe", "");
УправлениеИБ.ЗагрузитьКонфигурацию(ФайлРасширения.ПолноеИмя, ИмяРасширения);
УправлениеИБ.ОбновитьКонфигурациюБазыДанных(ИмяРасширения, "disable", "force");
КонецЦикла;
И опять получилось несложно.
Пример №3
Давайте напишем скрипт, который сравнит, отличаются ли конфигурации двух информационных баз и их расширений. Для чего это надо?
Представим, что у нас есть Прод и ПредПрод база. Каждый раз после выпуска релиза ПредПрод база восстанавливается из Прод базы. Затем в ходе подготовки к новому релизу в ПредПрод вносятся изменения - меняется конфигурация, меняются расширения. Релиз-инженер (что бы ни значил этот термин) должен иметь инструмент, с помощью которого перед релизом можно быстро узнать, какие расширения менялись и менялась ли конфигурация.
Раньше я делал подобное через сравнение-объединение или через выгрузку конфигурации и расширений в исходный код и дальнейший анализ. Но это очень долго. ibcmdrunner поможет.
Можно воспользоваться методом ИДПоколенияДанных() - он возвращает идентификатор, который меняется при каждом изменении конфигурации базы данных. Так как база ПредПрод создана восстановлением из Прод базы, их идентификаторы одинаковы. При изменении конфигурации любой из баз идентификаторы поменяются.
Что делать с расширениями? На это тоже есть ответ. Есть метод ОписанияРасширений(), который возвращает массив с имеющимися в базе данных расширениями с их свойствами. Нас в данном конкретном случае будет интересовать только свойство name - Имя расширения и hash-sum - хеш расширения. Если хеш не совпадает, значит расширение поменялось.
В этот раз уже не получается сделать простой одностраничный скрипт.
#Использовать ibcmdrunner
Функция АнализБазыДанных(ПараметрыБазыДанных)
РезультатАнализа = Новый Структура;
УправлениеИБ = Новый УправлениеИБ;
УправлениеИБ.УстановитьПараметрыСервернойИБ(ПараметрыБазыДанных.ТипБД, ПараметрыБазыДанных.Сервер,
ПараметрыБазыДанных.ИмяБД, ПараметрыБазыДанных.ПользовательБД, ПараметрыБазыДанных.ПарольБД);
УправлениеИБ.УстановитьПараметрыАвторизацииИБ(ПараметрыБазыДанных.Пользователь1С, ПараметрыБазыДанных.Пароль1С);
РезультатАнализа.Вставить("ИДПоколенияДанных", УправлениеИБ.ИДПоколенияДанных());
Расширения = Новый Соответствие();
Для Каждого СтрокаРасширения Из УправлениеИБ.ОписанияРасширений() Цикл
Расширения.Вставить(СтрокаРасширения.Получить("name"), СтрокаРасширения.Получить("hash-sum"));
КонецЦикла;
РезультатАнализа.Вставить("Расширения", Расширения);
Возврат РезультатАнализа;
КонецФункции
Функция ПараметрыБазыДанных2()
ПараметрыБазыДанных = Новый Структура;
ПараметрыБазыДанных.Вставить("ПользовательБД", "erpuser");
ПараметрыБазыДанных.Вставить("ПарольБД", "пароль");
ПараметрыБазыДанных.Вставить("Сервер", "1CERP");
ПараметрыБазыДанных.Вставить("ТипБД", "MSSQLServer");
ПараметрыБазыДанных.Вставить("ИмяБД", "ERP_Prod");
ПараметрыБазыДанных.Вставить("Пользователь1С", "Пользователь");
ПараметрыБазыДанных.Вставить("Пароль1С", "пароль");
Возврат ПараметрыБазыДанных;
КонецФункции
Функция ПараметрыБазыДанных1()
ПараметрыБазыДанных = Новый Структура;
ПараметрыБазыДанных.Вставить("ПользовательБД", "erpuser");
ПараметрыБазыДанных.Вставить("ПарольБД", "пароль");
ПараметрыБазыДанных.Вставить("Сервер", "1CERPPRED");
ПараметрыБазыДанных.Вставить("ТипБД", "MSSQLServer");
ПараметрыБазыДанных.Вставить("ИмяБД", "ERP_PredProd");
ПараметрыБазыДанных.Вставить("Пользователь1С", "Пользователь");
ПараметрыБазыДанных.Вставить("Пароль1С", "пароль");
Возврат ПараметрыБазыДанных;
КонецФункции
Процедура СообщитьОбИзменениях(Расширения, ТипИзменения)
Если Не ЗначениеЗаполнено(Расширения) Тогда
Возврат;
КонецЕсли;
Сообщить(ТипИзменения);
Для Каждого ИмяРасширения Из Расширения Цикл
Если ТипЗнч(ИмяРасширения) = Тип("КлючИЗначение") Тогда
ИмяРасширения = ИмяРасширения.Ключ;
КонецЕсли;
Сообщить(ИмяРасширения);
КонецЦикла;
КонецПроцедуры
ДобавленныеРасширения = Новый Массив;
ИзмененныеРасширения = Новый Массив;
АнализБазыДанных1 = АнализБазыДанных(ПараметрыБазыДанных1());
Ид1 = АнализБазыДанных1.ИДПоколенияДанных;
Расширения1 = АнализБазыДанных1.Расширения;
АнализБазыДанных2 = АнализБазыДанных(ПараметрыБазыДанных2());
Ид2 = АнализБазыДанных2.ИДПоколенияДанных;
Расширения2 = АнализБазыДанных2.Расширения;
Если Ид1 <> Ид2 Тогда
Сообщить(" Конфигурация изменена");
КонецЕсли;
Для Каждого СтрокаРасширения Из Расширения2 Цикл
Имя2 = СтрокаРасширения.Ключ;
Хеш2 = СтрокаРасширения.Значение;
Хеш1 = Расширения1.Получить(Имя2);
Если Хеш1 = Неопределено Тогда
ДобавленныеРасширения.Добавить(Имя2);
Иначе
Расширения1.Удалить(Имя2);
Если Хеш2 <> Хеш1 Тогда
ИзмененныеРасширения.Добавить(Имя2);
КонецЕсли;
КонецЕсли;
КонецЦикла;
СообщитьОбИзменениях(ДобавленныеРасширения, " Добавлены расширения:");
СообщитьОбИзменениях(ИзмененныеРасширения, " Изменены расширения:");
СообщитьОбИзменениях(Расширения1, " Удалены расширения:");
Сохраняем его в файл compare.os, запускаем, меньше, чем за 20 секунд получаем результат:
Да, конечно, этот скрипт получился совсем не универсальным, и для того, чтобы сравнить состояния других баз, нужно будет менять явки и пароли в методах ПараметрыБазыДанных...().
Поэтому нужно воспользоваться библиотекой cli, которая предоставляет интерфейс для создания консольных приложений с указанием параметров.
Заключение
OneScript - это прекрасный инструмент. Сила OneScript в большом количестве готовых библиотек для него. Одна из библиотек - ibcmdrunner, упрощает работу с автономным сервером и его командами.