Имя: Пароль:
1C
1C 7.7
v7: Глюк 7.7. ищу способ лечения.
0 Alexor
 
28.01.14
17:51
Всем привет.

Комплекная 7.7.533, но релиз не важен.
База DBF. В терминале 2008.

В документе реализация я создаю счет-фактуру, нажав кнопку "Счет-фактура"
Если в этот момент, кто-то проводит другой документ, возникает транзакция. и появляется сообщение об ошибке:
ОткрытьФорму("Документ."+ВидСФ,ФормаНакладной,Конт.ТекущийДокумент());
{Глобальный модуль(4769)}: Таблица: 1SJOURN Ошибка обращения к данным при транзакции, выполняемой другим пользователем

У пользователя время захвата таблицы стоит 0. Поэтому выдает это сообщение почти сразу. Она может кучу раз нажать на кнопку и получить данное сообщение.
Потом она в итоге проводит документ.

Но возникает следующий момент.
Пользователь закрыла все документы, открытого ничего нет. закрывает программу и возникает окно "Сохранить документ?"
Причем этот вопрос вылезет столько раз, сколько у нее было безуспешных попыток.

Может кто-то сталкивался и лечил этот момент?

Пока мысли вернуть время захвата на 5-10 сек и vk_sleep поставить.
1 vladko
 
28.01.14
17:56
попробуй минуту поставить
2 Ёпрст
 
28.01.14
17:56
поставить цикл на открытие и количество попыток, скажем, 20.
После неуспешного количества попыток юзверю отбой с выдачей сообщения  - повтори ышо разок.
Усё.
3 Nandarou
 
28.01.14
17:58
"У пользователя время захвата таблицы стоит 0" имхо для 1с 7.7 это слишком жестко.
4 Alexor
 
28.01.14
17:59
(2) Я так понимаю, цикл только ухудшит ситуацию.
(1) Угу, сразу час можно. Или программу закрывать.
5 Ёпрст
 
28.01.14
17:59
(3) это самое православное решение
6 Ёпрст
 
28.01.14
17:59
(4) ничем не ухудшит
7 Alexor
 
28.01.14
18:01
(6) Так программа 20 раз попробует, предположим на 19 проведет.
Тогда у пользователя при закрытии 19 раз будет программа спрашивать "сохранить?"
8 Alexor
 
28.01.14
18:01
Сейчас Попытку с Исключением попробую туда воткнуть.
9 Ёпрст
 
28.01.14
18:02
(7) не факт, у нас не спрашивает.
У тя еще какие вк используются ?

Такое сообщение тоже было.
Не помню ужо, чем вылечилось.
10 Ёпрст
 
28.01.14
18:02
И то не у всех.
11 Alexor
 
28.01.14
18:03
(9) Для проверки все ВК отключил.
используем
1cpp.dll
formex.dll
1sqlite.dll
12 Alexor
 
28.01.14
18:05
Я просто для проверки в одном документе ПКО в модуле проведения Предупреждение поставил.
под одним пользователем это ПКО проводить поставил, транзакцию создал.
Под другим пытался из реализации счет-фактуру создать.

Пробовал на разных релизах и железе.
13 Alexor
 
28.01.14
18:16
Вставил Попытка Исключение.
не помогло.
Сообщение ...Таблица: 1SJOURN Ошибка обращ...
не пишет, но при закрытии спрашивает.

Процедура глВводСчетаФактуры(Конт,ВидСФ) Экспорт
    Перем ФормаСчФ;
    Если Конт.Проведен()=0  Тогда
        Предупреждение("Счет-фактуру нельзя вводить на основании не проведенного документа!", 60);
        Возврат;
    КонецЕсли;

    СчетФактура     = глНайтиСчетФактуру(Конт,ВидСФ);
    ФормаНакладной     = Конт;
    Если ПустоеЗначение(СчетФактура) = 1 Тогда
        Если Конт.Модифицированность() = 1 Тогда
            Предупреждение("Документ был изменен! Сначала следует записать документ!", 60);
            Возврат;
        КонецЕсли;  
        
        Попытка        
            ОткрытьФорму("Документ."+ВидСФ,ФормаНакладной,Конт.ТекущийДокумент());
        Исключение
            Сообщить("Ошибка создания документ попробуйте позднее.");
        КонецПопытки;
    Иначе
        ОткрытьФорму(СчетФактура,ФормаНакладной);
    КонецЕсли;
КонецПроцедуры //глВводСчетаФактуры()
14 Мимохожий Однако
 
28.01.14
18:17
В похожих ситуациях я объяснял, чтобы не жмакала 19 раз, а досчитала до 10 )) . Но , судя по всему, этот вариант ТС не устраивает.
15 Alexor
 
28.01.14
18:22
(14) Беседа проведена. :)
Но им же надо всегда срочно.
Буду vk_sleep пробовать, в свое время что то не удалось поставить.
16 Мимохожий Однако
 
28.01.14
18:24
(15)Я объяснил, что если будут торопиться, то будет еще медленнее. А все попытки обмануть транзакцию бесполезны. Можно обмануть только пользователя.
17 temsa
 
28.01.14
19:00
А что если врубить "начатьтрнзакцию " тд?
18 Klesk666
 
28.01.14
19:07
не знаю чьё, но спасибо ему:

//******************************************************************************
// Предопределенная процедура            
//                            
Процедура УстановитьВремяОжиданияЗахватаТаблиц()
Кат = КаталогПользователя();
Файл = СоздатьОбъект("Текст");
Файл.Открыть(Кат+"1Cv7.CFG");
флИзменилиRefreshTime = 0;
флИзменилиLockWaitTime = 0;            
ФлИзменилиПараметрыОперативногоУчета=0;
СтрокаRefreshTime = "{"+Симв(34)+"RefreshTime"+Симв(34);
ПараметрRefreshTime = ","+Симв(34)+"30"+Симв(34)+"},";
СтрокаLockWaitTime = "{"+Симв(34)+"LockWaitTime"+Симв(34);
ПараметрLockWaitTime = ","+Симв(34)+"0"+Симв(34)+"}},";

СтрокаNewNotAskTime = "{"+Симв(34)+"NewNotAskTime"+Симв(34);
ПараметрNewNotAskTime = ","+Симв(34)+"1"+Симв(34)+"},";
СтрокаNewAfterAP = "{"+Симв(34)+"NewAfterAP"+Симв(34);
ПараметрNewAfterAP = ","+Симв(34)+"1"+Симв(34)+"},";
СтрокаNewCloseInStream = "{"+Симв(34)+"NewCloseInStream"+Симв(34);
ПараметрNewCloseInStream = ","+Симв(34)+"1"+Симв(34)+"},";
СтрокаNewSetCurTime = "{"+Симв(34)+"NewSetCurTime"+Симв(34);
ПараметрNewSetCurTime =  ","+Симв(34)+"0"+Симв(34)+"}},";;

КвоСтрокТекста = Файл.КоличествоСтрок();
Для Н = 1 По КвоСтрокТекста Цикл
  //Если (флИзменилиLockWaitTime = 1)
  //И (флИзменилиRefreshTime = 1) Тогда
  // Прервать;
  //КонецЕсли;
  ТекСтрока = Файл.ПолучитьСтроку(Н);
  Если Лев(ТекСтрока,14) = СтрокаRefreshTime Тогда
   Если Прав(ТекСтрока,8) <> ПараметрRefreshTime+Симв(10) Тогда
       ТекСтрока = "{"+Симв(34)+"RefreshTime"+Симв(34)+","+Симв(34)+"30"+Симв(34)+"},";
    Файл.УдалитьСтроку(Н);
    Файл.ВставитьСтроку(Н,ТекСтрока);
    флИзменилиRefreshTime = 1;
   КонецЕсли;
  ИначеЕсли Лев(ТекСтрока,15) = СтрокаLockWaitTime Тогда
   Если Прав(ТекСтрока,8) <> ПараметрLockWaitTime+Симв(10) Тогда
    ТекСтрока = "{"+Симв(34)+"LockWaitTime"+Симв(34)+","+Симв(34)+"0"+Симв(34)+"}},";
    Файл.УдалитьСтроку(Н);
    Файл.ВставитьСтроку(Н,ТекСтрока);
    флИзменилиLockWaitTime = 1;
   КонецЕсли;

ИначеЕсли Лев(ТекСтрока,16) = СтрокаNewNotAskTime Тогда     
    Если Прав(ТекСтрока,7) <> ПараметрNewNotAskTime+Симв(10) Тогда
    ТекСтрока =СтрокаNewNotAskTime+ПараметрNewNotAskTime+Симв(10);

    Файл.УдалитьСтроку(Н);
    Файл.ВставитьСтроку(Н,ТекСтрока);
    ФлИзменилиПараметрыОперативногоУчета = 1;
КонецЕсли;  
ИначеЕсли Лев(ТекСтрока,13) = СтрокаNewAfterAP Тогда     
    Если Прав(ТекСтрока,7) <> ПараметрNewAfterAP+Симв(10) Тогда
    ТекСтрока =СтрокаNewAfterAP+ПараметрNewAfterAP+Симв(10);

    Файл.УдалитьСтроку(Н);
    Файл.ВставитьСтроку(Н,ТекСтрока);
    ФлИзменилиПараметрыОперативногоУчета = 1;
   КонецЕсли;

ИначеЕсли Лев(ТекСтрока,19) = СтрокаNewCloseInStream Тогда     
    Если Прав(ТекСтрока,7) <> ПараметрNewCloseInStream+Симв(10) Тогда
    ТекСтрока =СтрокаNewCloseInStream+ПараметрNewCloseInStream+Симв(10);

    Файл.УдалитьСтроку(Н);
    Файл.ВставитьСтроку(Н,ТекСтрока);
    ФлИзменилиПараметрыОперативногоУчета = 1;
   КонецЕсли;
ИначеЕсли Лев(ТекСтрока,16) = СтрокаNewSetCurTime Тогда     
    Если Прав(ТекСтрока,8) <> ПараметрNewSetCurTime+Симв(10) Тогда
    ТекСтрока =СтрокаNewSetCurTime+ПараметрNewSetCurTime+Симв(10);

    Файл.УдалитьСтроку(Н);
    Файл.ВставитьСтроку(Н,ТекСтрока);
    ФлИзменилиПараметрыОперативногоУчета = 1;
   КонецЕсли;
    КонецЕсли     
КонецЦикла;
Если (флИзменилиLockWaitTime = 1)
Или (флИзменилиRefreshTime = 1) или (ФлИзменилиПараметрыОперативногоУчета=1) Тогда
  Попытка
      Файл.Записать(Кат+"1Cv7.CFG");
   Записан  = 1;
  Исключение
   Сообщить(ОписаниеОшибки());
  КонецПопытки;
  Файл = 0;
  Если Записан  = 1 Тогда
   Предупреждение("Изменились параметры опроса данных БД или
   |параметры проведения оперативных документов,
   |необходимо завершить работу 1С и войти снова",5);
   СтатусВозврата(0);
   //ЗавершитьРаботуСистемы(0);
  КонецЕсли;
КонецЕсли;
КонецПроцедуры
19 Ёпрст
 
29.01.14
09:55
попробуй занулять переменные в глобальнике на выходе