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

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

 

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

См. также

SALE! 7%

Обновление для КА 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 Комплексный учет сельскохозяйственного предприятия

18900 17577 руб.

01.04.2020    136098    647    342    

228

Осторожно: новый релиз

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

В каждой программе есть ошибка? А если интуиция подсказывает, что все это из одного источника? Тогда это закономерность. Где и как подстелить соломку в августе 2023.

21.08.2023    5164    1CUnlimited    23    

12

5 подходов при доработке конфигурации 1С, чтобы в будущем не было мучительно больно её обновлять

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

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

10.08.2023    7433    1c-izhtc    36    

16

Обновил платформу на 8.3.22 или 8.3.23 = Поломалась почта

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

Проверка настроек почтового ящика выдает ошибки. Официальный баг 1С и как его исправить.

04.07.2023    15056    VPanin56    47    

58

Ускоряем обновление ЗУП до 3.1.25.136 (3.1.26.11) с часов до минут!

Обновление 1С Платформа 1С v8.3 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

Если у Вас большая компания, то обновления могут происходить мучительно долго. А технологические окна накладывают свои ограничения. Ниже предлагается готовое решение для ускорения процесса обновления.

1 стартмани

14.06.2023    1334    2    ZAOSTG    13    

8

Изменения в программе 1С:Розница 3.0, сравнение с 1С:Розница 2.3

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

В данной программе мы рассмотрим, что нового появилось в версии 1С: Розница 3.0, основные отличия между 1С: Розница 3.0 и 1С: Розница 2.3, преимущества программы 1С Розница 3.0, как обновить программу и перейти на 1С:Розница 3.0.

25.05.2023    2167    Koder_Line    9    

1

Как мы в Авито терабайтную УХ на 29 релизов обновляли

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

Год назад нам понадобилось обновить нашу базу "Управление холдингом", которая не обновлялась 3 года. У нас получилось. Статья для тех, кому нужно пройти тот же путь.

20.05.2023    2024    mephistofel    24    

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

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