Переключение на Главную Страницу Страницы: [1] 2 3  ОтправитьПечать
Очень популярная тема (более 25 ответов) Необходимость переиндексации DBF базы (число прочтений - 10297 )
simply
God Member
*****
Отсутствует


Мечта: избавиться от 1С

Сообщений: 573
Местоположение: Киев
Зарегистрирован: 31. Декабря 2008
Пол: Мужской
Необходимость переиндексации DBF базы
08. Октября 2010 :: 12:43
Печать  
Добрый день!

Подскажите, пожалуйста, есть ли возможность из кода 1С узнать, нужна ли этой самой 1С переиндексация?

Заранее признателен.
  
Наверх
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Необходимость переиндексации DBF базы
Ответ #1 - 08. Октября 2010 :: 13:08
Печать  
Код из моего скриптлета 1S.StatusIB.wsc
Цитата:
Function StringIBState(strIBDir)
     StringIBState = IBStateToString( IBState(strIBDir) )
End Function

function IBStateToString(iIBState)
     IBStateToString = ""
     if iIBState = 0 then
           IBStateToString = "В базе никого нет"
     end if
     if iIBState = 1 then
            IBStateToString = "База работает в монопольном режиме"
     end if
     if iIBState = 2 then
            IBStateToString = "В базе работает один пользователь в разделенном режиме"
     end if
     if iIBState = -1 then
           IBStateToString = "Выполнен некорректный выход из 1С, нужна переиндексация"
     end if
     if iIBState = 3 then
            IBStateToString = "1С работает в разделенном режиме"
     end if
end function

Function IBState(strIBDir)
     iIBUsersCount = GetIBUsersCount(strIBDir)
     bIsAnyUserInIB = not TryFileOpen(strIBDir)

     if (iIBUsersCount = 0) then ' убрал условие открытия. Если 0 какая разница можно писать или нет?
           IBState = 0 ' в базе никого нет
     end if
     if (iIBUsersCount = -1) then '  то же самое. Если монопольно, какая разница можно открыть или нет?
           IBState = 1 ' кто-то сидит монопольно
     end if
     if (iIBUsersCount = 1) and bIsAnyUserInIB then
           IBState = 2 ' В базе работает один пользователь
     end if
     if (iIBUsersCount > 0) and not bIsAnyUserInIB then
           IBState = -1 ' некорректный выход из программы, нужна переиндексация
     end if
     if (iIBUsersCount > 1) and bIsAnyUserInIB then
           IBState = 3 '1С работает в разделенном режиме
     end if
End Function

Function TryFileOpen(strIBDir)
     TryFileOpen = false
     set fso = CreateObject("Scripting.FileSystemObject")
   
     strIBDir2 = strIBDir
     if Right(strIBDir, 1) <> "\" then
           strIBDir2 = strIBDir & "\"
     end if

     on Error resume next
     ForAppending = 8
     set file = fso.OpenTextFile(strIBDir2 & "1susers.dbf", ForAppending)
     iErrNumber = Err.Number

     on Error goto 0

     if iErrNumber <> 0 then
           Exit Function
     end if
     
     file.Close
     TryFileOpen = true
End Function
     
Function GetIBUsersCount(strIBDir)
     GetIBUsersCount = -1
     strText = "select usrscnt from 1susers"
     
     'ConnectString =      "DRIVER=Microsoft Visual FoxPro Driver;Deleted=Yes;Null=Yes;Collate=RUSSIAN;"+ _
     '                              "Exclusive=No;SourceType=DBF;SourceDB="+strIBDir
     ConnectString = "DRIVER=Driver do Microsoft dBase (*.dbf);FIL=dBase 5.0;DriverId=533;CollatingSequence=ASCII;DefaultDir=" & _
                                   strIBDir & ";UID=Admin"
                                   
     set Connection=CreateObject("ADODB.Connection")
     Connection.ConnectionTimeOut=600

     Connection.Open(ConnectString)

     set Rs=CreateObject("ADODB.RecordSet")
     Rs.ActiveConnection=Connection
     
     on Error resume next

     Rs.Open strText, Connection
     iErrNumber = Err.Number

     on Error goto 0
     
     if iErrNumber = 0 then
           GetIBUsersCount = CInt(Rs.Fields(0).Value)
     else
           GetIBUsersCount = -1 ' монопольный режим
     end if

     on Error resume next
     Rs.Close
     Connection.Close
     on Error goto 0
End Function

-1 означает переиндексацию Улыбка
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer &amp;&amp; tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
simply
God Member
*****
Отсутствует


Мечта: избавиться от 1С

Сообщений: 573
Местоположение: Киев
Зарегистрирован: 31. Декабря 2008
Пол: Мужской
Re: Необходимость переиндексации DBF базы
Ответ #2 - 08. Октября 2010 :: 13:22
Печать  
Я его уже видел. Только не знаю, как из кода 1С выполнить?
« Последняя редакция: 08. Октября 2010 :: 14:37 - simply »  
Наверх
IP записан
 
simply
God Member
*****
Отсутствует


Мечта: избавиться от 1С

Сообщений: 573
Местоположение: Киев
Зарегистрирован: 31. Декабря 2008
Пол: Мужской
Re: Необходимость переиндексации DBF базы
Ответ #3 - 08. Октября 2010 :: 20:30
Печать  
Не могу зарегистрировать. Ошибка в строке 50, символ 29
  
Наверх
IP записан
 
shmalevoz
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 55
Зарегистрирован: 23. Апреля 2009
Re: Необходимость переиндексации DBF базы
Ответ #4 - 08. Октября 2010 :: 23:21
Печать  
Из кода 1С можно поступить проще
  

chk_base.txt ( 0 KB | Загрузки )
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Необходимость переиндексации DBF базы
Ответ #5 - 09. Октября 2010 :: 04:34
Печать  
shmalevoz писал(а) 08. Октября 2010 :: 23:21:
Из кода 1С можно поступить проще

Конечно, можно и нужно.
Свой код я предложил как исходную идею Улыбка
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer &amp;&amp; tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
simply
God Member
*****
Отсутствует


Мечта: избавиться от 1С

Сообщений: 573
Местоположение: Киев
Зарегистрирован: 31. Декабря 2008
Пол: Мужской
Re: Необходимость переиндексации DBF базы
Ответ #6 - 10. Октября 2010 :: 12:52
Печать  
shmalevoz писал(а) 08. Октября 2010 :: 23:21:
Из кода 1С можно поступить проще
Супер!
Для проверки других баз - то, что надо!

А для проверки текущей базы пришлось прибегнуть к помощи нового метода FormEx-а:
Код
Выбрать все
//==================================================
Процедура Сформировать()
    Каталог    = КаталогИБ(); //"h:\bases\tmp\";
    Объект    = СоздатьОбъект("BinaryData");
    
    МожноОткрыть    = Объект.ПодключитьсяКФайлу(Каталог + "1susers.dbf", 1, 1);
    
    Если МожноОткрыть = 0 Тогда
        Сообщить("Монопольно");
    Иначе
        Объект.Перейти(98, 0);
        Количество    = "";
        Объект.ПрочитатьСтроку(Количество, 4);
        Количество    = Число(Количество);
        Объект.Закрыть();
        МожноОткрытьЭксклюзивно    = Объект.ПодключитьсяКФайлу(Каталог + "1susers.dbf", 0, 0);
        Объект.Закрыть();
        
        Если (МожноОткрытьЭксклюзивно = 1) и (Количество <> 0) Тогда
            Сообщить("Потребуется переиндексация");
        ИначеЕсли (МожноОткрытьЭксклюзивно = 0) и (Количество <> 0) Тогда
            КоличествоАктивных=0;
            тз=глСервис.ПолучитьСписокАктивныхПользователей(0);
            тз.ВыбратьСтроки();
            Пока тз.ПолучитьСтроку()=1 Цикл
                Если тз.Режим=1 Тогда // Предприятие (разделенный)
                    КоличествоАктивных=КоличествоАктивных+1;
                КонецЕсли;
            КонецЦикла;
            Если Количество=КоличествоАктивных Тогда
                Сообщить("ИБ в порядке. Работа в разделенном режиме");
            Иначе
                Сообщить("Срочно требуется переиндексация");
            КонецЕсли;
        Иначе
            Сообщить("Никто не работает");
        КонецЕсли;
    КонецЕсли;
    
КонецПроцедуры // Сформировать 



shmalevoz и artbear - большое вам спасибо!  Улыбка

Теперь с чистой совестью повешу этот метод на таймер и буду добровольно-принудительно контролировать целостность индексов в магазинах. А то совсем распоясались, чуть что не так - прибивают 1С или еще хуже - жмут на reset.

З.Ы.: shmalevoz, в который раз помогаешь мне интересным решением!  Улыбка
  
Наверх
IP записан
 
Brr
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 142
Зарегистрирован: 26. Декабря 2006
Re: Необходимость переиндексации DBF базы
Ответ #7 - 11. Октября 2010 :: 10:31
Печать  
Тоже сеть магазинов?
  
Наверх
 
IP записан
 
simply
God Member
*****
Отсутствует


Мечта: избавиться от 1С

Сообщений: 573
Местоположение: Киев
Зарегистрирован: 31. Декабря 2008
Пол: Мужской
Re: Необходимость переиндексации DBF базы
Ответ #8 - 11. Октября 2010 :: 10:57
Печать  
Brr писал(а) 11. Октября 2010 :: 10:31:
Тоже сеть магазинов?

Точно! Улыбка
  
Наверх
IP записан
 
Brr
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 142
Зарегистрирован: 26. Декабря 2006
Re: Необходимость переиндексации DBF базы
Ответ #9 - 11. Октября 2010 :: 12:09
Печать  
И у меня, та же задача стояла. Сделал по другому.
  
Наверх
 
IP записан
 
simply
God Member
*****
Отсутствует


Мечта: избавиться от 1С

Сообщений: 573
Местоположение: Киев
Зарегистрирован: 31. Декабря 2008
Пол: Мужской
Re: Необходимость переиндексации DBF базы
Ответ #10 - 11. Октября 2010 :: 12:44
Печать  
так поделись!
  
Наверх
IP записан
 
Brr
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 142
Зарегистрирован: 26. Декабря 2006
Re: Необходимость переиндексации DBF базы
Ответ #11 - 11. Октября 2010 :: 14:06
Печать  
При запуске системы проверялось, была ли система сегодня проиндексирована. Это у меня определяется просто, зашли монопольно значит индексировались, дата последнего захода монопольно в константе. Понятно, что пользователь может отказаться от индексации. Этот вариант не прорабатывался. Если сегодня база не индексировалась, то запускается вбс скрипт, который следит за тем, занята ли база. Следит по LCK файлу в папке базы. Пытается его удалить на случай аварийного выхода. Как только из базы вышли скрипт грохает файлы индексов. Все, хочешь работать - заходи монопольно. Индексы восстанавливаются по любому. Ограничение - работает раз в сутки. Таким было задание.
  
Наверх
 
IP записан
 
simply
God Member
*****
Отсутствует


Мечта: избавиться от 1С

Сообщений: 573
Местоположение: Киев
Зарегистрирован: 31. Декабря 2008
Пол: Мужской
Re: Необходимость переиндексации DBF базы
Ответ #12 - 11. Октября 2010 :: 14:18
Печать  
Спасибо!

У меня немного другая задумка.
Но она еще в процессе. Если получится интересной, выложу в репозитарий. Как миникласс (понравилось у chessman-a Подмигивание)
  
Наверх
IP записан
 
shmalevoz
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 55
Зарегистрирован: 23. Апреля 2009
Re: Необходимость переиндексации DBF базы
Ответ #13 - 12. Октября 2010 :: 13:02
Печать  
Не проще ли использовать SQL ?
  
Наверх
 
IP записан
 
simply
God Member
*****
Отсутствует


Мечта: избавиться от 1С

Сообщений: 573
Местоположение: Киев
Зарегистрирован: 31. Декабря 2008
Пол: Мужской
Re: Необходимость переиндексации DBF базы
Ответ #14 - 12. Октября 2010 :: 15:33
Печать  
shmalevoz писал(а) 12. Октября 2010 :: 13:02:
Не проще ли использовать SQL ?

Как базу?
Нет. У нас все официально.
А для 3-6 компьютеров - SQL? Это очень дорого и все равно, что "Из пушки по воробьям".
Да и Рарус-магазин только на DBF.
  
Наверх
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 3 
ОтправитьПечать