Легкие способы отключения пользователей

Много чего написано по отключению пользователей в базах 1С 8, Я хочу в этой статье изложить те способы, которые использую на производстве, и те которые не отнимают много времени в настройке

 

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");

 

Функция текущая дата на сервере выглядит так :

 

Функция ТекущаяДатаНаСервере() Экспорт

    Возврат ТекущаяДата();

КонецФункции

 

Таким образом мы получаем дату на сервере , в случае если в свойствах общего модуля установлена галочка «Сервер», я поставил только её.

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

Если кому-то помогла эта статья буду очень рад.


58 Comments

  1. ak0710

    Много чего написано по отключению пользователей в базах 1С 8, Я хочу в этой статье изложить те способы, которые использую на производстве, и те которые не отнимают много времени в настройке

    Перейти к публикации

    Reply
  2. sisdrou

    Спасибо за советы, помогут в некоторых моментах. Но лучше просто настроить параллельную архивацию при работающих пользователях.

    Reply
  3. Diversus

    А как же отключение через консоль кластера в клиент-серверном варианте и запуск конфигурации с ключем /UC ?

    Reply
  4. Confucius

    В клиент-серверном варианте не всегда возможно отключить агента..ведь на кластере могут и другие базы крутиться которые не нужно отключать. Чем типовой не устраивает Блокировка базы?

    Reply
  5. ak0710

    Да конечно крутятся другие базы , но в моем случае этой выгонялкой Я пользуюсь в ночное время, а все регламентные задания проходят уже после выгрузки базы, и выгружаю Я все базы

    Reply
  6. ak0710

    (1) sisdrou, конечно это можно сделать через архивацию каталога , но у меня стояла несколько иная задача , у меня был РИБ , в котором по заданию производилось обновление конфигурации , поэтому Я отключаю всех пользователей

    Reply
  7. Yashazz

    (3) Верно говорит. Рубить агента каждый раз — отнюдь не комильфо, есть давно проверенные штатные способы.

    Reply
  8. ak0710

    (6) Yashazz, (6) Yashazz, на счет штатных средств Я знаю не меньше вас, и в каждом случае пользуюсь разными способами по отключению пользователей , когда лень сделаю как тут написано , когда нет допишу конфигурацию или сделаю скрипт , Я просто привел способы которые быстрее по выполнению , и по времени , а так можно написать скрипт на vbs и все такое , их куча в инете, статья называется «Легкие способы отключения пользователей», а не то что лучше или проверено, или есть давно

    Reply
  9. Yashazz

    (7) Для ленивого админа это, может быть, и лёгкие способы. А вот объяснять ни в чём не повинным юзерам, почему их вышибло из базы «Б», хотя отключали юзверей базы «А», это уже не очень лёгкое занятие.

    Reply
  10. ak0710

    (8) Yashazz, ну сделай тогда net send и напиши «всех отключу от базы через 5 минут» и все, есть много способов я не спорю, пусть каждый выберет то что ему удобно, в той или иной ситуации

    Reply
  11. Sirgeli

    Парой ночью не кому нечего объяснять не надо поскольку в ночное время когда должен идти обмен работать в базе не кто не должен. Да и кто будет сидеть на работе убиваясь до 23.00 времени

    Reply
  12. irina_elabuga

    СПАСИБО ЗА ИДЕЮ!

    Reply
  13. ArtfulCrom

    А давайте я Вам задачку по отключению пользователей подкину.

    Все видели в службе терминалов такую функцию как «Ограничить пользователя одним сеансом»? Нужно ее решить в УФ. Т.е. если Юзер входит второй раз — мы просто «отключаем» его старый сеанс.

    Только вот как это реализовать если: клиент тонкий (не содержит СОМ по определению) и сервер под Линукс (не содержит СОМ по той же причине) ?? ))

    Есть «легкие» способы выключить пользователя…?

    Reply
  14. sorb

    (12) ArtfulCrom,

    «Ограничить пользователя одним сеансом» и то, что Вы написали — совсем не одно и то же, так как в первом случае второй раз зайти не получится, в во втором — должен быть закрыт первый сеанс.

    А принцип реализации в общих чертах тот же, что и в третьем примере:

    при начале работы системы:

    1. выполняется цикл, в котором идет ожидание, пока количество соединений от текущего пользователя больше одного (что-то вроде Для х = 1 По 10 Цикл Если МаленькаяФункцияПроверкиНаКоличествоСоединений() < 2 Тогда Прервать КонецЕсли; Предупреждение(«Ждем-с закрытия ранее открытого…», 5); КонецЦикла)

    2. создается обработчик ожидания, который проверяет количество соединений от текущего пользователя: если больше одного, то работа завершается.

    Только нафиг надо???

    Reply
  15. ArtfulCrom

    Вот и не правильно )

    Юзер отвалился. Сеанс остался открытым. Данные заблокированы. Юзер хочет войти и продолжить работу. Не может. Достаточная причина? Существует еще более важные примеры. И то решение, что вы прислали как раз не подходит. ОН ДОЛЖЕН войти в любом раскладе без ожидания. А старый сеанс ДОЛЖЕН закрыться. МОЛЧА. И тут 1С, что то налажала с Линуксом, Тонким Клиентом и СОМ объектом…. ))

    Reply
  16. ak0710

    (12) ArtfulCrom, Добрый День , решать задачу как то времени нет , а что если попробовать подключиться к консоли кластера и отключить сеанс пользователя который по времени раньше , но так как нет ком , можно будет сделать все это в общем модуле на сервере , и передать туда имя пользователя

    Reply
  17. ArtfulCrom

    (15) в том-то и прелесть. Что функция ОТКЛЮЧИТЬ есть только у ОДНОГО объекта языка. СОМ-соединения. Поэтому без вариантов.

    Reply
  18. ak0710

    (16) ArtfulCrom, Ну тогда придется дописывать конфу , и в обработчике ожидания прекращать работу , того сеанса который раньше. , завести регистр какой нить текущие подключения , при входе в систему туда записывать имя и время входа а при выходи чистить его запись, можно думаю в регистр записать код подключения, и по нему ориентироваться

    Reply
  19. ArtfulCrom

    Да, спасибо, мы думали об этом, но по-факту — реально мертвый сеанс — который уже не шевелит ножками и кодом — так не уберешь. А при интенсивной работе ждать таймаут 20 минут пока его сервер потушит сам — не то что бесит пользователей. а заводит в состояние истерики.

    Reply
  20. ArtfulCrom

    ЗЫ: это я в этой теме не к тому, что бы всех напрячь, а к тому, что бы все трезво оценили КОСЯК заложенный 1Сом в механизм подключения/отключения клиентов и вам может неповезти на столько, что вы с ним столкнетесь, как мы сейчас (

    Reply
  21. ak0710

    .3

    Reply
  22. gala2009

    а я снимаю нужные активные сессии на сервере, правда они опять туда лезут тут же

    Reply
  23. Den_D

    Заходим в консоль отбираем все сеансы по времени вызовов СУБД за последние 5 минут, и те у которых это время равно нулю — убиваем

    Reply
  24. newbas

    Что касается ночной архивации — самый эффективный способ — административный:

    напугал директора о чреватости оставленных сеансов, в результате имеем приказ по предприятию — оставил сеанс 1 раз объяснительная, второй — 500 руб в кассу. Все пользователи теперь аккуратно выходят

    Reply
  25. ak0710

    (23) newbas, Да ты шаришь ) служебка это тема , правда все равно забывают большинство , а так в моих способах не надо никакой служебки , и все равно остаются зависшие сеансы не знаю откуда возникают , всякие зависания или дублирование сеансов на сервере 1С

    Reply
  26. newbas

    (24) ak0710,

    Согласен — у меня так же бывают зависания сеансов и часто по не известной причине.

    Reply
  27. ak0710

    (25) newbas, …………

    Reply
  28. _LEV_

    По-моему достаточно штатных средств, чтобы аккуратно закрыть сеансы, остановить фоновые задания,

    запретить подключение к нужной базе и т.д. позволяющие гарантированно решать вопросы архивирования.

    Одно но, это в клиент-серверном варианте, бороться с юзерами в файловом варианте не так просто..

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

    считаю при случае можно использовать.. ну если руководство вменяемое, то и приказ не будет лишним.

    Reply
  29. alekseies

    вырубаем сервер на сетевом компе, подрубаем базу к другому серверу, обновляемся, загружаем сервер на сетевом …

    Reply
  30. forurchik

    очень нужная вешь…интересно попробовать на управлении производсвенным предприятием и управлении строительной организацией

    Reply
  31. irishen

    Процедура ЗавершениеРаботыПользователей() Экспорт

    Если НЕ РольДоступна(«НеЗакрывать1С») Тогда

    Если Час(моп_ВыполнениеОперацийНаСервере.ТекущаяДатаНаСервере()) >= 22 Тогда // получаю врмемя на сервере

    ПрекратитьРаботуСистемы(Ложь);

    КонецЕсли;

    КонецЕсли;

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

    Спасибо автору за процедуру!

    Reply
  32. commo

    (23) newbas, а вот нам такая схема не помогла. и сам директор вешает сеанс (

    Reply
  33. Sasha255n

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

    Reply
  34. Nata

    Спасибо! Помогает в разных случаях.

    Reply
  35. Agema

    Спасибо! полезно знать такие приемы, в разных ситуациях и конечно учитывая, что данные редактируемых и незаписанных, непроведенных документов потеряются.

    Reply
  36. OscarTT

    Порой такие маленькие мелочи подталкивают на свершение великих дел!)

    Reply
  37. ak0710

    (36) electronik, эти способы работают 100% без проблем , сначала запускай батники по отключению , а потом уже егиду , сейвер или что ты там используешь.

    Reply
  38. dyak84

    Подскажите а Процедура

    Если НЕ РольДоступна(«НеЗакрывать1С») Тогда

    Если Час(моп_ВыполнениеОперацийНаСервере.ТекущаяДатаНаСервере()) >= 22 Тогда // получаю врмемя на сервере

    ПрекратитьРаботуСистемы(Ложь);

    КонецЕсли;

    КонецЕсли;

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

    будет работать в кластерной многопроцесорной системе

    Reply
  39. ak0710

    (38) dyak84, кластерной многопроцессорной системе немного не понял вопроса , на сервере 1С предприятия имеете ввиду, в случае если база клиент-северная?

    Reply
  40. dyak84

    (39) Совершенно точно

    Reply
  41. ilonnaa

    Спасибо за способы, что-то в этом есть

    ПодключитьОбработчикОжидания а вот это можно как-то при старте системы на неупровляемых формах заставить работать?

    а то запускать дополнительное окошко с обработкой печально как-то(

    Reply
  42. ak0710

    (41) ilonnaa, Вы имеете ввиду на управляемых формах ? в толстом клиенте для этой процедуры формы не требуются , в модуле приложения при начале работы системы

    Reply
  43. ak0710

    Извините за поздний ответ(41) ilonnaa

    Reply
  44. ilonnaa

    (42) ak0710, наоборот в управляемых формах все прекрасно. А вот в обычном приложении при старте системы не получается сделать, может есть какой-то костыль хитрый? А то мне пришлось подвесить его на задачи пользователя)

    Reply
  45. ak0710

    (44) ilonnaa, нет никакого костыля, я наоборот работал с этой процедурой только в обычном приложении , все работало прекрасно, проблема в чем не запускается процедура? , не срабатывает обработчик ожидания? или из-за времени на сервере может ? помню был случай что бухгалтера локально меняли время у себя на компьютере и заходили после чего я сделал проверку времени только на сервере, а в управляемых он только на сервере и проверяет время. Посмотрите может на модуль в котором возвращает время на сервере стоят еще другие галочки клиент и т.д.

    Reply
  46. pavel06

    Служба на сервере называется подлиннее: «1C:Enterprise 8.2 Server Agent (x86-64)» со всеми пробелами.

    видимо, ее надо net stop и net start. Есть еще MSSQLAgent, который скидывает дампы базы по расписанию — его тоже надо останавливать или нет? И в какой очередности, кто знает?

    Только я не понял, чем вредным чревата такая остановка-перезапуск службы?

    Голос был(6), но без объяснений. Если база одна?

    Я попробовал stop-start, потом запустил 1С и мне выдало «Ошибка доступа к серверу 1С», хотя агент числится в службах запущенным.Пришлось перезапускать весь Windows-server, чтоб восстановить запуск 1С. Это случайно у меня или закономерно? Вообще автоматом эта служба запускается от имени пользователя USR1CV82, а когда ее просто перезапускаю bat-ником, то от имени win-админа сервера, это имеет значение для корректной работы от чьего имени перезапускать?

    Reply
  47. binx

    вместо net session можно использовать openfiles. можно не убивать все сессии а закрыть только обращения к файлам 1С

    Reply
  48. Andrey@

    Спасибо за статью! Особенно за первую часть, так как при обновлении системы в пятипользовательской бухгалтери мешают открытые сеансы у бухгалтеров,которы уходят на обед, закрывая свои кабиенты!

    Reply
  49. slavik27

    Спасибо. Очень помогло, особенно 1-вариант для файловой

    Reply
  50. ak0710

    (49) slavik27, + в копилку плиз ))

    Reply
  51. m-sla

    Спасибо, полезная информация, особенно касательно файловой базы.

    Reply
  52. jsuh

    Плюсую, в свое время мне не хватало этой статьи))))

    Reply
  53. _MavR_

    Плюс в карму! Прям таки вовремя статья попалась и сразу вспомнилось, что ГлавОдмин выдал мне соответствующие права. Всех под топор!!! :-))

    Reply
  54. deutsch2008

    не один из вариантов — не помог ((((

    Reply
  55. sultbec

    (12)

    Надо подключить обработчик ожидания который на сервере выполнит код:

    УстановитьПривилегированныйРежим(Истина);
    НС = НомерСоединенияИнформационнойБазы();
    текП=параметрыСеанса.текущийпользователь.идентификаторПользователяИБ;
    ЕстьДругойПользователь=Ложь;
    Для Каждого Стр Из ПолучитьСоединенияИнформационнойБазы() Цикл
    Если Стр.Пользователь=текП Тогда
    Если не Стр.НомерСоединения=НС Тогда
    ЕстьДругойПользователь=Истина;
    КонецЕсли;
    КонецЕсли;
    КонецЦикла;
    Если ЕстьДругойПользователь тогда
    ЗавершитьРаботуСистемы(ЛОЖЬ);
    КонецЕсли;
    УстановитьПривилегированныйРежим(ЛОЖЬ);
    

    Показать

    Обоснование достаточности такого кода: ранее запустившийся сеанс в любом случае выполнит обработчик ожидания раньше текущего, а для особо вредных пользователей — максимум одновременно.

    Reply
  56. maksa2005

    Хороший совет.

    net session /delete /y

    взял на вооружение

    Reply
  57. l4h

    А почему никто не пользуется тем что предлагает 1с? Параметром запуска 1с предприятия /CЗапретитьРаботуПользователей, вроде же нормально работает, во всяком случае сейчас затестил на клиент серверном варианте базы и выгоняет всех, причем выгоняет так, что 1с не пытается подключиться заново. И блокировку на подключение ставит. Разблокировка подключения к базе тоже проходит с параметром запуска РазрешитьРаботуПользователей.

    Reply
  58. ak0710

    (57)

    не пользуется тем что предлагает 1с? Параметром запуска 1с предприятия /CЗапретитьРаботуПользователей, вроде же нормально работает, во всяком случае сейчас затестил на клиент серверном варианте базы и выгоняет всех, причем выгоняет так, что 1с не пытается подключиться заново. И блокировку на подключение

    статья старая , тут альтернатива просто , а так да пользовался и /CЗапретитьРаботуПользователей нормально отрабатывает

    Reply

Leave a Comment

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