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

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С v8.3 Бесплатно (free)

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

02.07.2025    719    1c-izh    2    

9

DevOps и автоматизация разработки Обновление 1С Системный администратор Программист 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление холдингом Абонемент ($m)

Продолжаем делиться опытом ICL SOFT – в этой статье рассказываем о сложном обновлении сильно доработанной конфигурации "1С:ERP Управление холдингом с версии 3.1.8.15" до актуальной версии редакции 3.2. Публикации о сложных обновлениях, которые можно найти в открытых источниках, содержат мало подробной информации об использованных инструментах и решениях. Часто в них отсутствует информация о том, что находится под капотом этих решений. Будем рады, если наша статья окажется полезной

1 стартмани

01.07.2025    725    vladimir_iclsoft    1    

15

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

Тестовая база обновлена через все ключевые релизы, всё протестировано, остатки сведены, вы готовы обновить «боевую» базу, но…по замерам для этого потребуется целая неделя, а у вас есть всего пара выходных. Знакомая ситуация? Расскажем, как увеличить скорость отработки промежуточных конфигураций!

18.06.2025    1900    1c-izh    12    

8

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

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

04.06.2025    3090    1c-izh    11    

16

Обновление 1С 1С v8.3 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Абонемент ($m)

Добавление в Справочник "Статьи затрат" отсутствующих предопределённых элементов.

1 стартмани

23.05.2025    394    0    qrw    0    

0

БСП (Библиотека стандартных подсистем) Обновление 1С Программист 1C:ERP Бесплатно (free)

В данной статье рассмотрен один из вариантов добавления собственных обработчиков обновления в расширении конфигурации. При смене версии расширения - автоматический вызов процесса обновления информационной базы.

29.04.2025    2299    krasnoshchekovpavel    7    

18

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

Методика, описанная в статье, выработана при переезде с 1С:ДО 2.1 на 1С:ДО 3.0. Может также применяться при переходе с 1С:УПП на 1C:ERP, 1C:ERP на 1C:ERP УХ и т. п. Учтены все необходимые доработки при переезде на новую конфигурацию и предупреждены возможные ошибки.

21.04.2025    2546    PROSTO-1C    4    

4

Обновление 1С Программист 1С v8.3 1C:Бухгалтерия 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1C:ERP Абонемент ($m)

Внешняя обработка для обновления расширений и дополнительных обработок 1С из GitHub. Поддерживает как публичные, так и приватные репозитории, фильтрацию релизов по версии конфигурации, скачивание .cfe, .epf, .erf.

1 стартмани

15.04.2025    1983    7    Aleksandr    0    

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

А жаль, освещено много, но все не очень рабочее.
Может покажете реализацию:
ЗаблокироватьСеансы, ЗакрытьСеансы, МодульОбменаНовый.СнятьБлокировкуПодключений();
Если не трудно
5. vit59 60 17.06.22 08:03 Сейчас в теме
4. jan27 733 13.06.22 10:29 Сейчас в теме
на файловых базах было бы актуальнее
e.kogan; Bad_Aleks; +2 Ответить
6. vit59 60 17.06.22 08:04 Сейчас в теме
(4)у меня стояла актуальная задача сделать для серверной базы )
7. vit59 60 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 60 16.11.22 09:02 Сейчас в теме
(9) смотрите от кого запущено задание,
в таск менеджере добавьте колонку command line
11. user983240 16.11.22 10:48 Сейчас в теме
(10)Еще вопрос, как можно узнать что обновление прилитело динамически?
13. vit59 60 16.11.22 12:32 Сейчас в теме
(11) Платформа 1С распознет события изменения конфигурации и прихода данных
" Если не ПланыОбмена.ГлавныйУзел()=Неопределено и КонфигурацияИзменена() тогда " - читайте внимательно
14. user983240 17.11.22 12:42 Сейчас в теме
(13)Это понятно, я хотел сделать чтобы если обновление динамически то обновить без закрытия сеансов а если обновление с реструктуризацией тогда выкидывать и обновить
15. vit59 60 24.11.22 07:18 Сейчас в теме
(14)
обновление динамически
- что значит ?
если имеете ввиду обновлнние фоновом режиме, тогда лучше им не пользоваться.
в инете много инфы почему.
12. user983240 16.11.22 10:56 Сейчас в теме
(10)Запускается задание от пользователя с полными правами
Оставьте свое сообщение