M_Volkov

Gold Member | Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору tippmann Цитата: мне надо не 1С у юзера закрыть, а отдельный документ открытый у пользователя! | могу лишь предложить механизм корректного завершения работы пользователя, а анализ на "отдельный документ" - можно доработать. Идею я уже излагал: Цитата: У меня это реализовано следующим образом: В справочник "Пользователи" добавил реквизит "ЗапретРаботы" (если избирательность не важна, достаточно константы), доступный только администраторам системы. В процедуре "ПриНачалеРаботыСистемы()" запускается "ОбработкаОжидания("ЗапретРаботы", 300)", т.е. каждые 5 минут запускается процедура "ЗапретРаботы()", которая проверяет состояние реквизита "ЗапретРаботы". Если он установлен, то переход в процедуру "ЗавершитьРаботуСистемы(0)", а тут уж варианты: на первый раз предлагает пользователю самому завершить работу, в следующие 5 минут, при не подчинении пользователя, делаем это принудительно. | И так подробнее: 1. В справочник "Пользователи" добавляем реквизит "ЗапретРаботы" - Запрет входа в базу, тип - Число, длина = 1. В "ФормуСписка" этого справочника можно вставить 2-е кнопки: "КнЗапретВкл" и "КнЗапретВыкл" - "Запрет работы всем:" и в модуле пишем: //////////////////////////////////////////////////////////////////////////////// Процедура ЗапретитьРаботу(Запрет) Спр = СоздатьОбъект("Справочник.Пользователи"); Спр.ВыбратьЭлементы(); Пока Спр.ПолучитьЭлемент() > 0 Цикл Если Спр.Код = "Администратор" Тогда Продолжить; КонецЕсли; Если Спр.ЗапретРаботы = Запрет Тогда Продолжить; КонецЕсли; Спр.ЗапретРаботы = Запрет; Спр.Записать(); КонецЦикла; КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// // ПРЕДОПРЕДЕЛЕННЫЕ ПРОЦЕДУРЫ // //****************************************************************************** // Предопределенная процедура. // Процедура ПриОткрытии() Форма.ЗапретРаботы.Видимость (?(СокрЛП(глПользователь.Код) = "Администратор", 1, 0)); Форма.КнЗапретВкл.Видимость (?(СокрЛП(глПользователь.Код) = "Администратор", 1, 0)); Форма.КнЗапретВыкл.Видимость (?(СокрЛП(глПользователь.Код) = "Администратор", 1, 0)); КонецПроцедуры // ПриОткрытии() // т.е. управлять запретом может только "Администратор"! 2. В глобальном модуле пишем: Перем глАвтоЗапуск Экспорт; // Эта переменная используется у меня не только запрета работы //****************************************************************************** // ЗапретРаботы() // // Описание: // Принудительно завершает работу пользователя. 02.04.2007 МВ. // Процедура ЗапретРаботы() Спр = СоздатьОбъект("Справочник.Пользователи"); Спр.НайтиЭлемент(глПользователь); Если глАвтоЗапуск = "Выход" Тогда ЗавершитьРаботуСистемы(0); ИначеЕсли Спр.ЗапретРаботы = 1 Тогда глАвтоЗапуск = "Предупреждение"; Предупреждение(" Ваше время работы истекло, просьба завершить работу. |У Вас осталась 1 минута на сохранение не записанных документов!", 20); ЗавершитьРаботуСистемы(0); КонецЕсли; КонецПроцедуры // ЗапретРаботы() //****************************************************************************** 3. В процедуру ПриНачалеРаботыСистемы() втавляем: Если глПользователь.ЗапретРаботы = 1 Тогда Предупреждение("Вход в систему не возможен!", 5); глАвтоЗапуск = "Запрет"; ЗавершитьРаботуСистемы(0); Иначе ОбработкаОжидания("ЗапретРаботы",60); // Проверка каждую минуту КонецЕсли; 4. В процедуру ПриЗавершенииРаботыСистемы() втавляем: Если ИмяПользователя() = "Администратор" Тогда ИначеЕсли глАвтоЗапуск = "Запрет" Тогда Возврат; ИначеЕсли глАвтоЗапуск = "Выход" Тогда Предупреждение("Спасибо за работу. | До свидания!", 5); Возврат; ИначеЕсли глАвтоЗапуск = "Предупреждение" Тогда глАвтоЗапуск = "Выход"; КонецЕсли; Таким образом, завершение работы пользователя выполняется корректно, с закрытием всех его открытых документов. DBF-базы не требуют переиндексации, как при аварийном завершении. Удачи! |