1. Отключение пользователей в файловой версии 1С 8.
Для отключение пользователей в файловой версии Я создал *.bat файл с одной строчкой
net session /delete /y
Он отключает все открытые общие файлы на компьютере на котором лежит база.
Далее создал задание (Планировщик заданий Windows), который бы запускал этот файл в назначенное время.
Вы спросите а как же те сеансы которые открыты на компьютере , Я их тоже устранил создав новый *.bat файл со строкой
taskkill /IM 1cv8.exe /f
правда он отключает все запущенные 1С на текущим компьютере , но для меня это не было так страшно так как архивация производилась в ночное время и уже никто не работал в базе, этот батник тоже можно добавить в Планировщик Windows.
Так же по taskkill можете почитать в других источниках , есть возможности отключать процессы в отдельных сеансах
2. Отключение пользователей в клиент-серверной базе.
Так же как и в случае файловой базы Я использовал *.bat файлы.
Создал два *.bat файла , первый отключает сервер 1С предприятие, второй его включает очень просто .
Содержание первого файла :
net stop «1C:Enterprise 8.2 Server Agent»
Содержание второго файла :
net start «1C:Enterprise 8.2 Server Agent»
Добавил два новых задания в планировщик Windows , с разницой во времени 15 минут для того чтобы все зависшие пользователи смогли отключиться, эти действия анологичны Запуск сервера 1С Предприятие и Остановка сервера 1С Предприятие
3. Программный способ отключения пользователей в 1С
Стояла задача выполнять архивацию ежеденевно в 22:30.
В этом способе Я не стал заморачиваться, создал новую роль «НеЗакрывать1С».
Создал новую процедуру в модуле обычного приложения :
Процедура ЗавершениеРаботыПользователей() Экспорт
Если НЕ РольДоступна("НеЗакрывать1С") Тогда
Если Час(моп_ВыполнениеОперацийНаСервере.ТекущаяДатаНаСервере()) >= 22 Тогда // получаю врмемя на сервере
ПрекратитьРаботуСистемы(Ложь);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Добавил в процедуру ПриНачалеРаботыСистемы() тоже самое и подключил обработчик ожидания :
Если НЕ РольДоступна("НеЗакрывать1С") Тогда
Если Час(моп_ВыполнениеОперацийНаСервере.ТекущаяДатаНаСервере()) >= 22 Тогда // получаю врмемя на сервере
ПрекратитьРаботуСистемы(Ложь);
КонецЕсли;
КонецЕсли;
ПодключитьОбработчикОжидания("ЗавершениеРаботыПользователей", "600");
Функция текущая дата на сервере выглядит так :
Функция ТекущаяДатаНаСервере() Экспорт
Возврат ТекущаяДата();
КонецФункции
Таким образом мы получаем дату на сервере , в случае если в свойствах общего модуля установлена галочка «Сервер», я поставил только её.
Получается текущий код отрубает пользователей на два часа , но обычно после полночи уже никто не заходит в базу.
Если кому-то помогла эта статья буду очень рад.
Много чего написано по отключению пользователей в базах 1С 8, Я хочу в этой статье изложить те способы, которые использую на производстве, и те которые не отнимают много времени в настройке
Перейти к публикации
Спасибо за советы, помогут в некоторых моментах. Но лучше просто настроить параллельную архивацию при работающих пользователях.
А как же отключение через консоль кластера в клиент-серверном варианте и запуск конфигурации с ключем /UC ?
В клиент-серверном варианте не всегда возможно отключить агента..ведь на кластере могут и другие базы крутиться которые не нужно отключать. Чем типовой не устраивает Блокировка базы?
Да конечно крутятся другие базы , но в моем случае этой выгонялкой Я пользуюсь в ночное время, а все регламентные задания проходят уже после выгрузки базы, и выгружаю Я все базы
(1) sisdrou, конечно это можно сделать через архивацию каталога , но у меня стояла несколько иная задача , у меня был РИБ , в котором по заданию производилось обновление конфигурации , поэтому Я отключаю всех пользователей
(3) Верно говорит. Рубить агента каждый раз — отнюдь не комильфо, есть давно проверенные штатные способы.
(6) Yashazz, (6) Yashazz, на счет штатных средств Я знаю не меньше вас, и в каждом случае пользуюсь разными способами по отключению пользователей , когда лень сделаю как тут написано , когда нет допишу конфигурацию или сделаю скрипт , Я просто привел способы которые быстрее по выполнению , и по времени , а так можно написать скрипт на vbs и все такое , их куча в инете, статья называется «Легкие способы отключения пользователей», а не то что лучше или проверено, или есть давно
(7) Для ленивого админа это, может быть, и лёгкие способы. А вот объяснять ни в чём не повинным юзерам, почему их вышибло из базы «Б», хотя отключали юзверей базы «А», это уже не очень лёгкое занятие.
(8) Yashazz, ну сделай тогда net send и напиши «всех отключу от базы через 5 минут» и все, есть много способов я не спорю, пусть каждый выберет то что ему удобно, в той или иной ситуации
Парой ночью не кому нечего объяснять не надо поскольку в ночное время когда должен идти обмен работать в базе не кто не должен. Да и кто будет сидеть на работе убиваясь до 23.00 времени
СПАСИБО ЗА ИДЕЮ!
А давайте я Вам задачку по отключению пользователей подкину.
Все видели в службе терминалов такую функцию как «Ограничить пользователя одним сеансом»? Нужно ее решить в УФ. Т.е. если Юзер входит второй раз — мы просто «отключаем» его старый сеанс.
Только вот как это реализовать если: клиент тонкий (не содержит СОМ по определению) и сервер под Линукс (не содержит СОМ по той же причине) ?? ))
Есть «легкие» способы выключить пользователя…?
(12) ArtfulCrom,
«Ограничить пользователя одним сеансом» и то, что Вы написали — совсем не одно и то же, так как в первом случае второй раз зайти не получится, в во втором — должен быть закрыт первый сеанс.
А принцип реализации в общих чертах тот же, что и в третьем примере:
при начале работы системы:
1. выполняется цикл, в котором идет ожидание, пока количество соединений от текущего пользователя больше одного (что-то вроде Для х = 1 По 10 Цикл Если МаленькаяФункцияПроверкиНаКоличествоСоединений() < 2 Тогда Прервать КонецЕсли; Предупреждение(«Ждем-с закрытия ранее открытого…», 5); КонецЦикла)
2. создается обработчик ожидания, который проверяет количество соединений от текущего пользователя: если больше одного, то работа завершается.
Только нафиг надо???
Вот и не правильно )
Юзер отвалился. Сеанс остался открытым. Данные заблокированы. Юзер хочет войти и продолжить работу. Не может. Достаточная причина? Существует еще более важные примеры. И то решение, что вы прислали как раз не подходит. ОН ДОЛЖЕН войти в любом раскладе без ожидания. А старый сеанс ДОЛЖЕН закрыться. МОЛЧА. И тут 1С, что то налажала с Линуксом, Тонким Клиентом и СОМ объектом…. ))
(12) ArtfulCrom, Добрый День , решать задачу как то времени нет , а что если попробовать подключиться к консоли кластера и отключить сеанс пользователя который по времени раньше , но так как нет ком , можно будет сделать все это в общем модуле на сервере , и передать туда имя пользователя
(15) в том-то и прелесть. Что функция ОТКЛЮЧИТЬ есть только у ОДНОГО объекта языка. СОМ-соединения. Поэтому без вариантов.
(16) ArtfulCrom, Ну тогда придется дописывать конфу , и в обработчике ожидания прекращать работу , того сеанса который раньше. , завести регистр какой нить текущие подключения , при входе в систему туда записывать имя и время входа а при выходи чистить его запись, можно думаю в регистр записать код подключения, и по нему ориентироваться
Да, спасибо, мы думали об этом, но по-факту — реально мертвый сеанс — который уже не шевелит ножками и кодом — так не уберешь. А при интенсивной работе ждать таймаут 20 минут пока его сервер потушит сам — не то что бесит пользователей. а заводит в состояние истерики.
ЗЫ: это я в этой теме не к тому, что бы всех напрячь, а к тому, что бы все трезво оценили КОСЯК заложенный 1Сом в механизм подключения/отключения клиентов и вам может неповезти на столько, что вы с ним столкнетесь, как мы сейчас (
.3
а я снимаю нужные активные сессии на сервере, правда они опять туда лезут тут же
Заходим в консоль отбираем все сеансы по времени вызовов СУБД за последние 5 минут, и те у которых это время равно нулю — убиваем
Что касается ночной архивации — самый эффективный способ — административный:
напугал директора о чреватости оставленных сеансов, в результате имеем приказ по предприятию — оставил сеанс 1 раз объяснительная, второй — 500 руб в кассу. Все пользователи теперь аккуратно выходят
(23) newbas, Да ты шаришь ) служебка это тема , правда все равно забывают большинство , а так в моих способах не надо никакой служебки , и все равно остаются зависшие сеансы не знаю откуда возникают , всякие зависания или дублирование сеансов на сервере 1С
(24) ak0710,
Согласен — у меня так же бывают зависания сеансов и часто по не известной причине.
(25) newbas, …………
По-моему достаточно штатных средств, чтобы аккуратно закрыть сеансы, остановить фоновые задания,
запретить подключение к нужной базе и т.д. позволяющие гарантированно решать вопросы архивирования.
Одно но, это в клиент-серверном варианте, бороться с юзерами в файловом варианте не так просто..
тут все варианты хороши, в разумных пределах. Так что идею использовать батник и виндузовый шедулер
считаю при случае можно использовать.. ну если руководство вменяемое, то и приказ не будет лишним.
вырубаем сервер на сетевом компе, подрубаем базу к другому серверу, обновляемся, загружаем сервер на сетевом …
очень нужная вешь…интересно попробовать на управлении производсвенным предприятием и управлении строительной организацией
Процедура ЗавершениеРаботыПользователей() Экспорт
Если НЕ РольДоступна(«НеЗакрывать1С») Тогда
Если Час(моп_ВыполнениеОперацийНаСервере.ТекущаяДатаНаСервере()) >= 22 Тогда // получаю врмемя на сервере
ПрекратитьРаботуСистемы(Ложь);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Спасибо автору за процедуру!
(23) newbas, а вот нам такая схема не помогла. и сам директор вешает сеанс (
Я бы все таки поставил маленький плюсик автор ведь сам говорит что не претендует на что то грандиозное а так маленькакая примочка на случае описанные автором вполне ничего себе
Спасибо! Помогает в разных случаях.
Спасибо! полезно знать такие приемы, в разных ситуациях и конечно учитывая, что данные редактируемых и незаписанных, непроведенных документов потеряются.
Порой такие маленькие мелочи подталкивают на свершение великих дел!)
(36) electronik, эти способы работают 100% без проблем , сначала запускай батники по отключению , а потом уже егиду , сейвер или что ты там используешь.
Подскажите а Процедура
Если НЕ РольДоступна(«НеЗакрывать1С») Тогда
Если Час(моп_ВыполнениеОперацийНаСервере.ТекущаяДатаНаСервере()) >= 22 Тогда // получаю врмемя на сервере
ПрекратитьРаботуСистемы(Ложь);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
будет работать в кластерной многопроцесорной системе
(38) dyak84, кластерной многопроцессорной системе немного не понял вопроса , на сервере 1С предприятия имеете ввиду, в случае если база клиент-северная?
(39) Совершенно точно
Спасибо за способы, что-то в этом есть
ПодключитьОбработчикОжидания а вот это можно как-то при старте системы на неупровляемых формах заставить работать?
а то запускать дополнительное окошко с обработкой печально как-то(
(41) ilonnaa, Вы имеете ввиду на управляемых формах ? в толстом клиенте для этой процедуры формы не требуются , в модуле приложения при начале работы системы
Извините за поздний ответ(41) ilonnaa
(42) ak0710, наоборот в управляемых формах все прекрасно. А вот в обычном приложении при старте системы не получается сделать, может есть какой-то костыль хитрый? А то мне пришлось подвесить его на задачи пользователя)
(44) ilonnaa, нет никакого костыля, я наоборот работал с этой процедурой только в обычном приложении , все работало прекрасно, проблема в чем не запускается процедура? , не срабатывает обработчик ожидания? или из-за времени на сервере может ? помню был случай что бухгалтера локально меняли время у себя на компьютере и заходили после чего я сделал проверку времени только на сервере, а в управляемых он только на сервере и проверяет время. Посмотрите может на модуль в котором возвращает время на сервере стоят еще другие галочки клиент и т.д.
Служба на сервере называется подлиннее: «1C:Enterprise 8.2 Server Agent (x86-64)» со всеми пробелами.
видимо, ее надо net stop и net start. Есть еще MSSQLAgent, который скидывает дампы базы по расписанию — его тоже надо останавливать или нет? И в какой очередности, кто знает?
Только я не понял, чем вредным чревата такая остановка-перезапуск службы?
Голос был(6), но без объяснений. Если база одна?
Я попробовал stop-start, потом запустил 1С и мне выдало «Ошибка доступа к серверу 1С», хотя агент числится в службах запущенным.Пришлось перезапускать весь Windows-server, чтоб восстановить запуск 1С. Это случайно у меня или закономерно? Вообще автоматом эта служба запускается от имени пользователя USR1CV82, а когда ее просто перезапускаю bat-ником, то от имени win-админа сервера, это имеет значение для корректной работы от чьего имени перезапускать?
вместо net session можно использовать openfiles. можно не убивать все сессии а закрыть только обращения к файлам 1С
Спасибо за статью! Особенно за первую часть, так как при обновлении системы в пятипользовательской бухгалтери мешают открытые сеансы у бухгалтеров,которы уходят на обед, закрывая свои кабиенты!
Спасибо. Очень помогло, особенно 1-вариант для файловой
(49) slavik27, + в копилку плиз ))
Спасибо, полезная информация, особенно касательно файловой базы.
Плюсую, в свое время мне не хватало этой статьи))))
Плюс в карму! Прям таки вовремя статья попалась и сразу вспомнилось, что ГлавОдмин выдал мне соответствующие права. Всех под топор!!! :-))
не один из вариантов — не помог ((((
(12)
Надо подключить обработчик ожидания который на сервере выполнит код:
Показать
Обоснование достаточности такого кода: ранее запустившийся сеанс в любом случае выполнит обработчик ожидания раньше текущего, а для особо вредных пользователей — максимум одновременно.
Хороший совет.
net session /delete /y
взял на вооружение
А почему никто не пользуется тем что предлагает 1с? Параметром запуска 1с предприятия /CЗапретитьРаботуПользователей, вроде же нормально работает, во всяком случае сейчас затестил на клиент серверном варианте базы и выгоняет всех, причем выгоняет так, что 1с не пытается подключиться заново. И блокировку на подключение ставит. Разблокировка подключения к базе тоже проходит с параметром запуска РазрешитьРаботуПользователей.
(57)
статья старая , тут альтернатива просто , а так да пользовался и /CЗапретитьРаботуПользователей нормально отрабатывает