Информирование
Имеет смысл информировать пользователей о том, что с обменами пришло обновление конфигурации.
Для этого в модуле приложения достаточно вставить периодически вызываемую функцию вида:
Функция ПостояннаяПроверкаРедкая() Экспорт
//Раз в 5 минут
Если ПланыОбмена.ГлавныйУзел() <> НеопределеноТогда
Если КонфигурацияИзменена() Тогда
ксПредупреждение("Конфигурация базы данных изменена, чтобы не образовался простой в обменах, обновите конфигурацию или свяжитесь с поддержкой 1с!" + Символы.ПС +
"Для обновления конфигурации на точке достаточно перезайти в 1С под Администратор1, при этом будет выдан запрос на обновление. " + ТекущаяДата());
КонецЕсли;
КонецЕсли;
КонецФункции
Когда придут изменения, будет выдано окошко вида:
Обновление
Само обновление выполняется в функции ОбновитьКонфигурациюБазыДанных. Ее можно вставить при начале работы приложения или добавить в пункт меню интерфейса. Когда пользователь увидит предупреждение, он сможет выполнить обновление, когда ему будет удобно:
Функция ОбновитьКонфигурациюБазыДанных() Экспорт
//Если конфигурация изменена, тогда нужно выполнить ее обновление...
флКонфигурацияИзменена = КонфигурацияИзменена();
СтрокаСоединения = СтрокаСоединенияИнформационнойБазы();//File="C:\1cv8\Base".
ЭтоФайловая = Найти(СтрокаСоединения, "File="); //Заменить потом на типовую функцию.
Если флКонфигурацияИзменена И ЭтоФайловая Тогда
//Смотрим, чтобы в базе никого не сидело
~ПовторнаяПопыткаОбновления:
флОбновлять = истина;
Если ксВопрос(
"Внимание! Пришли изменения конфигурации. " + Символы.ПС +
"Рекомендуется их принять." + Символы.ПС +
"Закройте все остальные 1С на всех компьютерах точки и нажмите ""ДА"" для Обновления." + Символы.ПС +
"Если после нажатия ""ДА"" выскочит красное окно ошибки, закройте его (кнопка ""Закрыть"")." + Символы.ПС +
"Если вы хотите продолжать работу без обновления (не рекомендуется) нажмите ""НЕТ""." + Символы.ПС +
"Если вы не обновляете конфигурацию, обязательно сделайте это позже в ближайшее время."+ Символы.ПС +
"ОБНОВИТЬ КОНФИГУРАЦИЮ?", РежимДиалогаВопрос.ДаНет,,КодВозвратаДиалога.Да) = КодВозвратаДиалога.Нет Тогда
флОбновлять = ложь;
КонецЕсли;
Если флОбновлять Тогда
Попытка
УстановитьМонопольныйРежим(Истина);
Исключение
ксПредупреждение("Кто-то еще работает в базе, не могу захватить базу монопольно, обновить не получается, попробуйте еще раз! " + Символы.ПС + ОписаниеОшибки());
Перейти ~ПовторнаяПопыткаОбновления;
КонецПопытки;
//Создаем и запускаем скрипт на обновление базы
СтрокаСоединения = СтрокаСоединенияИнформационнойБазы();//File="C:\1cv8\Base".
СтрокаСоединения = СтрЗаменить(СтрокаСоединения, "File=", "F");
СтрокаСоединения = СтрЗаменить(СтрокаСоединения, ";", "");
КаталогПрограммы = КаталогПрограммы();
ИмяФайлаПрограммы = КаталогПрограммы + "\1cv8.exe";
КоманднаяСтрокаОбновления = """" + ИмяФайлаПрограммы + """ config /Visible /NАвтообмен /P"""" /UpdateDBCfg /" +СтрокаСоединения;
//КоманднаяСтрокаЗапуска = """" + ИмяФайлаПрограммы + """ enterprise /NКассир /" +СтрокаСоединения;
//Запускаем только несколько раз, должно помочь
ТекстСкрипта = "";
Для Инд = 1 по 10 Цикл //10 попыток обновить конфигурацию
ТекстСкрипта = ТекстСкрипта + КоманднаяСтрокаОбновления + Символы.ПС;
ТекстСкрипта = ТекстСкрипта + "if not errorlevel 1 goto pend " + Символы.ПС;
КонецЦикла;
ТекстСкрипта = ТекстСкрипта + "
|:pend";
//ТекстСкрипта = ТекстСкрипта + КоманднаяСтрока + Символы.ПС;
//ИмяФайлаСкрипта = КаталогВременныхФайлов() + "update_1s_counter_sap.cmd";
ИмяФайлаСкрипта = КаталогВременныхФайлов() + "run.bat";
Ф = Новый ТекстовыйДокумент();
Ф.УстановитьТекст(ТекстСкрипта);
Ф.Записать(ИмяФайлаСкрипта, КодировкаТекста.OEM);
Попытка
ЗапуститьПриложение(ИмяФайлаСкрипта,,ложь);
Исключение
ксПредупреждение("Произошла ошибка запуска скрипта обновления: " + ИмяФайлаСкрипта + " Ошибка: " + ОписаниеОшибки());
Перейти ~ПовторнаяПопыткаОбновления;
КонецПопытки;
//Завершаем работу 1С
ЗавершитьРаботуСистемы(истина);
КонецЕсли;
КонецЕсли;
КонецФункции
Суть работы алгоритма обновления – сначала проверяется, что все пользователи вышли из 1С, потом закрывается текущий сеанс, формируется командный файл run.bat со скриптом обновления конфигуратора и вызывается 10 раз. Процесс вызова конфигуратора в режиме обновления визуализируется, чтобы пользователи полностью могли контролировать и осознавать процесс.
Информационное сообщение с инструкцией пользователю по обновлению имеет вид:
Если не получилось заблокировать 1С, выдается сообщение вида: