Имя: Пароль:
1C
 
Как узнать результат команды "/CЗавершитьРаботуПользователей"?
,
0 zelenprog
 
05.12.24
10:53
Здравствуйте!

Используется "стандартный" скрипт для резервного копирования.
Последовательность команд в нем примерно такая:
1) ...\1cv8.exe ... /CЗавершитьРаботуПользователей ...
2) ждем 10 мин.
3) выполняем резервную копию
4) ...\1cv8.exe ... /CРазрешитьРаботуПользователей ...

Часто первый пункт (/CЗавершитьРаботуПользователей) не выполняется. Но скрипт этого "не знает" и пытается делать копию базы. Естественно возникает ошибка со всеми вытекающими.
Был даже такой случай, когда на этой команде 1С-ка жестко зависла, база не освободилась, но никто войти с утра в базу не мог.

Можно ли как-то из скрипта (или из внешней программы) "узнать", что работа пользователей реально завершена и база свободна?

В идеале хотелось бы, чтобы скрипт делал следующие действия:
1) Запускаем "1cv8.exe ... /CЗавершитьРаботуПользователей" и запоминаем ИД процесса
2) Ждем некоторое время - проверяем освободилась ли база
3а) Если база освободилась - делаем копию
3б) - Если база не освободилась...
    - Проверяем не завис ли процесс. Если процесс висит - убиваем его

Как это сделать?
1 Доминошник
 
05.12.24
11:46
(0) А что, "Обновлятор" не справится с такой задачей?
2 zelenprog
 
05.12.24
12:31
(1) С какой задачей?
Со всей задачей, включая резервную копию?

Или только с той "частичной" задачей, про которую я спрашиваю - проверка блокировки базы?

Если имеется ввиду "полная" задача с созданием резервной копии, то ответ "нет" - Обновлятор не справится. Так как есть особые требования к созданию копии. Надо не просто заархивировать 1Cv8.1CD.
Но это уже отдельный разговор.

А если имеется ввиду "частичная" задача освобождения базы, то...
Если можно Обновлятор запустить извне, чтобы он выполнил эту команду и вернул результат - то этим конечно можно воспользоваться.
Только как?
3 Fedor-1971
 
05.12.24
13:09
(0) Попробуй так
start /wait "Запускаем "1cv8.exe ../CЗавершитьРаботуПользователей" - пока не выполнится, дальше по скрипту не пойдёт

можно проверять ErrorLevel == 0 - нормально сработало, любые другие значения - обломалось
4 PLUT
 
05.12.24
13:23
5 PLUT
 
05.12.24
13:27
блокировка по времени начала/кончала с кодом разрешения поинтереснее будет?

сеансы волшебным образом завершаются, ну бывает иногда "зависшие" сеансы не удаляются...


БлокировкаСеансов
Блокировка = Новый БлокировкаСеансов;
                
                Блокировка.КодРазрешения    = Настройки["КодРазрешения"];
                Блокировка.Начало           = НачалоДня(ТекущаяДата()) + Число(Настройки["ВремяНачалаБлокировки"] - Дата(1,1,1));
                Блокировка.Конец            = НачалоДня(ТекущаяДата()) + Число(Настройки["ВремяОкончанияБлокировки"] - Дата(1,1,1));
                Блокировка.Сообщение        = Настройки["ТекстСообщения"];
                Блокировка.Установлена      = Истина;
                
                УстановитьБлокировкуСеансов(Блокировка);
6 zelenprog
 
05.12.24
13:58
(3) >> Попробуй так
start /wait .. /CЗавершитьРаботуПользователей" - пока не выполнится

Не, пока не выполнится нельзя.
Я же выше написал, уже были такие неприятные ситуации, когда 1С-ка зависла на этом этапе с 20-00 вечера, и никто не мог войти в базу до 11-00 следующего дня.
Нужно обязательно ждать определенное время, а потом все это убивать.


>> можно проверять ErrorLevel == 0 - нормально сработало

Я конечно, проверю...
Но как мне помнится там всегда код возврата = "0".
7 PLUT
 
05.12.24
13:54
(6) по рабоче-крестьянски - ставишь блокировкусеансов по времени начала/кончала. ждешь ко времени начала + 5 минут. ребутаешь службу сервера 1С (ну там стоп службы агента, пауза, старт службы агента) и дальше делайте что хотите?
8 zelenprog
 
05.12.24
13:58
(7) >> ставишь блокировкусеансов по времени начала/кончала. ждешь ко времени начала + 5 минут

Как это сделать из внешнего скрипта\программы?

>> ребутаешь службу сервера 1С (ну там стоп службы агента, пауза, старт службы агента)

Пока что я эту проблему решаю с файловой базой.
Но после этого придется что-то похожее делать и с серверной базой.
9 PLUT
 
05.12.24
14:00
(8) 🤦
10 Мультук
 
гуру
05.12.24
14:42
(8)

>> что-то похожее делать и с серверной базой

Там-то зачем для бэкапа пользователей выгонять ?
Или в Postgre всё так печально ?
11 zelenprog
 
05.12.24
17:43
(10) Нет для серверной не надо. Это я погорячился.
Для файловой надо.
Сбило с толку упоминание про "ребутаешь службу сервера 1С (ну там стоп службы агента, пауза, старт службы агента)"