Имя: Пароль:
1C
1С v8
Метод Заблокировать ()
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) если из фз можно запустить ФЗ то ок (нужно попробовать).
Но функция БТС.Пауза() все равно не подъодит в том виде.
Ошибка? Это не ошибка, это системная функция.