Запрет входа в базу под одним и тем же пользователем на ПК (1С 7.7, конф. не типовая)

Новая тема
Показывать по 10 20 40 сообщений
"По сабжу: надо разрешить входить в базу под одним и тем же пользователем (ОбщийДоступ) с разных ПК, но пресечь попытку входа в базу на одном и том же ПК под одним и тем же пользователем.
Проще:
можно
ПК №1 пользователь ОбщийДоступ
ПК №2 пользователь ОбщийДоступ
ПК №3 пользователь ОбщийДоступ
нельзя
ПК №1 пользователь ОбщийДоступ
ПК №1 пользователь ОбщийДоступ
Вот, что когда-то пытался сделать:
при старте системы

ФС.УстТекКаталог("C:\");
Если КаталогПользователя()=КаталогИБ() Тогда
ИмяЛокФайла="c:\"+ПолучитьИД(Пользователь)+".dbf";
ЛокФайл=СоздатьОбъект("XBase");
Если ФС.СуществуетФайл(ИмяЛокФайла)=0 Тогда
ЛокФайл.КодоваяСтраница(0);
ЛокФайл.ДобавитьПоле("ndx","Число",3,1);
   ЛокФайл.СоздатьФайл(ИмяЛокФайла,"c:\ndx.cdx");
Иначе
Если ЛокФайл.Открыта()=0 Тогда
   ЛокФайл.ОткрытьФайл(ИмяЛокФайла,"c:\ndx.cdx",0);
КонецЕсли;
КонецЕсли;

Код=ЛокФайл.КодОшибки();
Если Код<>0 Тогда
Предупреждение("На данном компьютере вход в 1С под пользователем"+РазделительСтрок+СокрЛП(Пользователь)+" уже осущетвлен!");
   ЗавершитьРаботуСистемы(0);
КонецЕсли;
КонецЕсли;
при выходе

Если КаталогПользователя()=КаталогИБ() Тогда
ЛокФайл.ЗакрытьФайл();
ФС.УдалитьФайл(ИмяЛокФайла);
КонецЕсли;


ЛокФайл и ИмяЛокФайла - глобальные переменные

Загвоздка, если из базы вылетели и не зарыли файл и не удалили потом при старте он не открывается (код ошибки 70) хотя не блокируется и свободно может быть удален.

Как победить? "
В SYSLOG\links.tmp система пишет регистрации сессий 1С, по которым строится "монитор пользователей". Данные в файле обновляются с какой то паузой, но не сильно значительной, которая была бы существенна в данном случае. Файл для чтения открыт. Я бы попробовал разобрать его структуру, а, судя по всему, она несложная, и от него оттолкнуться в решении задачи
> В SYSLOG\links.tmp система пишет регистрации сессий 1С, по которым строится "монитор пользователей". Данные в файле обновляются с какой то паузой, но не сильно значительной, которая была бы существенна в данном случае. Файл для чтения открыт. Я бы попробовал разобрать его структуру, а, судя по всему, она несложная, и от него оттолкнуться в решении задачи
inks.tmp разобрать то можно, но тут опять попадаем на грабли с вылетами пользователей из 1С и соответственно с сессиями висюками, можно по искать, что и где там лочить нужно, что-бы отличить висюка от нормальной сессии, но это уже не средствами 1С. Потому и пытался на XBase через монопольный доступ к файлу-маячку сделать...
А если сразу при входе, если файл существует, попытаться удалить этот файл. Если не удалился, то занят, а иначе создаем этот файл заново и заходим.
> А если сразу при входе, если файл существует, попытаться удалить этот файл. Если не удалился, то занят, а иначе создаем этот файл заново и заходим.
Да вот я то-же подумываю скатиться к данному способу, не так элегантно как с блокировкой файла средствами XBase и попытка его открыть.
Жаль метод ФС.УдалитьФайл(... не возвращает значения как прошла операция...
"Все, победил... не надо было заморачиваться с индексом
> ЛокФайл.ДобавитьПоле("ndx","Число",3,1);
убрано

> ЛокФайл.СоздатьФайл(ИмяЛокФайла,"c:\ndx.cdx");
исправлено на
> ЛокФайл.СоздатьФайл(ИмяЛокФайла,);

> ЛокФайл.ОткрытьФайл(ИмяЛокФайла,"c:\ndx.cdx",0);
исправлен на
> ЛокФайл.ОткрытьФайл(ИмяЛокФайла,,0);

Думаю может еще и проверку ЛокФайл.Открыта()=0 убрать?

Таак...
> ЛокФайл.ДобавитьПоле("ndx","Число",3,1);
пришлось вернуть обратно"
А после ФС.УдалитьФайл() проверить файл на существование?
"> А после ФС.УдалитьФайл() проверить файл на существование?
А как еще по другому? ;)"
> Жаль метод ФС.УдалитьФайл(... не возвращает значения как прошла операция...
Значит так и проверять, как прошло удаление.
> Значит так и проверять, как прошло удаление.
Ну а куда же при данном способе деться, но про УдалитьФайл все равно жаль, так было бы быстрее и проще...
Читают тему
(гостей: 1)

Быстрый переход