Автоматическое подтверждение легальности обновления базы или как обновить 80 типовых баз 1С за 5 часов

Публикация № 1057624

Администрирование - Сервисные утилиты

Автоматическая легальность обновления баз

6
Расширение для конфигураций 1С для автоматического подтверждения легальности обновления и выполнения обработчиков обновления при пакетном автоматическом обновлении большого числа баз 1С. А также сам модуль обработки по автоматическому обновлению баз.

Досталось мне по наследству выполнение обновления баз 1С  Бухгалтерии 3 в количестве 80 шт  и ЗУП 3 - 80 шт(измененные, но не сильно. Обновлять только из хранилища).  У нас конечно написана конфа по обслуживанию такого количества баз и даже пакетное обновление реализовано, в том числе и из хранилища для измененных конфигураций, но ...  все этапы этого варианта обновления заточены на участие Админа. 

1) Сначала надо зайти на сервер и завершить все сеансы оставленные пользователями.

2) Запустить написанную предшественниками не знаю на чем программку по блокировке регламентных заданий на сервере

3) Скачать новый  *.cfu файл обновления для типовых баз 

3а) Обновить изменную базу в хранилище из скачанного cfu файла

4) Сформировать пакетные bat файлы (обычно делим на 4 потока - 4 файла)

5) Запустить  пакетные файлы и дождаться их завершения.

6) Запустить каждый экземпляр базы в режиме Предприятия, подтвердить легальность и закрыть базу.

7) Запустить программку по разблокировке регламентных заданий.

Готово !!!  Мы провели незабываемое время у компа и обновили 80 типовых баз, потратив на это все выходные. 

Проделав дважды такую операцию, мне стало грустно и начал искать пути полной автоматизации этого процесса.   В итоге было обнаружено пару достойных наработок по пакетному обновлению в открытом доступе и начался процесс их переработки и адаптации под мои нужды.  Но у всех найденных вариантов был один существенный недостаток -  подтвердить легальность и закончить обновление они не могли.  Поэтому моя задача не автоматизируется на 100 % без этого.  

Начал изучать механизм завершения обновления через отладчик и искать пути решения моей задачи. В итоге были найдены точки перехвата событий при первом открытии обновленной конфигурации и  мои труды и старания вылились в расширение для конфигурации, которое умеет само подтверждать легальность обновления, дожидаться выполнения обработчиков и закрывать 1с Предприятие.  Выполнено это в виде расширения что бы не вскрывать типовые БУХи . Со вскрытой конфигурацией, в частности  ЗУП 3, это расширение тоже работает, т.к. используются точки входа и выхода типовых процедур.

В итоге, собрав все в одну разработку и дополнив ее механизмом  отрубания пользователей от текущей базы через COM соединение с агентом сервера 1С перед стартом обновления, получил полностью 100% автоматический механизм обновления типовых баз 1С.   Теперь процесс обновления выглядит так :

1)  В обработке обновления выбираем тип базы ( Бухгалтерия ) и номер потока  (все базы в конфе обслуживания уже поделены на потоки )

2) Нажимаем кнопку "Выполнить"  

и ...  ложимся спать.    Все базы выбранного потока обновлены, Легальность обновления подтверждена, Обработчики обновления выполнены. 

Что делает обработка автоматически сама:

1) Определяет текущий релиз базы

2) Скачивает с сайта 1с файл с информацией об обновлении данного типа конфигурации. (Бух, ЗУП, УТ...)

3) Проверяет наличие в каталоге конфигураций доступного обновления из списка.

4) Если нужного обновления нет, скачивает его автоматически с сайта 1С (нужен логин и пароль для доступа на сайт 1С) и размещает его в каталог обновлений.

5) Отрубает на сервере 1С все сеансы пользователей от текущей базы

6) Запускает обновление конфигурации и базы данных.

7) Если обновились до последнего релиза и больше обновлять не надо, запускает 1С в режиме Предприятия для подтверждения легальности обновления и выполнения отложенных обработчиков обновления

и так по кругу пока не кончится список баз. 

Расширение подтверждения легальности протестировано на БП 3 релиз 3.0.69.32 , ЗУП 3 релиз 3.1.9.159 работающих на MS-SQL сервере. Для файловых вариантов баз тоже должно работать, но мною не тестировалось, т.к. у нас таких баз нет. 

Не сомневаюсь что для Торговли, Розницы и других типовых конфигураций от 1С это расширение будет работать. 

Дополнительно прилагаю модуль обработки по автоматическому обновлению информационных баз, в котором реализованы все вышеописанные автоматические процедуры обновления. Его с легкостью можно адаптировать под собственные нужды и вариант работы (только для программистов) т.к. написан на родном языке 1С.

Данная обработка работает в самописной конфигурации по обслуживанию  информационных баз. 

P.S. Да я знаю про "Обновлятор". В бесплатной версии он не работает с таким количеством баз, были мысли приобрести полную версию, но было интересно решить данную задачу самому, т.к. половина функционала уже было в нашей базе обслуживания.

 

Кусок основного кода из обработки обновления

        // Прверка наличия обновлений
        МассивОбновлений = ВыполнитьЗагрузкуСпискаОбновлений(ПараметрыComБазы.ТекущаяВерсия);
        Если МассивОбновлений = Неопределено Тогда 
            Возврат;
        КонецЕсли;     

        КоличествоДоступныхОбновлений = МассивОбновлений.Количество(); 
        Если КоличествоДоступныхОбновлений = 0 Тогда
            Если ОбновлениеБыло Тогда
                СообщитьПользователю(НСтр("ru = 'Обработчики обновления информационной базы.'"));
                КомандаПакетногоОбновления = СтрШаблон("""%1"" ENTERPRISE %2 /RunModeManagedApplication",
                ПараметрыComБазы.ПутьКПлатформе, СтрокаСоединения);
                ЗапуститьПриложение(КомандаПакетногоОбновления, , Истина, КодВозврата);
                Если КодВозврата = 0 Тогда
                    СообщитьПользователю(НСтр("ru = 'Обработчики выполнены.'"));
                Иначе
                    СообщитьПользователю(НСтр("ru = 'Ошибка при выполнении обработчиков.'"));
                 //   Возврат;
                КонецЕсли;
            КонецЕсли; 
            
            СообщитьПользователю(СтрШаблон(НСтр("ru = 'Текущая версия: %1. Обновление не требуется.'"), ПараметрыComБазы.ТекущаяВерсия));
            Прервать;
        КонецЕсли;
        
        ЗагруженноеОбновлениеНайдено = Ложь;
        Для Сч = 1 По КоличествоДоступныхОбновлений Цикл
            ВерсияДляОбновления = МассивОбновлений[КоличествоДоступныхОбновлений - Сч]; 
            ФайлОбновленияВерсии = СтрШаблон("%1\%2\%3\1cv8.cfu", ПараметрыОбновления.КаталогФайловОбновления, ТипКонфигурации, ВерсияДляОбновления.Версия);
            ФайлОбновленияВерсииОбъект = Новый Файл(ФайлОбновленияВерсии);
            Если ФайлОбновленияВерсииОбъект.Существует() Тогда
                ЗагруженноеОбновлениеНайдено = Истина;
                СообщитьПользователю(СтрШаблон(НСтр("ru = 'Текущая версия: %1. Доступна для обновления версия: %2.'"), 
                    ПараметрыComБазы.ТекущаяВерсия, ВерсияДляОбновления.Версия));
                Прервать;
            КонецЕсли;
        КонецЦикла;
        
        // Загрузка файлов обновления
        Если Не ЗагруженноеОбновлениеНайдено Тогда
            ВерсияДляОбновления = МассивОбновлений[КоличествоДоступныхОбновлений - 1]; 
            ФайлОбновленияВерсии = СтрШаблон("%1\%2\%3\1cv8.cfu", ПараметрыОбновления.КаталогФайловОбновления, ТипКонфигурации, ВерсияДляОбновления.Версия);
            СообщитьПользователю(СтрШаблон(НСтр("ru = 'Текущая версия: %1. Доступна для загрузки версия: %2 (Поставщик %3, размер %4).'"), 
            ПараметрыComБазы.ТекущаяВерсия, ВерсияДляОбновления.Версия, ВерсияДляОбновления.Поставщик, ВерсияДляОбновления.РазмерФайлаОбновления));
            Если НЕ ПолучитьФайлыОбновлений(ТипКонфигурации, ВерсияДляОбновления) Тогда
                Возврат;
            КонецЕсли;
        КонецЕсли;
        
        
        // Отрубим сеансы пользователей для серверной базы 
        Если ПараметрыПодключения.ВариантРаботыИнформационнойБазы = 1 Тогда
            Попытка
                СообщитьПользователю(НСтр("ru = 'Отрубаем все сеансы пользователей с информационной базой.'"));
                Коннектор = Новый COMОбъект("v83.COMConnector");
                Если СтрНайти(ИмяСервера1СПредприятия,":")>0 Тогда    // Если используется не стандартный порт 1541 или он передан в имени сервера, то в номере порта "1" надо заменить на "0"
                      Конект = Лев(ИмяСервера1СПредприятия,СтрДлина(ИмяСервера1СПредприятия)-1) + "0";
                Иначе
                    Конект = строка(ИмяСервера1СПредприятия);
                КонецЕсли; 
                Агент = Коннектор.ConnectAgent(Конект);

                Кластеры = Агент.GetClusters();
                Для каждого Кластер из Кластеры Цикл
                    Агент.Authenticate(Кластер,,);
                    Процессы = Агент.GetWorkingProcesses(Кластер);
                    
.......

.......

        
        // Создание резервной копии выгрузкой DT
        // В нашем варианте нет смысла в использовании
                    //СообщитьПользователю(СтрШаблон(НСтр("ru = 'Создание резервной копии информационной базы (%1).'"), ИмяВременногоФайла));
                    //КомандаПакетногоАрхивирования = СтрШаблон("""%1"" CONFIG %2 /DumpIB %3 /OUT %4 -NoTruncate",
                    //ПараметрыComБазы.ПутьКПлатформе, СтрокаСоединения, СтрокаДампа, СтрокаЛогов);
                    //ЗапуститьПриложение(КомандаПакетногоАрхивирования, , Истина, КодВозврата);
                    //Если КодВозврата = 0  Тогда
                    //    СообщитьПользователю(НСтр("ru = 'Резервная копия информационной базы успешно создана.'"));
                    //Иначе
                    //    СообщитьПользователю(НСтр("ru = 'Ошибка при создании резервной копии информационной базы.'"));
                    //    Возврат;
                    //КонецЕсли;
        
        // Обновление информационной базы                                                                                                                                                              
        СообщитьПользователю(НСтр("ru = 'Обновление информационной базы.'"));
        КомандаПакетногоОбновления = СтрШаблон("""%1"" CONFIG %2 /UpdateCfg ""%3"" /UpdateDBCfg /DisableStartupMessages /OUT %4 -NoTruncate",
        ПараметрыComБазы.ПутьКПлатформе, СтрокаСоединения, ФайлОбновленияВерсии, СтрокаЛогов);
        ЗапуститьПриложение(КомандаПакетногоОбновления, , Истина, КодВозврата);
        Если КодВозврата = 0 Тогда
            СообщитьПользователю(НСтр("ru = 'Информационная база успешно обновлена.'"));
            ОбновлениеБыло = Истина;
        Иначе
            СообщитьПользователю(НСтр("ru = 'Ошибка при обновлении информационной базы.'"));
            Возврат;
        КонецЕсли;
        
    КонецЦикла;
    
КонецПроцедуры

 

6

Скачать файлы

Наименование Файл Версия Размер
Расширение "Легальность"
.cfe 10,41Kb
31.05.19
5
.cfe 10,41Kb 5 Скачать
Модуль обработки
.txt 55,91Kb
08.05.19
4
.txt 55,91Kb 4 Скачать

См. также

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо
1. Sedaiko 49 08.05.19 13:30 Сейчас в теме
я без расширений все провернул https://infostart.ru/public/1041193/
просто в после обновления и принятия изменений запустил внешнюю обработку в командной строке (через пользователя с отключеной защитой от опасных действий) с вызовом процедуры глобального модуля "обновить" и последующем закрытием формы. И ни какого расширения не нужно.
3. VPanin56 08.05.19 13:51 Сейчас в теме
(1) В твоем посте расписана работа скрипта, и ни слова про запуск и прохождение легальности обновления. Вариант с запуском внешней обработки рассматривался, но был откинут.
Кстати один из вариантов был другой - не запуск в режиме Предприятия, а соединение по COM и запуск определенных процедур из БСП. Но тоже был откинут, т.к. результаты тестов были 50 / 50. Это не устроило.
Поэтому и пришел к расширению.
4. Sedaiko 49 08.05.19 13:56 Сейчас в теме
(3) я изначально COM откинул - так как под от только под виндой и постоянные проблемы с версиями платформ. И да. у меня все равно придется кому-то поставить флажек "легальность", но после него уже не будут выполняться процедуры обновления, так как они уже выполнены обработкой.
Типа того:
echo $(date +%x/%X)" Выполняем процедуры обновления в режиме Предприятия" >> $LOG_FILE
/opt/1C/v8.3/x86_64/1cv8 ENTERPRISE /IBConnectionString"Srvr="""$SERVER""";Ref="""$DB""";" /N$USR /P$PWD /UC$BLOCK_CODE /Out"/home/usr1cv8/out_"$DB".txt" /DumpResult"/home/usr1cv8/DumpResult_"$DB".txt" /Execute"$CUR_PATH/update.epf" /C"ОтключитьЛогикуНачалаРаботыСистемы"

Причем параметр ОтключитьЛогикуНачалаРаботыСистемы заложен в типовые конфигурации для обновления агентом сервиса (см 1СFresh)
5. VPanin56 16 08.05.19 14:19 Сейчас в теме
(4) Так вот как раз "Кто то должен поставить галочку и начать ОК" меня и не устраивало при обновлении 80 баз. Мое расширение активируется только при первом запуске в режиме Предприятия после обновления конфигурации, перехватывает событие подтверждения легальности, подтверждает его и запускает процедуры обновления. И все это происходит автоматически и без участия человека. А потом закрывает 1С Предприятие.
6. Sedaiko 49 08.05.19 14:24 Сейчас в теме
(5) Я в своем варианте говорю Вам про то, что процедуры обновления однозначно выполняются. Можно cfu-хи друг за другом загружать, выполняя процедуры обработки. Просто после всего (всех загрузок cfu и выполнений процедур в режиме предприятия) -кто первый запустит, тот и нажмет флажек и сразу можно работать.
7. VPanin56 16 08.05.19 14:47 Сейчас в теме
(6) Отлично, спорить не буду.
Меня мой вариант устраивает завершенностью, не надо объяснять буху что за окошко у него внезапно вылезло при загрузке базы.
8. Sedaiko 49 08.05.19 14:53 Сейчас в теме
(7) Да норм все, однофамилец. Идею дарю)))
2. Sedaiko 49 08.05.19 13:31 Сейчас в теме
Кстати, для управление кластером есть целый модуль в БСП
Оставьте свое сообщение