|
Операция не может быть выполнена из-за несоответствия версии | ☑ | ||
---|---|---|---|---|
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. Добавь ЗаблокироватьДанныеДляРедактирования перед Записать |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |