Обработка для выполнения обновления узла. Работает как регламентное задание.
Обработка загружается в дополнительные внешние обработки.
Далее нужно настроить расписание.
Принцип работы:
После выполнения обмена, при выполнении регламентного задания проверяется необходимость выполнения обновления.
Если нужно обновить — тогда всех выкинет из БД и запланирует задание на обновление конфигурации. Если обновление прошло удачно, тогда отключит выполнение задания.
Пароль администратора у меня хранится в константе, потому нужно в строке с установкой пароля ввести пароль вашего пользователя, ну и имя поменять.
Функция ЗавершитьСеансы()
Результат = Истина;
Блокировка = Новый БлокировкаСеансов;
Блокировка.Установлена = Истина;
Блокировка.Начало = ТекущаяДатаСеанса();
Блокировка.КодРазрешения = "КодРазрешения";
Блокировка.Сообщение = "Выполняется обновление. Сохраните данные и закройте 1С";
УстановитьБлокировкуСеансов(Блокировка);
Возврат Результат;
КонецФункции
Процедура ОбновлениеБД()
//Пропишем пароль пользователя
ПарольАдмина = Константы.Сударь_Администратор.Получить();
Результат = "";
Админ = Справочники.Пользователи.НайтиПоНаименованию("Администратор");
Если ЗначениеЗаполнено(Админ.ИдентификаторПользователяИБ) Тогда
ЗначХран = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(Админ.ИдентификаторПользователяИБ);
ЗначХран.Пароль = ПарольАдмина;
Попытка
ЗначХран.Записать();
Исключение
Результат = "Не удалось записать пользователя.";
Конецпопытки;
КонецЕсли;
//Запишем батник для обновления
Если Результат = "" Тогда
СтрокаСоединения = СтрокаСоединенияИнформационнойБазы();
Если лев(СтрокаСоединения,4) = "Srvr" Тогда
Сервак = Лев(СтрокаСоединения,Найти(СтрокаСоединения,";Ref="));
НачалоИБ = Найти(СтрокаСоединения,";Ref=")+5;
НужноВзять = СтрДлина(СтрокаСоединения)- НачалоИБ;
База = Прав(СтрокаСоединения,НужноВзять);
Сервак = СтрЗаменить(Сервак, "Srvr=", "");
Сервак = СтрЗаменить(Сервак, ";", "");
База = СтрЗаменить(База, ";", "");
СтрокаСоединения = Сервак+""+База;
СтрокаСоединения = СтрЗаменить(СтрокаСоединения, """", "");
КаталогПрограммы = КаталогПрограммы();
ИмяФайлаПрограммы = КаталогПрограммы + "1cv8.exe";
КоманднаяСтрокаОбновления = "echo off
|cls
|"""+ИмяФайлаПрограммы+""" CONFIG /S"""+СтрокаСоединения+""" /N""Администратор"" /P"""+ПарольАдмина+""" /DisableStartupMessages /UpdateDBCfg /UC""КодРазрешения""
|"""+ИмяФайлаПрограммы+""" ENTERPRISE /S"""+СтрокаСоединения+""" /N""Администратор"" /P"""+ПарольАдмина+""" /DisableStartupMessages /C""РазрешитьРаботуПользователей"" /UC""КодРазрешения""";
Иначе
СтрокаСоединения = СтрЗаменить(СтрокаСоединения, "File=", "");
СтрокаСоединения = СтрЗаменить(СтрокаСоединения, ";", "");
КаталогПрограммы = КаталогПрограммы();
ИмяФайлаПрограммы = КаталогПрограммы + "1cv8.exe";
КоманднаяСтрокаОбновления = "echo off
|cls
|"""+ИмяФайлаПрограммы+""" CONFIG /F"+СтрокаСоединения+" /N""Администратор"" /P"""+ПарольАдмина+""" /DisableStartupMessages /UpdateDBCfg /UC""КодРазрешения""
|"""+ИмяФайлаПрограммы+""" ENTERPRISE /F"+СтрокаСоединения+" /N""Администратор"" /P"""+ПарольАдмина+""" /DisableStartupMessages /C""РазрешитьРаботуПользователей"" /UC""КодРазрешения""";
КонецЕсли;
ИмяФайлаСкрипта = "C:
un1С.bat";
Ф = Новый ТекстовыйДокумент();
Ф.УстановитьТекст(КоманднаяСтрокаОбновления);
Ф.Записать(ИмяФайлаСкрипта, КодировкаТекста.OEM);
Результат = "Выполнено";
КонецЕсли;
//Запишем схему для создания задания
Если Результат = "Выполнено" Тогда
WSH = Новый COMobject("wscript.network");
ИмяКомпьютера = WSH.ComputerName;
ИмяПользователя = WSH.UserName;
ТекстХМЛ = "<?xml version=""1.0"" encoding=""UTF-16""?>
|<Task version=""1.2"" xmlns=""http://schemas.microsoft.com/windows/2004/02/mit/task"">
| <RegistrationInfo>
| <Date>2025-04-05T16:11:32.542172</Date>
| <Author>"+ИмяКомпьютера+""+ИмяПользователя+"</Author>
| <Description>Запускаем обновление и затем пускаем пользователей и выполняем синхронизацию с центром</Description>
| </RegistrationInfo>
| <Triggers>
| <CalendarTrigger>
| <Repetition>
| <Interval>PT5M</Interval>
| <Duration>P1D</Duration>
| <StopAtDurationEnd>false</StopAtDurationEnd>
| </Repetition>
| <StartBoundary>2025-04-06T08:00:00</StartBoundary>
| <Enabled>true</Enabled>
| <ScheduleByDay>
| <DaysInterval>1</DaysInterval>
| </ScheduleByDay>
| </CalendarTrigger>
| <RegistrationTrigger>
| <Enabled>true</Enabled>
| <Delay>PT30S</Delay>
| </RegistrationTrigger>
| </Triggers>
| <Principals>
| <Principal id=""Author"">
| <UserId>"+ИмяКомпьютера+""+ИмяПользователя+"</UserId>
| <LogonType>InteractiveToken</LogonType>
| <RunLevel>HighestAvailable</RunLevel>
| </Principal>
| </Principals>
| <Settings>
| <MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
| <DisallowStartIfOnBatteries>true</DisallowStartIfOnBatteries>
| <StopIfGoingOnBatteries>true</StopIfGoingOnBatteries>
| <AllowHardTerminate>true</AllowHardTerminate>
| <StartWhenAvailable>true</StartWhenAvailable>
| <RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
| <IdleSettings>
| <StopOnIdleEnd>true</StopOnIdleEnd>
| <RestartOnIdle>false</RestartOnIdle>
| </IdleSettings>
| <AllowStartOnDemand>true</AllowStartOnDemand>
| <Enabled>true</Enabled>
| <Hidden>false</Hidden>
| <RunOnlyIfIdle>false</RunOnlyIfIdle>
| <WakeToRun>false</WakeToRun>
| <ExecutionTimeLimit>PT4H</ExecutionTimeLimit>
| <Priority>7</Priority>
| <RestartOnFailure>
| <Interval>PT1M</Interval>
| <Count>3</Count>
| </RestartOnFailure>
| </Settings>
| <Actions Context=""Author"">
| <Exec>
| <Command>C:
un1С.bat</Command>
| </Exec>
| </Actions>
|</Task>";
ИмяФайлаСкрипта = "C:Run1C_Task.xml";
Ф = Новый ТекстовыйДокумент();
Ф.УстановитьТекст(ТекстХМЛ);
Ф.Записать(ИмяФайлаСкрипта, КодировкаТекста.UTF16);
Результат = "Записано";
КонецЕсли;
Если Результат = "Записано" Тогда
ТекстБатника ="
|@echo off
|Rem action - установка значение disable или enable
|set task_action=enable
|REM Проверка наличия прав администратора
|REM @WHOAMI /PRIV | find /i ""SeRemoteShutdownPrivilege"" > nul
|REM if %ERRORLEVEL% == 0 goto admin
|REM echo Execution aborted. Run this batch file AS Administrator !!!
|REM pause
|REM exit
|REM :admin
|REM @echo try %task_action% scheduled tasks ...
|schtasks /Create /XML c:Run1C_Task.xml /TN ""Run1C_Task""
|schtasks /change /tn ""Run1C_Task"" /%task_action% >> %~dn0.log";
ИмяФайлаСкрипта = "C:schtasks.bat";
Ф = Новый ТекстовыйДокумент();
Ф.УстановитьТекст(ТекстБатника);
Ф.Записать(ИмяФайлаСкрипта, КодировкаТекста.OEM);
Результат = "Можно запускать";
КонецЕсли;
Если Результат = "Можно запускать" Тогда
Попытка
ЗапуститьПриложение(ИмяФайлаСкрипта,,ложь);
Исключение
КонецПопытки;
КонецЕсли;
КонецПроцедуры
Процедура ОтключитьПланировщик()
ТекстБатника ="
|@echo off
|Rem action - установка значение disable или enable
|set task_action=disable
|REM Проверка наличия прав администратора
|REM @WHOAMI /PRIV | find /i ""SeRemoteShutdownPrivilege"" > nul
|REM if %ERRORLEVEL% == 0 goto admin
|REM echo Execution aborted. Run this batch file AS Administrator !!!
|REM pause
|REM exit
|REM :admin
|REM @echo try %task_action% scheduled tasks ...
|schtasks /Create /XML c:Run1C_Task.xml /TN ""Run1C_Task""
|schtasks /change /tn ""Run1C_Task"" /%task_action% >> %~dn0.log";
ИмяФайлаСкрипта = "C:schtasks.bat";
Ф = Новый ТекстовыйДокумент();
Ф.УстановитьТекст(ТекстБатника);
Ф.Записать(ИмяФайлаСкрипта, КодировкаТекста.OEM);
Попытка
ЗапуститьПриложение(ИмяФайлаСкрипта,,ложь);
Исключение
КонецПопытки;
КонецПроцедуры
Что то не получается этой обработкой обновить. Изменил конфигурацию, запустил обновление. Теперь в базу попасть не могу. Висит блокировка и ожидание запуска….
Судя по журналу регистрации проблема в каком то фоновом задании которое выполняется параллельно и не может быть завершено.
А у вас на сколько стабильно механизм обновлений работает?
Получается что если обновление началось и не завершилось например из за выполнявшегося в этот момент фонового задания то в базу потом зайти не даёт. Зависает блокировка… В принципе мне можно не ставить блокировку. это нужно руками удалять файл блокировки что для рядового пользователя сложная задача. Ещё что нибудь не то удалит 🙂
(3) TODD22, Я пользуюсь в таких случаях батником, который запускает БД с ключем разрешения работы пользователей. По стабильности: В последнем обновлении пришлось подключаться к 6 магазинам из 48.
Можно батник написать который удаляет файл блокировки из каталога с базой. Я думаю пойти по такому пути.
Переписал выполнение обновления через планировщик заданий. Теперь обновление выполняется автоматом в во всех узлах.