Регламент для обновления базы данных

Обработка для выполнения обновления узла. Работает как регламентное задание.

Обработка загружается в дополнительные внешние обработки.

Далее нужно настроить расписание.

Принцип работы:

После выполнения обмена, при выполнении регламентного задания проверяется необходимость выполнения обновления.

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

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

Функция ЗавершитьСеансы()
Результат = Истина;

Блокировка = Новый БлокировкаСеансов;
Блокировка.Установлена = Истина;
Блокировка.Начало = ТекущаяДатаСеанса();
Блокировка.КодРазрешения = "КодРазрешения";
Блокировка.Сообщение = "Выполняется обновление. Сохраните данные и закройте 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>2024-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>2024-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);
Попытка
ЗапуститьПриложение(ИмяФайлаСкрипта,,ложь);
Исключение
КонецПопытки;

КонецПроцедуры

6 Comments

  1. TODD22

    Что то не получается этой обработкой обновить. Изменил конфигурацию, запустил обновление. Теперь в базу попасть не могу. Висит блокировка и ожидание запуска….

    Reply
  2. TODD22

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

    Reply
  3. TODD22

    А у вас на сколько стабильно механизм обновлений работает?

    Получается что если обновление началось и не завершилось например из за выполнявшегося в этот момент фонового задания то в базу потом зайти не даёт. Зависает блокировка… В принципе мне можно не ставить блокировку. это нужно руками удалять файл блокировки что для рядового пользователя сложная задача. Ещё что нибудь не то удалит 🙂

    Reply
  4. Pira

    (3) TODD22, Я пользуюсь в таких случаях батником, который запускает БД с ключем разрешения работы пользователей. По стабильности: В последнем обновлении пришлось подключаться к 6 магазинам из 48.

    Reply
  5. TODD22

    Можно батник написать который удаляет файл блокировки из каталога с базой. Я думаю пойти по такому пути.

    Reply
  6. Pira

    Переписал выполнение обновления через планировщик заданий. Теперь обновление выполняется автоматом в во всех узлах.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *