Автоматическое обновление конфигурации в узлах РИБ

При поднятии РИБ одна из существенных проблем – как автоматически обновлять конфигурацию на периферийных узлах? Научить простых пользователей заходить в конфигуратор довольно проблематично. Предлагаю довольно простое, на мой взгляд решение с минимальными доработками в конфигурацию.

Информирование

Имеет смысл информировать пользователей о том, что с обменами пришло обновление конфигурации.

Для этого в модуле приложения достаточно вставить периодически вызываемую функцию вида:

 

Функция ПостояннаяПроверкаРедкая() Экспорт

       //Раз в 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С, выдается сообщение вида:

Окно обновления конфигурации имеет вид:

Скачать