Имя: Пароль:
1C
1С v8
Операция не может быть выполнена из-за несоответствия версии
,
0 GreyTim
 
08.04.24
14:08
Коллеги, я в отчаянии. Не каждый раз, но случается, что при записи документа после программного изменения реквизита вылетает оная ошибка. Код довел до абсурда, но ошибка все равно вылетает. Конфа самописная, обычные формы, платформа 8.3.15.1747.

[1ц]
Функция УстановитьДатуНачалаОтгрузки(Док)
    
    Док.Прочитать();
    
    //Блокировка
    Попытка
        Док.Заблокировать();
        
    Исключение
        
        ОписаниеОшибки    = ОписаниеОшибки();
        ЗафиксироватьОшибкуПриПопыткеБлокировкиОтгрузки(Док, ОписаниеОшибки, "Отгрузка.ПопыткаБлокировки");
        
        Возврат Ложь;
        
    КонецПопытки;
    
    //Запись
    Попытка
        
        Док.Прочитать();
        Док.НачалоОтгрузкиТовара = ТекущаяДата();
        Док.Записать();
        Док.Разблокировать();
        
        Возврат Истина;
        
    Исключение
                
        Док.Разблокировать();
        ОписаниеОшибки    = ОписаниеОшибки();
        ЗафиксироватьОшибкуПриПопыткеБлокировкиОтгрузки(Док, ОписаниеОшибки, "Отгрузка.ПопыткаЗаписи");
        
        Возврат Ложь;
        
    КонецПопытки;
    
КонецФункции
[/1ц]
1 lEvGl
 
гуру
08.04.24
14:10
когда это вызывается?
2 steep1
 
08.04.24
14:17
(0) База сикл? проверяли состояние базы?
3 GreyTim
 
08.04.24
14:17
Вызов идет из обработки, не Модуль и не Форма документа. Док - это ДокументОбъект, который уже в базе есть.
4 GreyTim
 
08.04.24
14:19
(2) База на SQL, если вы об этом. О каком состоянии идет речь? Обслуживание базы ежедневное.
5 lEvGl
 
гуру
08.04.24
14:24
может одновременная программная работа с документом в нескольких местах?
зы. и не только программная, может и интерактивная
6 GreyTim
 
08.04.24
14:26
(5) По-сути, такое быть может раз в год, например. Потому что это надо умудриться попасть в тайминг между Прочитать() и Записать()
7 GreyTim
 
08.04.24
14:27
+(6) в заблокированном объекте
8 shuhard
 
08.04.24
14:30
(6)[такое быть может раз в год]
тогда нахрена бессмысленная блокировка ?
9 GreyTim
 
08.04.24
14:33
(8) а это уже моя реакция кодом на эту ошибку. Какие еще варианты? Я тоже, как и lEvGl решил, что документ блочится пользователем и хотел выдавать сообщение об ошибке с указанием того, кто блочит документ, но оказалось, что дело не в блокировке, а в записи. Но, код по блокировке оставил.
10 lEvGl
 
гуру
08.04.24
14:34
(7) надо же видимо проверять, если эта же обработка может запускаться разными пользователями, или дважды одним, что .Заблокирован(), тут такого не видно
11 lEvGl
 
гуру
08.04.24
14:38
либо ошибка в логике записи/проведении самого документа. хз, кто то поменял док, пока туда сюда. то ли он сам себя, то ли еще кто то
12 GreyTim
 
08.04.24
14:38
(10) Для прозрачного мониторинга происходящего, я специально код по изменению документа разбил на 2 попытки: блокировка и запись. Получается, что если первая попытка (блокировка) отработала, то и документ не заблокирован. Можно, конечно перед записью еще раз проверить на блокировку, но это, как по мне, такое...
13 Garykom
 
гуру
08.04.24
14:39
Зачем лезешь в явные блокировки когда и так есть неявные?
Что еще за Док.Записать(); без параметров?
14 Chameleon1980
 
08.04.24
14:42
(13) а что не так с Док.Записать() без параметров?
15 shuhard
 
08.04.24
14:43
(14) для замены реквизита используют запись и загрузка истина
16 lEvGl
 
гуру
08.04.24
14:46
я хз, объектные блокировки всегда работали так

Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.Регистр");
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
НачатьТранзакцию();
Блокировка.Заблокировать();
        тратата
ЗафиксироватьТранзакцию();
17 GreyTim
 
08.04.24
14:49
(11) Пробежался по коду. В модуле объекта на в ПредЗаписью() на в ПриЗаписи() документ не меняется, да и если б менялся, это не должно приводить к описанной ошибке. Есть еще подписка на событие ПриЗаписи(), но она срабатывает, поправьте, если не прав, ПОСЛЕ записи объекта в БД. К тому же, не все документы, по которым возникает описанная проблема, обрабтывает логика подписки. Стоит условие, по которому идет возврат.
18 Garykom
 
гуру
08.04.24
14:50
(14) Очень опасно опираться на параметры по умолчанию
В 1С периодически "по умолчанию" меняют ))
19 GreyTim
 
08.04.24
14:52
(15) У меня РБД, ЗагрузкаДанных = Истина не прокатит. Надо , что б изменение по обмену полетело.

В параметре и так будет Запись по-умолчанию.
20 GreyTim
 
08.04.24
14:53
(16) Без проблем перепишу код, просто ради того, что вдруг поможет, но не думаю, что проблема в том, какая блокировка применяется. Она либо сработала, либо нет.
21 lEvGl
 
гуру
08.04.24
16:14
(20) та не, без одолжений, говорю какой опыт был успешным, просто док.заблокировать() не юзал, с транзакцией наладил и юзал всегда
22 Garykom
 
гуру
08.04.24
15:03
Объясни нафига Док.Прочитать(); ?
Дважды.
Особенно в контексте где идет только запись да еще с блокировкой.
23 GreyTim
 
08.04.24
15:04
(21) а и не про одолжения. Сорян, если так показалось. Просто я уж готов как угодно написать, лишь бы все взлетело ))
24 GreyTim
 
08.04.24
15:06
(22) Что б прям вообще все норм было. Чтоб всегда версия объекта была актуальна. Согласен, код избыточен и доведен до абсурда, как я уже и писал, но даже при таком коде получаем ошибку.
25 Chameleon1980
 
08.04.24
15:07
(15) еще раз - а причем тут Док.Записать() без параметров.
загрузка = истина - это не параметр
26 Chameleon1980
 
08.04.24
15:07
(18) ну вот это больше на правду похоже :)
27 GreyTim
 
08.04.24
15:10
(26) О, как... Учту!
28 Garykom
 
гуру
08.04.24
15:17
(24) 1. Добавь транзакцию
Сначала НачатьТранзакцию, затем Заблокировать и т.д. Записать и ЗафиксироватьТранзакцию

2. Добавь ЗаблокироватьДанныеДляРедактирования перед Записать