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

09.06.22

База данных - Обновление 1С

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

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

Если узлов РИБ много, тогда эту операцию выполнять вручную очень неудобно и трудоемко, а также есть проблема висящих сеансов, которые препятствуют нормальному обновлению конфигурации.

В данной статье описывается решение, которое автоматизирует указанные задачи.

Ключевой момент: формирование и запуск скриптов в пакетном режиме.

Алгоритм кратко:

1) Регламентное задание проверяет файл обновления, если он есть, тогда запускается соответствующая процедура обновления.

2) Блокируются подключения клиентских сеансов и фоновых заданий.

3) Закрываются все существующие сеансы, за исключением текущего.

4) Выполняется обновление конфигурации.

5) Выполняется загрузка данных.

6) Снимается блокировка клиентских подключений и фоновых заданий.

Функция ОбновлениеКонфигурации() запускается регламентным заданием на стороне подчиненных узлов РИБ при выполнении условий:

    Если не ПланыОбмена.ГлавныйУзел()=Неопределено и КонфигурацияИзменена() тогда 
        ТекстСообщения2 = ТекстСообщения2+ОбновлениеКонфигурации_новый(ЕстьОшибка)+Символы.ПС;        
        Сообщение = Новый СообщениеПользователю();
        Сообщение.Текст = ТекстСообщения2;
        Сообщение.Сообщить();             
    КонецЕсли;
Функция ОбновлениеКонфигурации(ЕстьОшибка) Экспорт
    
    Если  ПланыОбмена.ГлавныйУзел()= Неопределено тогда 
            ВызватьИсключение "Фоновое обновление конфигурации предусмотрено только для узлов РИБ !!";
    КонецЕсли;
    
    Попытка         
        СтрокаСоединения = СтрокаСоединенияИнформационнойБазы ();
        Если СтрНачинаетсяС(СтрокаСоединения,"Srvr") тогда
            масс1= СтрРазделить(СтрокаСоединения,";",ложь);        
            массSrvr= СтрРазделить(масс1[0],"=",ложь);
            массRef= СтрРазделить(масс1[1],"=",ложь);
            
            Сервер_=массSrvr[1];
            База_  =массRef[1];
        иначе
            ВызватьИсключение "База должна быть серверная !!";
        КонецЕсли;
        
        КолСимволовСервер=СтрДлина(Сервер_) ;
        КолСимволовБаза=СтрДлина(База_) ;    
        
        ИмяСервера= Сред(Сервер_,2,КолСимволовСервер-2); // удаляем лишние кавычки.
        ИмяБазы=Сред(База_,2,КолСимволовБаза-2);         
        ПолныйПуть1С=""""+КаталогПрограммы()+"1cv8.exe"+""""; 
        ПутьКБазе=""""+ИмяСервера+"\"+ИмяБазы+"""";
        АдминБазы                   = СокрЛП(Константы.Логин.Получить());
        ПарольБазы                 = СокрЛП(Константы.Пароль.Получить());
        КодДоступа="123"; 
        
        Если НЕ ЗначениеЗаполнено(ИмяСервера) ИЛИ НЕ ЗначениеЗаполнено(ИмяБазы) ИЛИ НЕ ЗначениеЗаполнено(ПолныйПуть1С) 
            ИЛИ НЕ ЗначениеЗаполнено(АдминБазы) ИЛИ НЕ ЗначениеЗаполнено(ПарольБазы) Тогда             
            Сообщение = Новый СообщениеПользователю();
            Сообщение.Текст = "Обновление конфигурации невозможно! Недостаточно параметров для подключения к кластеру!!";
            Сообщение.Сообщить();             
            ВызватьИсключение "Обновление конфигурации невозможно! Недостаточно параметров для подключения к кластеру!!";                
        КонецЕсли;
        
         СоединениеСАгентом=Неопределено ;
         Кластер=Неопределено ;
         
         // ЗаблокироватьСеансы
        ЗаблокироватьСеансы (ИмяСервера,ИмяБазы,АдминБазы,ПарольБазы,КодДоступа,СоединениеСАгентом,Кластер);
        
        // ЗАКРЫТЬ сеансы
        ЗакрытьСеансы (СоединениеСАгентом,Кластер,ИмяБазы);
        
        КаталогЛогов=Константы.КаталогЛоговДиагностики.Получить();
        Если Константы.ЗаписыватьФайлЛогаРИБ.Получить() Тогда
            СтрокаЛогирования=" /Out "+ """"+ КаталогЛогов+"updateLog_1C.log"+ """" + " -NoTruncate";
        Иначе
            СтрокаЛогирования="";
        КонецЕсли;
        
        // ЗАПУСТИТЬ строку скрипта         
            ЗаголовокСтрокиЗапуска= "CMD.exe /c echo ************ %date%_%time% ************>>"+ """"+ КаталогЛогов+"updateLog_1C.log"+ """" ;
        
        // обновление конфы 
         СтрокаОбновленияКонфигурации =" & TIMEOUT /T 30 /NOBREAK & " +ПолныйПуть1С+" CONFIG /S "+ПутьКБазе+"; /N"+АдминБазы+" /P"+ПарольБазы+" /DisableStartupMessages /DisableStartupDialogs /UpdateDBCfg /UC "
        +КодДоступа+СтрокаЛогирования;
        
        // загрузка данных по РИБ 
        СтрокаЗагрузкиДаныхРИБ =  " & TIMEOUT /T 30 /NOBREAK & " + ПолныйПуть1С+ " ENTERPRISE /S "+ПутьКБазе+"; /N"+АдминБазы+" /P"+ПарольБазы+ " /DisableStartupMessages /DisableStartupDialogs /C""ЗагрузитьДанные_РИБ"" /UC "
        +КодДоступа+СтрокаЛогирования; 
        
        СтрокаЗапуска= ЗаголовокСтрокиЗапуска + СтрокаОбновленияКонфигурации + СтрокаЗагрузкиДаныхРИБ ;   
        КодЗавершения=ВыполнитьКомандуЧерезШелл (СтрокаЗапуска);         
        Возврат "Скрипты обновления запущены ..."; 
        
    Исключение
        СнятьБлокировкуПодключений () ;
        ЕстьОшибка = Истина;
        Возврат ОписаниеОшибки(); 
    КонецПопытки;     
    
КонецФункции

*****************
Функция ВыполнитьКомандуЧерезШелл (СтрокаЗапуска)
    WshShell = Новый COMОбъект("WScript.Shell");
    КодЗавершения=WshShell.Run(СтрокаЗапуска,0,0); 
    Возврат КодЗавершения;
КонецФункции

***************
Процедура ПриНачалеРаботыСистемы()        
       Если  СокрЛП(ПараметрЗапуска) = "ЗагрузитьДанные_РИБ" Тогда
        МодульОбменаНовый.ВыполнитьЗагрузкуРИБ_ВПакетномРежиме();
        МодульОбменаНовый.СнятьБлокировкуПодключений();
        ЗавершитьРаботуСистемы(Ложь);
    КонецЕсли;    
КонецПроцедуры 
Процедура ЗаблокироватьСеансы (ИмяСервера,ИмяБазы,АдминБазы,ПарольБазы,КодДоступа,СоединениеСАгентом,Кластер)
	
		НомерТекСеанса= НомерСеансаИнформационнойБазы() ;  // Номер текущего Сеанса
		
		DeniedAll = Истина ; 
		
		Соединитель = Новый COMОбъект("V83.COMConnector");
		СоединениеСАгентом = Соединитель.ConnectAgent(ИмяСервера);
		Clusters = СоединениеСАгентом.GetClusters();
		для Каждого Кластер из Clusters Цикл
			СоединениеСАгентом.Authenticate(Кластер,,); // Authenticate в кластере
			 WorkingProcesses = СоединениеСАгентом.GetWorkingProcesses(Кластер);
			Для каждого Процесс из WorkingProcesses Цикл
				РабочПроцесс= Соединитель.ConnectWorkingProcess(Процесс.HostName+":"+СтрЗаменить(Процесс.MainPort, Символы.НПП, ""));			
				РабочПроцесс.AddAuthentication(АдминБазы,ПарольБазы); // Authenticate в базе
				InfoBases = РабочПроцесс.GetInfoBases(); 
				
				// блокировка подключения
				Для каждого InfoBase  Из InfoBases Цикл
					Если Врег(InfoBase.Name)=ВРЕГ(ИмяБазы) Тогда
						InfoBase.ConnectDenied = DeniedAll;
						InfoBase.SessionsDenied  = DeniedAll;
						InfoBase.PermissionCode = КодДоступа;
						InfoBase.DeniedMessage = "Обновление конфигурации,база времено недоступна !!";					
						РабочПроцесс.UpdateInfoBase(InfoBase)
					КонецЕсли; 					
				КонецЦикла;
			КонецЦикла;  			
			
		КонецЦикла;	
	
КонецПроцедуры

Процедура ЗакрытьСеансы (СоединениеСАгентом,Кластер,ИмяБазы)
	
	НомерТекСеанса= НомерСеансаИнформационнойБазы() ;  // Номер текущего Сеанса
	ЗакрыватьСеансы= Истина; 
	// закрытие сеансов
	Базы=СоединениеСАгентом.GetInfoBases(Кластер); 		
	Для каждого База  Из Базы Цикл
		Если Врег(База.Name)=ВРЕГ(ИмяБазы) Тогда
			Сеансы = СоединениеСАгентом.GetInfoBaseSessions(Кластер,База);
			Для Каждого Сеанс из Сеансы Цикл
								
				Если (Сеанс.SessionID = НомерТекСеанса И нРег(Сеанс.AppID) = "backgroundjob" ) ИЛИ нРег(Сеанс.AppID) = "srvrconsole" Тогда     
					Продолжить;
				КонецЕсли;  						
				
				Если ЗакрыватьСеансы Тогда //TerminateSession
					СоединениеСАгентом.TerminateSession(Кластер,Сеанс); 
				КонецЕсли;  						
			КонецЦикла; 						
		КонецЕсли; 
	КонецЦикла;
КонецПроцедуры

 

обновление РИБ пакетный запуск конфигуратора предприятия скриптов из командной строки.

См. также

Обновление для КА 1.1, ЗУП 2.5, БУХ 2.0: НДС, ЕФС-1, Расчет страховых взносов, Мобилизация, Статистика, Электронные трудовые книжки, 2-НДФЛ, Регламентированная отчетность, Кадровый учет, Прослеживаемость импортных товаров

Зарплата Регламентированный учет и отчетность Кадровый учет Обновление 1С Платформа 1С v8.3 Сложные периодические расчеты 1С:Комплексная автоматизация 1.х 1С:Бухгалтерия 2.0 1С:Зарплата и Управление Персоналом 2.5 Бухгалтерский учет Налоговый учет Управленческий учет Акцизы ЕНВД ЕСН Земельный налог ИП, ПБОЮЛ, КФХ Налог на имущество Налог на прибыль НДС НДФЛ ФОМС, ЕФС Транспортный налог УСН ПСН (патентная система налогообложения) Платные (руб)

Обновления для конфигураций: КА 1.1; ЗУП 2.5; БУХ 2.0; КА 1.1 Комплексная автоматизация торговли алкогольной продукцией; КА 1.1 Комплексный учет сельскохозяйственного предприятия

19900 руб.

01.04.2020    141120    682    352    

233

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

DevOps и автоматизация разработки Обновление 1С Платформа 1С v8.3 Конфигурации 1cv8 1С:Бухгалтерия 3.0 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

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

2 стартмани

08.05.2019    24381    55    VPanin56    26    

27

Ссылочная константа содержит недопустимый ссылочный номер таблицы

Обновление 1С Платформа 1С v8.3 1С:Управление нашей фирмой 3.0 Россия Бесплатно (free)

На связи Сергей Скирдин, технический директор ИТ-интегратора «Белый код». Сегодня расскажу, как решить одну из проблем, с которой можно столкнуться при обновлении конфигурации 1С.

19.03.2024    1008    sergey.skirdin    4    

14

Скрипт для обновления базы с расширением из хранилища

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

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

22.01.2024    1223    ke.92@mail.ru    3    

25

Многопоточное обновление 1С: Управление холдингом

Обновление 1С 8.3.14 1С:Управление холдингом Абонемент ($m)

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

1 стартмани

10.01.2024    3275    saver77    18    

24

Не обновляется типовая конфигурация 1С через конфигуратор

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

Столкнулся с проблемой. Нужно было поднять до текущего релиза Розницу 2.3. Обновлял по старинке, через конфигуратор (база клиент-серверная). Указывал логин и пароль, ждал скачивания обновления и обновлял. Но после накатывания 5 релизов следующий устанавливаться не хотел, а точнее конфигуратор гордо говорил, что обновлений больше нет. Решение нашел здесь на форуме и хочу зафиксировать. Чтобы самому не забыть и передать опыт начинающим.

29.11.2023    1495    shestopalovpro    4    

7

Принудительный запуск дополнительных процедур обработки данных после обновления

Обновление 1С Платформа 1С v8.3 Конфигурации 1cv8 Россия Абонемент ($m)

Ручной запуск процедур обработки обработчиков после обновлений. Может быть полезно стажерам, консультантам, разработчикам, администраторам, всем, кто обновляет информационные базы.

1 стартмани

20.11.2023    691    9    IvanTerentev    0    

2
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. rusmil 262 10.06.22 05:00 Сейчас в теме
Правильно ли я понял, получается ваше решение работает только для серверных баз, а для локальных файловых не взлетит?
+
2. vit59 57 10.06.22 07:34 Сейчас в теме
(1) нет, не взлетит
(1)
+
3. ksvd 10.06.22 21:44 Сейчас в теме
Процедуры блокировки и закрытия сеансов не привожу, поскольку эти вопросы в Сети освещены достаточно хорошо.

А жаль, освещено много, но все не очень рабочее.
Может покажете реализацию:
ЗаблокироватьСеансы, ЗакрытьСеансы, МодульОбменаНовый.СнятьБлокировкуПодключений();
Если не трудно
+
5. vit59 57 17.06.22 08:03 Сейчас в теме
4. jan27 733 13.06.22 10:29 Сейчас в теме
на файловых базах было бы актуальнее
e.kogan; Bad_Aleks; +2
6. vit59 57 17.06.22 08:04 Сейчас в теме
(4)у меня стояла актуальная задача сделать для серверной базы )
+
7. vit59 57 17.06.22 08:11 Сейчас в теме
Примечание:

РабочПроцесс= Соединитель.ConnectWorkingProcess(Процесс.HostName+":"+СтрЗаменить(Процесс.MainPort, Символы.НПП, ""));
В строке выше фрагмент СтрЗаменить(Процесс.MainPort, Символы.НПП, "") должен выдавть число без пробелов и других лишних символов,
иначе к раб процессу невозможно будет подключтиться.
Для этого рекомендую на серевере устанавливать Региональные установки ИБ русский(Россия).
+
8. user983240 15.11.22 12:35 Сейчас в теме
Добавьте пожалуйста СнятьБлокировкуПодключений
+
9. user983240 16.11.22 08:48 Сейчас в теме
после выполнения рег задания в диспетчере зависает фоновое задание из-за чего может быть подскажите пожалуйста
+
10. vit59 57 16.11.22 09:02 Сейчас в теме
(9) смотрите от кого запущено задание,
в таск менеджере добавьте колонку command line
+
11. user983240 16.11.22 10:48 Сейчас в теме
(10)Еще вопрос, как можно узнать что обновление прилитело динамически?
+
13. vit59 57 16.11.22 12:32 Сейчас в теме
(11) Платформа 1С распознет события изменения конфигурации и прихода данных
" Если не ПланыОбмена.ГлавныйУзел()=Неопределено и КонфигурацияИзменена() тогда " - читайте внимательно
+
14. user983240 17.11.22 12:42 Сейчас в теме
(13)Это понятно, я хотел сделать чтобы если обновление динамически то обновить без закрытия сеансов а если обновление с реструктуризацией тогда выкидывать и обновить
+
15. vit59 57 24.11.22 07:18 Сейчас в теме
(14)
обновление динамически
- что значит ?
если имеете ввиду обновлнние фоновом режиме, тогда лучше им не пользоваться.
в инете много инфы почему.
+
12. user983240 16.11.22 10:56 Сейчас в теме
(10)Запускается задание от пользователя с полными правами
+
Оставьте свое сообщение