| 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-базы не требуют переиндексации, как при аварийном завершении.
 Удачи!
 |