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

Много чего написано по отключению пользователей в базах 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 не будет опубликован. Обязательные поля помечены *