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

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(Кластер,Сеанс); 
				КонецЕсли;  						
			КонецЦикла; 						
		КонецЕсли; 
	КонецЦикла;
КонецПроцедуры

 

Вступайте в нашу телеграмм-группу Инфостарт

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

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

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

См. также

Нейросети Обновление 1С Бесплатно (free)

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

05.06.2026    2628    wonderboy    3    

17

Обновление 1С Программист 1С 8.3 1С:ERP Управление предприятием 2 Бесплатно (free)

В данной статье рассмотрена ошибка, с которой мы столкнулись после обновления «1С:ERP Управление предприятием» с релиза 2.5.7 на релиз 2.5.22. Для модификации операций закрытия месяца у клиента было отдельное расширение, в котором были модифицированные копии типовых методов.

27.05.2026    1189    1c-izh    14    

9

Перенос данных 1C Обновление 1С Системный администратор Программист 1С 8.3 1С:Управление торговлей 11 Россия Абонемент ($m)

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

1 стартмани

07.05.2026    495    0    gzharkoj    0    

2

Обновление 1С Программист 1С 8.3 1С:ERP Управление предприятием 2 Отраслевые Сельское хозяйство и рыболовство Бесплатно (free)

В одном из наших проектов сложного обновления с «1С:ERP 2.5« присутствовал интегрированный модуль «1С:Птицеводство» с неопределенным релизом и накопленными дефектами предыдущих слияний. Прямое обновление было нецелесообразно из-за рисков некорректной реструктуризации. В статье описан метод идентификации версии через анализ метаданных и алгоритм удаления неактуальных объектов перед финальным переходом.

30.04.2026    585    1c-izh    0    

4

Обновление 1С Программист 1С 8.3 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1C:ERP Бесплатно (free)

В ходе тестового обновления нетиповой конфигурации «1С:ERP» с версии 2.5.7.201 на 2.5.22.129 после завершения всех регламентных процедур были зафиксированы массовые отрицательные остатки по складам.

17.04.2026    860    1c-izh    1    

5

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

Проект обновления «1С:ERP Управление холдингом» с 3.2.1 на 3.2.8 принёс задачку: логика проверки заполнения обязательных реквизитов «переехала» с момента проведения на этап первичной записи документа.

16.04.2026    790    1c-izh    3    

3

Обновление 1С Программист 1С 8.3 Россия Абонемент ($m)

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

1 стартмани

09.04.2026    669    5    NAlex    0    

2

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

Однажды к нам на проект сложного обновления пришла конфигурация «1С: Документооборот КОРП», которую требовалось обновить в технологическое окно 1 час. И мы обновили базу так, как это делают в подобных случаях с ERP — используя механизм «Обновление через копию».

06.04.2026    3966    1c-izh    9    

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

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