Запрет входа в базу под одним и тем же пользователем на ПК (1С 7.7, конф. не типовая)
Показывать по
10
20
40
сообщений
- 1
- 2
20.09.2010
16:53
#1
"По сабжу: надо разрешить входить в базу под одним и тем же пользователем (ОбщийДоступ) с разных ПК, но пресечь попытку входа в базу на одном и том же ПК под одним и тем же пользователем.
Проще:
можно
ПК №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) хотя не блокируется и свободно может быть удален.
Как победить? "
Проще:
можно
ПК №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) хотя не блокируется и свободно может быть удален.
Как победить? "
20.09.2010
17:51
#2
В SYSLOG\links.tmp система пишет регистрации сессий 1С, по которым строится "монитор пользователей". Данные в файле обновляются с какой то паузой, но не сильно значительной, которая была бы существенна в данном случае. Файл для чтения открыт. Я бы попробовал разобрать его структуру, а, судя по всему, она несложная, и от него оттолкнуться в решении задачи
20.09.2010
18:24
#3
> В SYSLOG\links.tmp система пишет регистрации сессий 1С, по которым строится "монитор пользователей". Данные в файле обновляются с какой то паузой, но не сильно значительной, которая была бы существенна в данном случае. Файл для чтения открыт. Я бы попробовал разобрать его структуру, а, судя по всему, она несложная, и от него оттолкнуться в решении задачи
inks.tmp разобрать то можно, но тут опять попадаем на грабли с вылетами пользователей из 1С и соответственно с сессиями висюками, можно по искать, что и где там лочить нужно, что-бы отличить висюка от нормальной сессии, но это уже не средствами 1С. Потому и пытался на XBase через монопольный доступ к файлу-маячку сделать...
inks.tmp разобрать то можно, но тут опять попадаем на грабли с вылетами пользователей из 1С и соответственно с сессиями висюками, можно по искать, что и где там лочить нужно, что-бы отличить висюка от нормальной сессии, но это уже не средствами 1С. Потому и пытался на XBase через монопольный доступ к файлу-маячку сделать...
20.09.2010
18:53
#4
А если сразу при входе, если файл существует, попытаться удалить этот файл. Если не удалился, то занят, а иначе создаем этот файл заново и заходим.
21.09.2010
10:25
#5
> А если сразу при входе, если файл существует, попытаться удалить этот файл. Если не удалился, то занят, а иначе создаем этот файл заново и заходим.
Да вот я то-же подумываю скатиться к данному способу, не так элегантно как с блокировкой файла средствами XBase и попытка его открыть.
Жаль метод ФС.УдалитьФайл(... не возвращает значения как прошла операция...
Да вот я то-же подумываю скатиться к данному способу, не так элегантно как с блокировкой файла средствами XBase и попытка его открыть.
Жаль метод ФС.УдалитьФайл(... не возвращает значения как прошла операция...
21.09.2010
10:31
#6
"Все, победил... не надо было заморачиваться с индексом
> ЛокФайл.ДобавитьПоле("ndx","Число",3,1);
убрано
> ЛокФайл.СоздатьФайл(ИмяЛокФайла,"c:\ndx.cdx");
исправлено на
> ЛокФайл.СоздатьФайл(ИмяЛокФайла,);
> ЛокФайл.ОткрытьФайл(ИмяЛокФайла,"c:\ndx.cdx",0);
исправлен на
> ЛокФайл.ОткрытьФайл(ИмяЛокФайла,,0);
Думаю может еще и проверку ЛокФайл.Открыта()=0 убрать?
Таак...
> ЛокФайл.ДобавитьПоле("ndx","Число",3,1);
пришлось вернуть обратно"
> ЛокФайл.ДобавитьПоле("ndx","Число",3,1);
убрано
> ЛокФайл.СоздатьФайл(ИмяЛокФайла,"c:\ndx.cdx");
исправлено на
> ЛокФайл.СоздатьФайл(ИмяЛокФайла,);
> ЛокФайл.ОткрытьФайл(ИмяЛокФайла,"c:\ndx.cdx",0);
исправлен на
> ЛокФайл.ОткрытьФайл(ИмяЛокФайла,,0);
Думаю может еще и проверку ЛокФайл.Открыта()=0 убрать?
Таак...
> ЛокФайл.ДобавитьПоле("ndx","Число",3,1);
пришлось вернуть обратно"
21.09.2010
13:36
#8
"> А после ФС.УдалитьФайл() проверить файл на существование?
А как еще по другому? ;)"
А как еще по другому? ;)"
- 1
- 2
Читают тему
(гостей: 1)