|
Метод Заблокировать () | ☑ | ||
---|---|---|---|---|
0
Franchiser
гуру
22.04.20
✎
12:14
|
Мне нужно удалить движения документа и установить признак пометка удаления если удалось удалить движения. Метод УстановитьПометкуУдаления работает долго, поэтому делаю аналог.
Вопрос: Можно использовать метод ДокументОбъект Заблокировать(). А можно в транзакции создать объект БлокировкаДанных и использовать у него метод заблокировать() с видом блокировки Исключительный. Есть ли какая то принципиальная разница в использовании Заблокировать() у ДокументОбъект и у БлокировкаДанных? |
|||
1
Ненавижу 1С
гуру
22.04.20
✎
12:25
|
"Метод УстановитьПометкуУдаления работает долго, поэтому делаю аналог" - ну-ну
а не проще сделать: ДокументОбъект.ПометкаУдаления = Истина; ДокументОбъект.Записать(); раз уж все равно все движения очистил |
|||
2
Cyberhawk
22.04.20
✎
12:26
|
Принциипальная разница в том, что первый работает только если во всех остальных сеансах поползновения сделаны аналогично с попыткой через этот метод, а второй - независимо гарантирует отлуп
|
|||
3
Franchiser
гуру
22.04.20
✎
12:39
|
(1) Я и сделал универс. удаление движений док и установку признака в транзакции .
(2) У меня многопоточная обработка (10 фоновых заданий), в каждом задании обрабатывается своя порция документов (не пересекаемые), но при этом возникают ошибки на блокировках при использовании УстановитьПометкуНаУдаление. Еще заметил что при УстановитьПометкуНаУдаление происходит дополнительная очистка данных в 3х независимых регистрах сведений. |
|||
4
Cyberhawk
22.04.20
✎
12:41
|
(3) Ну так разберись с блоикровками и допили запись в независимые РС с учетом параллельности
|
|||
5
Franchiser
гуру
22.04.20
✎
12:42
|
Насколько я понял Заблокировать() в транзакции должен не сразу вызывает ошибку при невозможности заблокировать а через указанные таймаут, код должен приостановиться, а метод ДокументОбъект может выскочить сразу в ошибку. Так?
|
|||
6
Cyberhawk
22.04.20
✎
12:43
|
Ты все перепутал
|
|||
7
Franchiser
гуру
22.04.20
✎
12:44
|
(4) Мне кажется независимые эти регистры не особо и нужны: Данные первичных документов, Выполнение регл. операций по НДС, Документы по требованию ФНС.
Пытаюсь разобраться с блокировками. Проблема в том что ошибка возникает редко, и воспроизвести не удается. |
|||
8
Cyberhawk
22.04.20
✎
12:45
|
Или ты под "Заблокировать() в транзакции" подразумеваешь упр. блокировку? Тогда да - она ждет таймаут, установленный в свойствах инфобазы.
Метод объекта Заблокировать() сразу дает отлуп. |
|||
9
Cyberhawk
22.04.20
✎
12:46
|
(7) Так платформа себя ведет так, что УстановитьПометкуУдаления чистит и записи, где ведущее измерение содержит ссылку на удаляемый объект
|
|||
10
Cyberhawk
22.04.20
✎
12:46
|
Хочешь оставлять битые ссылки - хозяин барин)
|
|||
11
Cyberhawk
22.04.20
✎
12:47
|
Хотя это скорее всего прикладным кодом все-таки делается
|
|||
12
Cyberhawk
22.04.20
✎
12:50
|
Да, (9) попутал с пометкой удаления подчиненных
|
|||
13
Franchiser
гуру
22.04.20
✎
12:51
|
(10) почему битые ссылки? я удаляю документы не непосредственно, а ставлю пометку
|
|||
14
Cyberhawk
22.04.20
✎
12:52
|
(13) Ищи прикладной код, который чистит эти независимые РС, и либо загаси его (если он поддерживает это, например, через доп. свойства или ОбменДанными.Загрузка = Истина), или доработай
|
|||
15
fisher
22.04.20
✎
12:53
|
> Метод УстановитьПометкуУдаления работает долго, поэтому делаю аналог.
Внушает. Меня вот еще долгое проведение раздражает. |
|||
16
Franchiser
гуру
22.04.20
✎
12:54
|
Пока не воспроизводится ошибка (но я уже убрал везде УстановитьПометкуУдаления)
Инструмент по анализу блокировок показывает блкировки вида X (гранулярность Запись) и вида IX (гранулярность Страница) |
|||
17
Cyberhawk
22.04.20
✎
12:55
|
А покажи-ка текст ошибки, о которой в (3) речь " при этом возникают ошибки на блокировках"
|
|||
18
fisher
22.04.20
✎
12:55
|
(16) В какой таблице блокировки?
|
|||
19
Franchiser
гуру
22.04.20
✎
12:55
|
(15) у меня автозагрузка полмиллиона документов с поддержкой целостности
|
|||
20
fisher
22.04.20
✎
12:57
|
(19) Забыл добавить "А у вас?"
|
|||
21
Franchiser
гуру
22.04.20
✎
13:00
|
(19) Текста не осталось: УстановитьПометкуУдаление() падало в исключение, при последующей записи ревизита в режиме обмен данными была также ошбика "Данные изменены другим пользователем".
Т.е. как будто менялась ВерсияДанных в Объекте после установки пометки на удаление и шли откаты транзакций. |
|||
22
fisher
22.04.20
✎
13:01
|
Ты просто решаешь проблему с другого конца. Не разобравшись, в чем причина нежданных блокировок пытаешься постепенно повторить алгоритм пометки удаления поймав (или избежав) проблему. В принципе, тоже путь. Если ты ничего важного не упустишь в процессе.
|
|||
23
fisher
22.04.20
✎
13:02
|
(21) Если изменилась версия именно дока, значит у тебя ошибка в алгоритме распараллеливания.
|
|||
24
Franchiser
гуру
22.04.20
✎
13:02
|
(22) не я первый это делаю
|
|||
25
Franchiser
гуру
22.04.20
✎
13:03
|
(23) я проверил, порции точно не пересекаются
|
|||
26
fisher
22.04.20
✎
13:04
|
(23) Чудес не бывает. Какой-то поток этот док дернул, раз версия изменилась.
|
|||
27
fisher
22.04.20
✎
13:04
|
Тьфу, к (25)
|
|||
28
fisher
22.04.20
✎
13:05
|
Добавь логирование всех попыток и записей дока, чтобы по логу можно было понять какие потоки что писали, а какие что пытались и не смогли.
|
|||
29
Franchiser
гуру
22.04.20
✎
13:06
|
(26) ну проверил все те самые порции в которых была ошибка в экселе, нигде ничего не пересекается.
Эта ошибка могла быть уже после ошибки в установке пометки на удаления, насколько помню была статья, что версия данных в объекте после отката тразакции уже не совпадает с версией объекта в ссылке. |
|||
30
Franchiser
гуру
22.04.20
✎
13:07
|
(28) добавил логирование всех документов, ошибка не воспроизводится сейчас
|
|||
31
fisher
22.04.20
✎
13:08
|
(29) > была статья, что версия данных в объекте после отката тразакции уже не совпадает с версией объекта в ссылке
Да ладно! Найди, плиз. |
|||
32
Franchiser
гуру
22.04.20
✎
13:10
|
У меня такой код был:
Док = ДокСсылка.ПолучитьОбъект(); Попытка Док.УстановитьПОметкуНаУдаление(Истина); Исключение //тут ошибка ... КонецПопытки Док.ОбменДанными.Закгрузка = Истина; Док.Комментарий = "..."; Попытка Док.Записать(); Исключение //тут оштбка если было и первое исключение КОнецПопытки; |
|||
33
fisher
22.04.20
✎
13:15
|
(32) А! Типа багофича, что не получится повторно записать с помощью того же объекта, если по нему уже был сбой записи? Х.з, вполне может быть.
|
|||
34
Franchiser
гуру
22.04.20
✎
13:17
|
||||
35
fisher
22.04.20
✎
13:17
|
Если так, тогда причиной могла быть и блокировка в сопутствующих таблицах. И вот там неизвестно, можно ее избежать или нет. Ты же небось еще и в пакетных транзакциях делаешь, для ускорения?
|
|||
36
Franchiser
гуру
22.04.20
✎
13:20
|
Не, я не делаю пакетных транзакций, т.к. мне пока важно получить лог именно документов с ошибками, иначе придется в лог писать все документы из транзакций с ошибками.
|
|||
37
Franchiser
гуру
22.04.20
✎
13:26
|
(35) На текущий момент вижу только Х блокировки по записям регистров накопления, сведений и БУ. Буду дальше мониторить.
|
|||
38
fisher
22.04.20
✎
13:30
|
(34) Что-то эта статья доверия не вызывает. Ясен пень, версия у ссылки очищается. Ведь после отката нет никакой ссылки. Может проблема и существует, но расследование вызывает вопросы.
|
|||
39
fisher
22.04.20
✎
13:33
|
(37) Просто если причиной сбоя является широкий диапазон блокирования в сопутствующей таблицей (возможно из-за экскалации), то возможно этого и не получится полностью избежать. И редкие сбои все равно возможны и нужно будет их корректно обрабатывать.
|
|||
40
Franchiser
гуру
22.04.20
✎
13:37
|
(39) Если ошибки будут повторяться, то буду инициировать перезапуск ФЗ или повторную обработку документа нет, но т.к. нормальной паузы в 1С нет, то не представляю как это красиво сделать
|
|||
41
fisher
22.04.20
✎
14:00
|
(40) Тебе в любом случае нужен либо координатор, контролирующий работу воркеров либо персистентная очередь заданий на регистре сведений, либо и то и другое.
|
|||
42
Cyberhawk
22.04.20
✎
14:02
|
(40) "нормальной паузы в 1С нет" // Даже в БТС уже давненько есть, самому сделать тоже дело двух минут
|
|||
43
VladZ
22.04.20
✎
14:03
|
(0) " Метод УстановитьПометкуУдаления работает долго, поэтому делаю аналог." - ага-ага.
Ждем стадии: вся конфа работает долго, поэтому делаю аналог. |
|||
44
fisher
22.04.20
✎
14:07
|
(40) Координатор - да. Нормально без паузы не построишь. Но в фоновом пауза очень просто реализуется, путем ожидания завершения собственного фонового (там таймаут можно задать).
|
|||
45
Cyberhawk
22.04.20
✎
20:52
|
(44) Координатору пауза может потребоваться только если этот управляющий сеанс живет все время, пока живы воркеры. Иначе никакой паузы внутри там не требуется - просто очередной такт РЗ становится очередным координатором.
|
|||
46
Сияющий в темноте
23.04.20
✎
00:43
|
нет,а что вам не нравится в версии данных?
док=докСсылка.ПолучитьОбьект(); НачатьТранзакцию(); // здесь что-то меняем в документе док.Записать(РежимЗаписиДокумента.Запись); // отменяем транзакцию ОтменитьТранзакцию(); // и при попытке записать получаем различие версий док.Записать(...); |
|||
47
fisher
23.04.20
✎
09:09
|
(45) > Координатору пауза может потребоваться только если этот управляющий сеанс живет все время, пока живы воркеры
А в противном случае состояние придется персистить. А если это будет персистентная очередь, то можно и вообще без координатора обойтись. |
|||
48
Franchiser
гуру
23.04.20
✎
11:05
|
(42) Видел я паузу в БТС, эта пауза работает если вызвать ее с сервера, а вызов из фонового по ней не работает, т.к. проверяется сеанс фоновое здание или нет.
|
|||
49
Cyberhawk
23.04.20
✎
11:06
|
(47) Реализация идемпотентности для повторных стартов воркеров, как правило, дороже и сложнее, чем хранение состояний обработки.
У хранения состояний разве что единственный минус - это нужда в дополнительном контуре контроля, когда оно там начало обрабатываться и на подозрительно долгое время безнадежно подвисло. |
|||
50
Franchiser
гуру
23.04.20
✎
11:07
|
" путем ожидания завершения собственного фонового (там таймаут можно задать)." Объясни подробнее, мне пауза нужна внутри фонового, а не снаружи.
|
|||
51
Franchiser
гуру
23.04.20
✎
11:10
|
(46) да я понял, это как следствие
|
|||
52
Cyberhawk
23.04.20
✎
11:11
|
(48) Никто не мешает из сеанса ФЗ запустить ФЗ и ОжидатьЗавершенияВыполнения
|
|||
53
fisher
23.04.20
✎
11:12
|
(50) У фонового задания есть метод ОжидатьЗавершения(). Это и есть человеческая пауза.
Находишь в фоновом задании через менеджер фоновых свое фоновое же текущее фоновое и вызываешь ему ОжидатьЗавершения() с нужным таймаутом. И получается что оно становится в паузу ожидая завершения себя же. Ну, это один из вариантов. |
|||
54
Franchiser
гуру
23.04.20
✎
11:12
|
(52) так и сделано, я не хочу полностью все ФЗ перезапускать, т.к. это дольше чем перезаписать 1 документ внутри порции ФЗ.
|
|||
55
Franchiser
гуру
23.04.20
✎
11:14
|
(52) если из фз можно запустить ФЗ то ок (нужно попробовать).
Но функция БТС.Пауза() все равно не подъодит в том виде. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |