ibcmdrunner - библиотека OneScript для работы с автономным сервером

09.01.25

Разработка - OneScript

В мире OneScript давно существуют библиотеки для облегчения работы с каким-либо классом программного обеспечения, например v8runner - помощник выполнения команд конфигуратора или gitrunner - программная обертка для запуска команд git. Есть библиотека и для работы с автономным сервером 1с. Однако библиотеке ibcmdrunner уже три года, а про нее нет ни одной публикации на инфостарте. Исправляю эту несправедливость.

В мире OneScript давно существуют библиотеки для облегчения работы с каким-либо классом программного обеспечения, например v8runner - помощник выполнения команд конфигуратора или gitrunner - программная обертка для запуска команд git.

Есть библиотека и для работы с автономным сервером 1с. Однако библиотеке ibcmdrunner уже три года, а про нее нет ни одной публикации на инфостарте. Исправляю эту несправедливость.

 

Что за автономный сервер?

Прежде чем начнем, пару слов о самом автономном сервере. Впервые эта технология появилась в платформе 8.3.14, причем автономный сервер тогда служил только заменой кластера серверов, с особенной фишкой - встроенным веб-сервером. Позже автономный сервер стал гораздо бОльшим, чем средство доступа клиентских приложений к базе 1с. Для меня он стал интересен, когда с помощью автономного сервера стало возможно выполнять операции с исходным кодом и всякие штуки девопс. Сравним описания автономного сервера, данные самим вендором.

Это с 8.3.14:

Автономный сервер - это специальное серверное приложение, которое предназначено для обеспечения работы с информационной базой клиентских приложений: тонкий клиент, веб-клиент, мобильный клиент.

А это уже с последних версий:

Автономный сервер - это специальное серверное приложение, которое предназначено для обеспечения работы с информационной базой управляемого приложения любого клиентского приложения и Конфигуратора.

Автономный сервер представляет из себя утилиты ibsrv (собственно, само приложение автономного сервера) и ibcmd (приложение командной строки для управления автономным сервером).

Сейчас это целый комбайн. Подробнее можно почитать в статьях и посмотреть в видео:

Автономный сервер. Часть 1 - новый вариант сервера

Автономный сервер. Часть 2 - утилита управления

Вебинар "5 примеров использования ibcmd на каждый день" (канал Инфостарт)

 

Что за OneScript?

Все уже наверное знают, но повторение не будет лишним.

 

OneScript – это независимая кроссплатформенная реализация виртуальной машины, исполняющей скрипты на языке 1С:Предприятие

Смотрите oscript.ioOneScript для новичков и прочие материалы по ссылке

 

Что такое 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, упрощает работу с автономным сервером и его командами.

OneScript ibcmd ibsrv

См. также

Работа с интерфейсом OneScript Программист Платформа 1С v8.3 Россия Бесплатно (free)

Графический интерфейс с применением веб-технологий в коллекцию инструментария сценарного языка OneScript. Библиотека создает десктопное приложение имеющее декларативный пользовательский интерфейс (GUI), построенный веб-браузером. Возможности веб-технологий по представлению информации огромны. Эти возможности соответственно добавляются и к сценариям OneScript.

23.01.2025    225    0    ahyahy    4    

7

OneScript Программист Бесплатно (free)

Вместе создадим библиотеку на Oscript с нуля, шаг за шагом: от базовой структуры проекта до перевода на ОСень. Разберем структуру проекта, работу с файлом конфигурации, логирование, уведомления, консольный интерфейс и многое другое. Освоим весь цикл разработки и сделаем первый шаг к созданию собственных инструментов на Oscript!

13.01.2025    2121    leobrn    16    

57

OneScript Программист Платформа 1С v8.3 Бесплатно (free)

Если вы, так же как и я, давно хотели попробовать сделать что-то свое на OneScript, но никак не могли к нему подступиться, то, возможно, эта статья пригодится вам в качестве некоего вводного материала.

10.01.2025    1880    KamranV21    12    

36

OneScript Программист Бесплатно (free)

Отгремел Infostart Tech Event 2024, топовое событие в мире 1С-разработки, традиционно проходящее в Санкт-Петербурге. Ваш покорный слуга в этот раз отмечал там 10-летний юбилей проекта OneScript. Отмечание проводилось в форме игры-соревнования по забегу роботов в лабиринте. Участники пытались написать алгоритм движения робота на языке 1С и сделать это быстрее других. О том, как это было – под катом.

28.10.2024    1701    Evil Beaver    11    

25

OneScript Программист Бесплатно (free)

OneScript – это скриптовый движок для автоматизации всего и вся. О том, как OneScript помогает в разработке скриптов на языке 1С, пойдет речь в статье.

10.10.2024    3893    ardn    2    

9

Инструментарий разработчика OneScript Программист Руководитель проекта Бесплатно (free)

Все мы хотя бы раз работали с конструктором запросов. Результатом его работы является синтаксически верный запрос, оформленный по некоторому стандарту. Нравится - не нравится, а привыкаешь быстро, и на запрос, написанный руками, уже не хочется смотреть... А почему бы не попробовать сделать то же самое с исходным кодом 1С? Ну я и попробовал...

23.09.2024    810    0    stopa85    5    

5

Групповая разработка (Git, хранилище) OneScript Программист Платформа 1С v8.3 Бесплатно (free)

Скрипт для работы с SonarQube и локальным репозиторием Git.<br> Цель проекта – возможность выполнить быструю проверку качества кода перед тем, как помещать доработки в рабочее хранилище. В Sonar и Git выгружается не вся конфигурация, а только объекты из заданного списка.<br> https://github.com/vkrivov/go/

02.07.2024    5051    vkrivov@yandex.ru    8    

20

DevOps и автоматизация разработки OneScript Системный администратор Программист Стажер Бесплатно (free)

Рассмотрим создание самоформирующейся документации через комментарии и соглашения: как это сделать и зачем, с описанием полного цикла от исходников конфигурации до странички в интернете

17.06.2024    6980    bayselonarrend    5    

62
Оставьте свое сообщение