Имя: Пароль:
1C
1C 7.7
v7: Таблица 1SJOURN SQL
,
0 alexandr_87
 
05.03.15
22:08
Убрал табллок на таблицу журнала, вопрос к чему это может провести???
Плюс в том что при вводе нового документа даже если кто-то проводит другой документ не выскакивает "time out expired..."
1 zulu_mix
 
05.03.15
22:14
увеличить таймаут на скуле не предлагать?
2 alexandr_87
 
05.03.15
22:16
так это ничего не даст, увеличит время ожидания пользователя, а тут нужна оперативность...
3 vde69
 
05.03.15
22:21
коллизии при одновременной записи одного обьекта

Петя открыл док 1, установил 200р
Вася открыл док 1, установил 300р
Петя записал и закрыл док
Вася записал и закрыл док

как Вы думаете что будет думать Петя об сумме документа?
4 Sorm
 
05.03.15
22:26
(3) Что Петя будет о Васе - гораздо важнее:)
5 alexandr_87
 
05.03.15
22:28
tabllock я снял только с 1sjourn а из хранимой процедуры самого документа оставил, если петя открыл док1 то вася не сможет его открыть
6 Serg_1960
 
05.03.15
22:31
Хуже то, что Петя и Вася могут не думать о сумме до тех пор, когда станет уже поздно думать. "Трясти надо!"(с)
7 vde69
 
05.03.15
22:48
(5) догадайся какие документов поля хранятся в общем журнале :)

а вообще конечно нужно думать о транзакциях в целом, в том числе и о грязном чтении в чужой транзакции...
8 zulu_mix
 
05.03.15
22:49
(7) вся шапка кроме проведения
9 Z1
 
05.03.15
22:54
(0, 2)
Это как в анекдоте
-А можете печатать 1000 знаков в минуту
-Могу.Но такая х получается.

Если одним словом то как в 0 делать нельзя.
Если как бы убираешь блокировки стандартные
то вместо них надо ставить свои блокировки
10 Z1
 
05.03.15
22:57
(3) Что-то не то говоришь.
Два пользователя не могут открыть один документ на редактирование. за это отвечает файловая блокировка.
А вот если при 0 будут проводиться два документа
и они одновремено полезут к одним итогам (таблицы rg )
по регистрам то итоги "полетят"
11 alexandr_87
 
05.03.15
22:59
на таблице "проводки" есть блокировка,уже проверял запустил проведение одного документа,в это время записал другой без пробел а вот провести не пропускает "Блокировка таблицы Проводки".
12 Z1
 
05.03.15
23:00
Но ситуация (3) тоже может быть плачевной если
действия (3) делать не итерактивно а программно
через СоздатьОбъект
13 alexandr_87
 
05.03.15
23:01
надо еще много разных тестов,провести....
14 Z1
 
05.03.15
23:02
(11) причем тут проводки у тебя полетят итоги по бух проводкам
и обороты по бух проводкам.название таблиц не помню но могу посмотреть.
(11) ты понимаешь полностью что написано в (10)
если нет то верни лучше все обратно
15 Z1
 
05.03.15
23:04
(13) удачи ...
Особенно если будешь делать на белой бух базе
и по этой базе сдашь декларацию по новой форме 2015.
16 alexandr_87
 
05.03.15
23:08
пока все в тестовой, ты имеешь в виду что будут записаны не правильные данные в таблице проводок?
17 Z1
 
05.03.15
23:15
(16) В тестовой у тебя все будет идеально ты же в ней один работаешь.

В рабочей все будет грустно.
проводки будут правильно в любом случае записаны
и в рабочей базе

но помимо проводок есть итоги, обороты
и.т.д.
18 alexandr_87
 
05.03.15
23:29
Дело говоришь:). Вот бы узнать как софт пойнт гибкие блокировки использует....
19 ADirks
 
06.03.15
08:13
(18) Так у них на сайте всё расписано. По крайней мере было раньше.  Вместо tablock используют rowlock, только и всего :)
20 torgm
 
06.03.15
08:17
(0)  есть компонента toysql позволяет блокировки снимать правильно, к ней дополнительно набор скриптов, у ставил трем клиентам, полет нормальный
21 vde69
 
06.03.15
08:36
я вообще не понимаю зачем это делать?

при штатных настройках 7.7 вполне тянет по сети 15 человек фигачавших документы..... разумеется если код не кривой...
22 VladZ
 
06.03.15
08:48
(0)  Зачем? Найди код, который всех вешает и оптимизируй.
23 Z1
 
06.03.15
09:19
(19) так просто.
но на некоторых наборах данных (или из-за особенностей документов) такое решение может приводить наоборот к взаимоблокировкам.
Пример попробуйте при таком решении подгрузиться из УРБД.
24 mvk
 
06.03.15
09:30
Привет. Не мое. Точнее частично. К сожалению не помню автора - давно это было.
К этому еще можно пользовательские блокировки прикрутить.

// Код для отключения блокировок
Function XOR(Val ParA, Val ParB)
    Res = 0;
    Koef = 1;
    For BitNumber = 1 To 8 Do
        BitA = ParA % 2;
        BitB = ParB % 2;
        ParA = Int(ParA / 2);
        ParB = Int(ParB / 2);
        BitC = (BitA + BitB) % 2;
        Res = Res + BitC * Koef;
        Koef = Koef * 2;
    EndDo;
    Return Res;
EndFunction

// индексы значений с списке  
// server = 2, db = 4, uid = 6, pwd = 8, checksum = 10
Function ConnectionString()  export
    Var SQLKeyCode[36], ConnectCode[200];
    ConnectFile = IBDir() + "1Cv7.DBA";
    If FS.ExistFile(ConnectFile) = 0 Then
        Message("Это не SQL - база!", "!");
        Return (0);
    EndIF;
    FSO = CreateObject("Scripting.FileSystemObject");
    F = FSO.OpenTextFile(ConnectFile, 1);
    ConnectLen = 0;
    While F.AtEndOfStream = 0 Do
        ConnectLen = ConnectLen + 1;
        ConnectCode[ConnectLen] = Asc(F.Read(1));
    EndDo;
    F.Close();
    FSO = 0;
    SQLKey = "19465912879oiuxc ensdfaiuo3i73798kjl";
    For i = 1 To 36 Do
        SQLKeyCode[i] = Asc(Сред(SQLKey, i, 1));
    EndDo;
    Connect = "";
    For i = 1 To ConnectLen Do
        Connect = Connect + Chr(XOR(ConnectCode[i], SQLKeyCode[(i - 1) % 36 + 1]));
    EndDo;
    vl=createobject("ValueList");
    Connect=StrReplace(Connect,"{","");
    Connect=StrReplace(Connect,"}","");
    vl.fromSeparatedString(Connect);
    return (vl);
EndFunction

procedure patch_xp(check_error=0)
    if ExclusiveMode()=0 then
        if FS.ExistFile(IbDir()+"1cv7.dds")=1 then
            constr=ConnectionString();
            if ConStr<>0 then
                server=constr.getValue(2);database=constr.getValue(4);uid=constr.getValue(6); pwd=constr.getValue(8);
                con=createobject("ADODB.Connection"); con.cursorlocation=3; err="";
                con.open("provider=SQLOLEDB;data source="+trimall(server)+";DataBase="+trimall(database)+";uid="+trimall(uid)+";pwd="+""+trimall(pwd));
                
                qwerty="
                |alter procedure _1sp__1SUIDCTL_GetMaxID(@tid INTEGER, id CHAR(9) OUTPUT) AS
                |select id=MAXID from _1SUIDCTL(UPDLOCK)  where TYPEID=@tid
                |if id is null select id='         '";
                try
                    con.execute(qwerty);
                except
                    err=err+?(err<>"",linebreak,"")+"Не выполнена модификация счетчика идентификаторов документов и справочников..."+linebreak+
                    "Описание ошибки: "+geterrordescription()+linebreak+
                    "---------------------------------------------------------------------------------------";    
                endtry;
                
                qwerty="
                |alter procedure _1sp__1SENTRY_MaxRowID(i INTEGER OUTPUT) AS
                |set nocount on
                |select i=@@IDENTITY
                |if i is null select i=0";
                try
                    con.execute(qwerty);
                except
                    err=err+?(err<>"",linebreak,"")+"Не выполнена модификация счетчика идентификаторов проводок..."+linebreak+
                    "Описание ошибки: "+geterrordescription()+linebreak+
                    "---------------------------------------------------------------------------------------";    
                endtry;    
                
                qwerty="
                |alter procedure _1sp__1SOPER_MaxRowID(i INTEGER OUTPUT) AS
                |set nocount on
                |select i=@@IDENTITY
                |if i is null select i=0";
                try
                    con.execute(qwerty);
                except
                    err=err+?(err<>"",linebreak,"")+"Не выполнена модификация счетчика идентификаторов операций..."+linebreak+
                    "Описание ошибки: "+geterrordescription()+linebreak+
                    "---------------------------------------------------------------------------------------";    
                endtry;    
                
                
                
                qwerty="
                |alter procedure _1sp__1SCONST_MaxRowID(i INTEGER OUTPUT) AS
                |set nocount on
                |select i=@@IDENTITY
                |if i is null select i=0";
                try
                    con.execute(qwerty);
                except
                    err=err+?(err<>"",linebreak,"")+"Не выполнена модификация счетчика идентификаторов констант..."+linebreak+
                    "Описание ошибки: "+geterrordescription()+linebreak+
                    "---------------------------------------------------------------------------------------";    
                endtry;    
                
                try
                    qwerty="
                    |ALTER  procedure _1sp__1SCONST_TLockX AS
                    |return";
                    con.execute(qwerty);
                    
                    qwerty="
                    |ALTER  procedure _1sp__1SCONST_TLock AS
                    |return";
                    con.execute(qwerty);
                except
                    err=err+?(err<>"",linebreak,"")+"Не отключена блокировка таблицы констант..."+linebreak+
                    "Описание ошибки: "+geterrordescription()+linebreak+
                    "---------------------------------------------------------------------------------------";    
                endtry;
                
                
                
                
                try
                    qwerty="
                    |ALTER  procedure _1sp__1SENTRY_TLockX AS
                    |return";
                    con.execute(qwerty);
                    
                    qwerty="
                    |ALTER  procedure _1sp__1SENTRY_TLock AS
                    |return";
                    con.execute(qwerty);
                except
                    err=err+?(err<>"",linebreak,"")+"Не отключена блокировка таблицы проводок..."+linebreak+
                    "Описание ошибки: "+geterrordescription()+linebreak+
                    "---------------------------------------------------------------------------------------";    
                endtry;
                
                
                try
                    qwerty="
                    |ALTER  procedure _1sp__1SOPER_TLockX AS
                    |return";
                    con.execute(qwerty);
                    
                    qwerty="
                    |ALTER  procedure _1sp__1SOPER_TLock AS
                    |return";
                    con.execute(qwerty);
                except
                    err=err+?(err<>"",linebreak,"")+"Не отключена блокировка таблицы операций..."+linebreak+
                    "Описание ошибки: "+geterrordescription()+linebreak+
                    "---------------------------------------------------------------------------------------";    
                endtry;
                
                
                try
                    qwerty="select name from sysobjects where name='u_1ssystem'";
                    rs= con.execute(qwerty);
                    if rs.recordcount()=0 then
                        qwerty="    
                        |create trigger u_1ssystem on _1ssystem for update as
                        |set nocount on
                        |if update(eventidta)
                        |begin
                        |    declare @UserAccess as char(16)
                        
                        |    select @UserAccess =
                        |cast((SELECT DATABASEPROPERTYEX(db_name(), 'UserAccess')) as char(16))
                        
                        |    if  (@UserAccess='MULTI_USER') Or  @UserAccess='RESTRICTED_USER'
                        |    begin
                        |         IF EXISTS(select * from inserted i, deleted d where
                        |              d.curdate > i.curdate
                        |              or (d.curdate = i.curdate and d.curtime > i.curtime)
                        |              or (d.curdate = i.curdate and d.curtime = i.curtime and d.eventidta > i.eventidta)
                        |              )
                        |          BEGIN
                        |              update _1ssystem with (updlock)
                        |set curdate = d.curdate, curtime = d.curtime, eventidta = d.eventidta
                        |from deleted d
                        |          END
                        |    end
                        |end";
                        con.execute(qwerty);
                    endif;
                    
                    qwerty="
                    |alter procedure _1sp__1SSYSTEM_TLock AS
                    |return";
                    con.execute(qwerty);
                    
                    qwerty="
                    |alter procedure _1sp__1SSYSTEM_TLockX AS
                    |return";
                    con.execute(qwerty);
                    
                    
                    
                except
                    err=err+?(err<>"",linebreak,"")+"Не изменена блокировка таблицы актуальности..."+linebreak+
                    "Описание ошибки: "+geterrordescription()+linebreak+
                    "---------------------------------------------------------------------------------------";    
                endtry;     
                
                //изменение блокировок справочников с монопольных на построчные
                qwerty="declare sc_cur cursor for
                |select name
                |from sysobjects
                |where (name like 'SC%') and (name not like '%NEW%')
                |and type = 'U' and OBJECTPROPERTY(id,'IsMSShipped') = 0
                |open sc_cur
                |declare @sc_name varchar(50)
                |declare @sql varchar(1000)
                |fetch next from sc_cur into @sc_name
                |while @@FETCH_STATUS = 0
                |begin
                |select @sql = 'alter procedure _1sp_'+@sc_name+'_TLock AS set nocount on declare i integer select i=1 from '+@sc_name+' (ROWLOCK HOLDLOCK XLOCK) where 0=1'
                |execute(@sql)
                |select @sql = 'alter procedure _1sp_'+@sc_name+'_TLockX AS set nocount on declare i integer select i=1 from '+@sc_name+' (ROWLOCK HOLDLOCK XLOCK) where 0=1'
                |execute(@sql)
                |fetch next from sc_cur into @sc_name
                |end
                |close sc_cur
                |DEALLOCATE sc_cur";  
                con.execute(qwerty);
                //конец модуля изменения блокировок справочников
                
                
                //изменение блокировок движений регистров с монопольных на построчные
                qwerty="declare ra_cur cursor for
                |select name
                |from sysobjects
                |where (name like 'RA%')  and (name <> 'RAG_1sUSERS') and (name not like '%NEW%')
                |and type = 'U' and OBJECTPROPERTY(id,'IsMSShipped') = 0
                |open ra_cur
                |declare @ra_name varchar(50)
                |declare @sql varchar(1000)
                |fetch next from ra_cur into @ra_name
                |while @@FETCH_STATUS = 0
                |begin
                |select @sql = 'alter procedure _1sp_'+@ra_name+'_TLock AS set nocount on declare i integer select i=1 from '+@ra_name+' (ROWLOCK HOLDLOCK XLOCK) where 0=1'
                |execute(@sql)
                |select @sql = 'alter procedure _1sp_'+@ra_name+'_TLockX AS set nocount on declare i integer select i=1 from '+@ra_name+' (ROWLOCK HOLDLOCK XLOCK) where 0=1'
                |execute(@sql)
                |fetch next from ra_cur into @ra_name
                |end
                |close ra_cur
                |DEALLOCATE ra_cur";  
                con.execute(qwerty);
                
                //изменение блокировок итогов регистров с монопольных на построчные
                qwerty="declare rg_cur cursor for
                |select name
                |from sysobjects
                |where (name like 'RG%') and (name not like '%NEW%')
                |and type = 'U' and OBJECTPROPERTY(id,'IsMSShipped') = 0
                |open rg_cur
                |declare @rg_name varchar(50)
                |declare @sql varchar(1000)
                |fetch next from rg_cur into @rg_name
                |while @@FETCH_STATUS = 0
                |begin
                |select @sql = 'alter procedure _1sp_'+@rg_name+'_TLock AS set nocount on declare i integer select i=1 from '+@rg_name+' (ROWLOCK HOLDLOCK XLOCK) where 0=1'
                |execute(@sql)
                |select @sql = 'alter procedure _1sp_'+@rg_name+'_TLockX AS set nocount on declare i integer select i=1 from '+@rg_name+' (ROWLOCK HOLDLOCK XLOCK) where 0=1'
                |execute(@sql)
                |fetch next from rg_cur into @rg_name
                |end
                |close rg_cur
                |DEALLOCATE rg_cur";  
                con.execute(qwerty);
                
                
                
                //конец модуля изменения блокировок регистров
                
                //удаление блокировок журанала документов
                try
                    qwerty="
                    |alter procedure _1sp__1SJOURN_TLockX AS
                    |return";
                    con.execute(qwerty);
                    
                    qwerty="
                    |alter procedure _1sp__1SJOURN_TLock AS
                    |return";
                    con.execute(qwerty);
                except
                    err=err+?(err<>"",linebreak,"")+"Не отключена блокировка журнала документов..."+linebreak+
                    "Описание ошибки: "+geterrordescription()+linebreak+
                    "---------------------------------------------------------------------------------------";    
                endtry;
                
                
                
                
                //изменение блокировок журналов документов с монопольных на построчные
                qwerty="declare dt_cur cursor for
                |select name
                |from sysobjects
                |where (name like 'DT%') and (name not like '%NEW%')
                |and type = 'U' and OBJECTPROPERTY(id,'IsMSShipped') = 0
                |open dt_cur
                |declare @dt_name varchar(50)
                |declare @sql varchar(1000)
                |fetch next from dt_cur into @dt_name
                |while @@FETCH_STATUS = 0
                |begin
                |select @sql = 'alter procedure _1sp_'+@dt_name+'_TLock AS set nocount on declare i integer select i=1 from '+@dt_name+' (ROWLOCK HOLDLOCK XLOCK) where 0=1'
                |execute(@sql)
                |select @sql = 'alter procedure _1sp_'+@dt_name+'_TLockX AS set nocount on declare i integer select i=1 from '+@dt_name+' (ROWLOCK HOLDLOCK XLOCK) where 0=1'
                |execute(@sql)
                |fetch next from dt_cur into @dt_name
                |end
                |close dt_cur
                |DEALLOCATE dt_cur";  
                con.execute(qwerty);
                
                qwerty="declare dh_cur cursor for
                |select name
                |from sysobjects
                |where (name like 'DH%') and (name not like '%NEW%')
                |and type = 'U' and OBJECTPROPERTY(id,'IsMSShipped') = 0
                |open dh_cur
                |declare @dh_name varchar(50)
                |declare @sql varchar(1000)
                |fetch next from dh_cur into @dh_name
                |while @@FETCH_STATUS = 0
                |begin
                |select @sql = 'alter procedure _1sp_'+@dh_name+'_TLock AS set nocount on declare i integer select i=1 from '+@dh_name+' (ROWLOCK HOLDLOCK XLOCK) where 0=1'
                |execute(@sql)
                |select @sql = 'alter procedure _1sp_'+@dh_name+'_TLockX AS set nocount on declare i integer select i=1 from '+@dh_name+' (ROWLOCK HOLDLOCK XLOCK) where 0=1'
                |execute(@sql)
                |fetch next from dh_cur into @dh_name
                |end
                |close dh_cur
                |DEALLOCATE dh_cur";  
                con.execute(qwerty);
                
                
                
                
                //конец модуля изменения блокировок документов
                
                
                
                
                
                qwerty="
                |Delete from RAG_1sUSERS where usrscnt=0";
                try
                    con.execute(qwerty);     
                except
                    err=err+?(err<>"",linebreak,"")+"Не выполнена очистка таблицы соединений..."+linebreak+
                    "Описание ошибки: "+geterrordescription()+linebreak+
                    "---------------------------------------------------------------------------------------";    
                endtry;
                
                
                
                
                if check_error=1 then //выполним проверку-исправление возможных ошибок в БД.
                    qwerty="
                    |DELETE FROM _1sentry
                    |WHERE docid IN (SELECT iddoc FROM _1sjourn (nolock)
                    |WHERE closed=0)";
                    
                    try
                        con.execute(qwerty);
                    except
                        err=err+?(err<>"",linebreak,"")+"Не выполнено удаление проводок по непроведенным документам..."+linebreak+
                        "Описание ошибки: "+geterrordescription()+linebreak+
                        "---------------------------------------------------------------------------------------";    
                    endtry;
                    
                    qwerty="
                    |DELETE FROM _1sentry
                    |WHERE docid NOT IN (SELECT iddoc FROM _1sjourn (nolock))";
                    
                    try
                        con.execute(qwerty);
                    except
                        err=err+?(err<>"",linebreak,"")+"Не выполнено удаление проводок по несуществующим документам..."+linebreak+
                        "Описание ошибки: "+geterrordescription()+linebreak+
                        "---------------------------------------------------------------------------------------";    
                    endtry;    
                    
                    qwerty="
                    |DELETE FROM _1sentry
                    |WHERE docid NOT IN (SELECT docid FROM _1soper (nolock))";
                    try    
                        con.execute(qwerty);
                    except
                        err=err+?(err<>"",linebreak,"")+"Не выполнено удаление проводок по несуществующим операциям..."+linebreak+
                        "Описание ошибки: "+geterrordescription()+linebreak+
                        "---------------------------------------------------------------------------------------";    
                    endtry;
                    
                    qwerty="
                    |DELETE FROM _1soper
                    |WHERE docid NOT IN (SELECT iddoc FROM _1sjourn (nolock))";
                    try        
                        con.execute(qwerty);
                    except
                        err=err+?(err<>"",linebreak,"")+"Не выполнено удаление операций по несуществующим документам..."+linebreak+
                        "Описание ошибки: "+geterrordescription()+linebreak+
                        "---------------------------------------------------------------------------------------";    
                    endtry;    
                endif;    
                
                con.close();
            else
                err=err+?(err<>"",linebreak,"")+"Неверные параметры соединения с базой данных SQL сервера..."+linebreak+
                "---------------------------------------------------------------------------------------";    
            endif;
            if err<>"" then  
                err="Ошибки верификации механизма блокировок:"+linebreak+err;
                message (err);
            endif    
        endif;
    endif;    
endprocedure     

Процедура ПриНачалеРаботыСистемы()
    patch_xp();
...
25 mvk
 
06.03.15
09:32
Хм. Под этим:
"i; target="_blank" class="registered-user">
была просто собака.

ЗЫ. Это надо в глобальник.
26 mvk
 
06.03.15
09:35
Блин, опять подмена.
Все, что начинается с
"http:
и заканчивается
class="registered-user">
было просто
@
27 alexandr_87
 
06.03.15
10:17
Спасибо всем))))),будем пробовать....
28 vcv
 
06.03.15
10:20
(24) А можно всё это в нормальном виде? Текстовиком на каком-нибудь файлобменнике, например.
29 mvk
 
06.03.15
10:37
30 alexandr_87
 
06.03.15
11:26
Пробовал при проведение документа выходит ошибка "invalid cursor state..." и посля этого программа вылетает..
31 mvk
 
06.03.15
11:41
Не должно из-за блокировок. Ошибку подробнее...
32 alexandr_87
 
06.03.15
11:50
SQL State:24000
Native: 0
Message: [Microsoft][ODBC SQL SERVER DRIVER]Invalid cursor state.
33 vcv
 
06.03.15
11:51
(30) Какие-либо прямые запросы используются? В ком-то из них курсор не закрывается предположительно.
34 ADirks
 
06.03.15
11:54
(23) Это да, стоит слегка налажать с блокировками - и здрассьте дедлоки, или, что ещё хуже, косячные данные.
Потому то в 77 и не стали таких вольностей позволять. Чтобы порог вхождения понизить.
35 mvk
 
06.03.15
11:57
Релиз 1С? Какой SQL?
36 alexandr_87
 
06.03.15
12:01
1c 7.7 27 релиз, SQL 2005
37 varelchik
 
06.03.15
15:09
Ха!
А как подружил 7.7 и 2005?
38 alexandr_87
 
06.03.15
15:35
39 mvk
 
06.03.15
16:05
Свойства базы надо бы глянуть. Да и dbcc checkdb не помешает (после бэкапа)
Ошибка? Это не ошибка, это системная функция.