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

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С Системный администратор Разработчик 1С 8.3 Абонемент ($m)

Если обновление 1С уже падало с "Записи регистра сведений стали неуникальными", вы знаете, что платформа называет только первый такой регистр, и каждый следующий всплывает новым запуском обновления. Проверьте заранее: снимите слепок регистров в базе с новой конфигурацией и нажмите "Проверить" в рабочей. Обработка покажет все регистры сведений, где записи после обновления совпадут по измерениям, и сами группы таких записей: укороченная строка, меньше знаков после запятой, укрупнённая периодичность, убранный из составного тип. Удалённое измерение называет, но записи по нему не считает. Что разобрать не может, называет с причиной и в "дублей не найдено" не записывает. Только чтение, без доступа к таблицам СУБД.

10 стартмани

09.11.2026    186    0    nedomolkov.ivan    0    

3

Архивирование (backup) Обновление 1С Системный администратор Разработчик 1С 8.3 Бесплатно (free)

Платформа 8.3.17, MS SQL Server: обновление конфигурации падает через 15 секунд на этапе обновления предопределённых данных, и конфигуратор при каждом входе предлагает только повторить. Проверьте у себя, когда сделана последняя полная копия базы: у нас её не было почти месяц. Разбор по минутам: что не помогло (перезапуск агента сервера 1С, перезагрузка, пакетный /UpdateDBCfg, три совета со стороны) и почему. Как ibcmd достал .dt из базы, которая не открывается, и как новую базу подставили под старым именем в кластере 1С через rac, не трогая пользователей. Простой 57 минут, потерь данных нет. Отдельно ошибки ИИ-агента Claude, который работал на сервере, и порядок действий на случай, если это случилось у вас.

03.11.2026    546    nedomolkov.ivan    12    

5

Обновление 1С Разработчик 1С:Предприятие 8 1С:ERP Управление предприятием 2 Бесплатно (free)

Вторая часть серии о переходе ERP 2.5 на 2.6. Я сравнил чистые выгрузки 2.5.27.88, 2.6.1.70 и 2.6.2.59 и выписал то, чего нет в официальных описаниях версий: какие экспортные методы удалены поимённо, какие документы больше нельзя создать и при каком условии, что переименовали без предупреждения. Из двенадцати механизмов, от которых отказывается 1С, к 2.6.2 удалены только два, а большая часть удалённого к ним не относится. Отдельно разбираю, почему перехватчики &ИзменениеИКонтроль ломаются на процедурах, где поменялся только английский текст, и почему доработки выгоднее готовить сразу под 2.6.2. Будет полезно разработчикам, которые сопровождают расширения и внешние обработки на ERP 2.5.27, и тем, кто планирует сроки перехода.

20.10.2026    954    lexatsch    6    

8

Обновление 1С Разработчик 1С 8.3 1С 8.5 Абонемент ($m)

Перед обновлением типовой конфигурации обработка читает код ваших доработок — внешних обработок, отчетов и расширений — и сверяет каждое обращение к конфигурации со старым и новым релизом. Результат — один отчет по всем доработкам: файл и строка, сам фрагмент кода и понятная причина («метод теперь принимает один параметр», «значение перечисления удалено», «перехватываемый метод не найден»). Исходники релизов и обработок можно подготовить прямо из обработки — пакетным запуском Конфигуратора.

3 стартмани

19.10.2026    321    1    InShallaH    0    

3

Обновление 1С Разработчик 1С:Предприятие 8 1С:ERP Управление предприятием 2 Бесплатно (free)

1С считает, что перейти с ERP 2.5 на 2.6 не сложнее, чем обновиться между версиями длительной поддержки, а обязательным переход станет не раньше 30 апреля 2027 года. Я решил проверить это заранее на нашей доработанной ERP 2.5.27, где есть два больших расширения и 517 внешних отчётов и обработок. Форма готовности нашла четыре механизма, которые надо перевести, а про код промолчала. Проверка применимости на чистой 2.6.1 выдала 478 проблем, и настоящих среди них меньше сотни. А сверка кода со словарём изменений нашла ещё 63 проблемы, которых проверка применимости вообще не видит. Часть из них не даст открыть модуль, остальные вылезут уже у пользователей. Рассказываю, как проверить применимость расширения к 2.6.1 без записи в базу, что ловит компилятор, что ломается чаще всего и чем это заменить.

16.10.2026    651    lexatsch    0    

3

Инструментарий разработчика Обновление 1С Разработчик 1С 8.3 Бесплатно (free)

Бесплатная внешняя обработка: до обновления типовой показывает, какие ваши внешние обработки и печатные формы после него упадут. Находит в их коде вызовы общих модулей и менеджеров типовой и сверяет каждый с текущей конфигурацией и с выгрузкой нового релиза: есть ли метод, экспортный ли, сходится ли число параметров. Обработки берёт из справочника или из папки .epf и .erf, без конфигуратора. У каждого вызова статус, строка и причина.

29.09.2026    1189    140    nedomolkov.ivan    2    

9
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
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 736 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)Запускается задание от пользователя с полными правами
Для отправки сообщения требуется регистрация/авторизация