Имя: Пароль:
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С (ну там стоп службы агента, пауза, старт службы агента)"
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан