Обработку нужно открывать во внешней по отношению к обновляемой базе. Например в Центральной базе при принятии изменений конфигурации перифирийной базы.
Обработка блокирует работу в другой базе, удаляет все сеансы, запускает обновление (пакетный запуск, с ключом "/UpdateDBCfg"), снимает блокировку.
ВАЖНО! Обработка предназначена для работы с удаленной базой (не в той, в которой запускают обработку)! Не пытайтесь запускать её в текущей базе. Текущая база будет заблокирована, все сеансы включая текущий удалены. В результате обновление не запуститься (так как удалили сеанс), а база останется заблокированной. Если же текущий сеанс не удалять, то он помешает базе обновиться.
Если база заблокирована, то её можно разблокировать по кнопке "Разблокировать работу с базой магазина" не указывая код доступа.
Обработка написана на обычных формах, но если кто то заинтересуется статьей, то могу переписать на УФ
Обработка имеет два способа работы с базой магазина:
1. Через Новый COMОбъект("V83.COMConnector")
Взял с минимальными изменениями из этой статьи. Там всё описано:
//infostart.ru/public/1733458/
2. Через Новый АдминистрированиеСервера
Анонс метода:
Для работы с этой вкладки на сервере удаленной базы должен быть расшарен порт 1545 и установлен Сервер Администрирования (//infostart.ru/1c/articles/810752/).
Выкладываю саму процедуру работы через Новый АдминистрированиеСервера
Процедура СоединитьсяССерверомМагазина(СтруктураДействий) Экспорт
БлокироватьСеансыВБазе = ПрочитатьДействие(СтруктураДействий, "БлокироватьСеансыВБазе");
РазблокироватьСеансыВБазе = ПрочитатьДействие(СтруктураДействий, "РазблокироватьСеансыВБазе");
ТолькоНайтиБазы = ПрочитатьДействие(СтруктураДействий, "ТолькоНайтиБазы");
ВыгнатьВсехИзБазы = ПрочитатьДействие(СтруктураДействий, "ВыгнатьВсехИзБазы");
Агент = Новый АдминистрированиеСервера(ИмяСервера, 1545);
//Агент.ВыполнитьАутентификацию();
Clusters = Агент.ПолучитьКластеры();
Для Каждого Кластер из Clusters Цикл
Кластер.ВыполнитьАутентификацию();
ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Подключились к рабочему процессу кластера " + СокрЛП(Кластер.ИмяКомпьютера));
МассивИнформационныхБаз = Кластер.ПолучитьИнформационныеБазы();
НашлиБазу = Ложь;
Для каждого InfoBase Из МассивИнформационныхБаз Цикл
Если ТолькоНайтиБазы = Истина Или ИмяБазы = "" Тогда
ОбщегоНазначенияКлиентСервер.СообщитьПользователю("База: " + СокрЛП(InfoBase.Name));
Если ИмяБазы = "" Тогда
НашлиБазу = Истина;
ИмяБазы = СокрЛП(InfoBase.Name);
ИначеЕсли Врег(InfoBase.Name) = ВРЕГ(ИмяБазы) Тогда
НашлиБазу = Истина;
ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Нашли базу: " + СокрЛП(InfoBase.Name));
КонецЕсли;
Иначе
Если Врег(InfoBase.Name) = ВРЕГ(ИмяБазы) Тогда
НашлиБазу = Истина;
InfoBase.ВыполнитьАутентификацию(ИмяПользователя, ПарольПользователя);
ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Залогинились в базе: " + СокрЛП(InfoBase.Name));
Если БлокироватьСеансыВБазе = Истина Или РазблокироватьСеансыВБазе = Истина Тогда
InfoBase.БлокировкаРегламентныхЗаданий = БлокироватьСеансыВБазе;
InfoBase.ВключенаБлокировкаНачалаСеансов = БлокироватьСеансыВБазе;
Если БлокироватьСеансыВБазе = Истина Тогда
InfoBase.КодРазрешенияНачалаСеансов = КодДоступа;
InfoBase.СообщениеБлокировки = "Работа с базой временно недоступна! Идет обновление конфигурации.";
InfoBase.Записать();
ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Заблокировали базу: " + СокрЛП(InfoBase.Name) + " код доступа: " + СокрЛП(КодДоступа));
Иначе
InfoBase.СообщениеБлокировки = "";
InfoBase.Записать();
ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Разблокировали базу: " + СокрЛП(InfoBase.Name));
КонецЕсли;
КонецЕсли;
Если ВыгнатьВсехИзБазы = Истина Тогда
Сообщение = "Начато обновление Конфигурации";
МассивСеансов = InfoBase.ПолучитьСеансы();
Для каждого Cеанс Из МассивСеансов Цикл
ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Завершаем сеанс приложения " + СокрЛП(Cеанс.ИмяПриложения) + " Пользователь " + СокрЛП(Cеанс.ИмяПользователя) + " подключенного с " + СокрЛП(Cеанс.ИмяКомпьютера));
Cеанс.ЗавершитьСеанс(Сообщение);
КонецЦикла;
МассивСоединений = InfoBase.ПолучитьСоединения();
Для каждого Соединение Из МассивСоединений Цикл
Если НРЕГ(СокрЛП(Соединение.ИмяПриложения)) = "srvrconsole"
Или НРЕГ(СокрЛП(Соединение.ИмяПриложения)) = "jobscheduler"
//Или НРЕГ(СокрЛП(Соединение.ИмяПриложения)) = "ras"
Тогда
// Это служебные сеансы, их не дает отключать
Продолжить;
КонецЕсли;
Попытка
ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Отключаем соединие " + СокрЛП(Соединение.ИмяПриложения) + " ВремяУстановкиСоединения: " + СокрЛП(Соединение.ВремяУстановкиСоединения) + " ИмяКомпьютера: " + СокрЛП(Соединение.ИмяКомпьютера));
Соединение.Отключить();
Исключение
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ОписаниеОшибки());
КонецПопытки;
КонецЦикла;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Если НашлиБазу = Ложь И Не ИмяБазы = "" Тогда
ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Не нашли базу " + СокрЛП(ИмяБазы) + " на кластере " + СокрЛП(Кластер.ИмяКомпьютера));
КонецЕсли;
КонецЦикла;
КонецПроцедуры // СоединитьсяССерверомМагазина
Процедура ОбновлениеКонфигурации(ИмяБазы, ПутьКФайлуЛога) Экспорт
Попытка
Кавычка = """";
КодВозврата = Неопределено;
ПутьКБазе = "Srvr=""" + СокрЛП(ИмяСервера) + """;Ref=""" + СокрЛП(ИмяБазы) + """";
СтрокаКоманды = Кавычка + КаталогПрограммы() + "1cv8.exe" + Кавычка + " DESIGNER"
+ " /IBConnectionString " + ПутьКБазе
+ " /N " + Кавычка + ИмяПользователя + Кавычка
+ " /P " + Кавычка + ПарольПользователя + Кавычка
+ " /UpdateDBCfg "
+ " /UC " + Кавычка + КодДоступа + Кавычка
+ " /Out " + Кавычка + ПутьКФайлуЛога + Кавычка + " -NoTruncate"
+ " /DisableStartupMessages /DisableStartupDialogs ";
ЗапуститьПриложение(СтрокаКоманды
,
,
Истина,
КодВозврата);
Сообщить("Обновление запущено");
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Тестировалось на 8.3.20.2184.