Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Метод Заблокировать ()

Метод Заблокировать ()
Я
   Franchiser
 
22.04.20 - 12:14
Мне нужно удалить движения документа и установить признак пометка удаления если удалось удалить движения. Метод УстановитьПометкуУдаления работает долго, поэтому делаю аналог.
Вопрос:
Можно использовать метод ДокументОбъект Заблокировать().
А можно в транзакции создать объект БлокировкаДанных и использовать у него метод заблокировать() с видом блокировки Исключительный.

Есть ли какая то принципиальная разница в использовании Заблокировать() у ДокументОбъект и у БлокировкаДанных?
   Ненавижу 1С
 
1 - 22.04.20 - 12:25
"Метод УстановитьПометкуУдаления работает долго, поэтому делаю аналог" - ну-ну
а не проще сделать:
ДокументОбъект.ПометкаУдаления = Истина;
ДокументОбъект.Записать();

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

КОнецПопытки;
   fisher
 
33 - 22.04.20 - 13:15
(32) А! Типа багофича, что не получится повторно записать с помощью того же объекта, если по нему уже был сбой записи? Х.з, вполне может быть.
   Franchiser
 
34 - 22.04.20 - 13:17
   fisher
 
35 - 22.04.20 - 13:17
Если так, тогда причиной могла быть и блокировка в сопутствующих таблицах. И вот там неизвестно,  можно ее избежать или нет. Ты же небось еще и в пакетных транзакциях делаешь, для ускорения?
   Franchiser
 
36 - 22.04.20 - 13:20
Не, я не делаю пакетных транзакций, т.к. мне пока важно получить лог именно документов с ошибками, иначе придется в лог писать все документы из транзакций с ошибками.
   Franchiser
 
37 - 22.04.20 - 13:26
(35) На текущий момент вижу только Х блокировки по записям регистров накопления, сведений и БУ. Буду дальше мониторить.
   fisher
 
38 - 22.04.20 - 13:30
(34) Что-то эта статья доверия не вызывает. Ясен пень, версия у ссылки очищается. Ведь после отката нет никакой ссылки. Может проблема и существует, но расследование вызывает вопросы.
   fisher
 
39 - 22.04.20 - 13:33
(37) Просто если причиной сбоя является широкий диапазон блокирования в сопутствующей таблицей (возможно из-за экскалации), то возможно этого и не получится полностью избежать. И редкие сбои все равно возможны и нужно будет их корректно обрабатывать.
   Franchiser
 
40 - 22.04.20 - 13:37
(39) Если ошибки будут повторяться, то буду инициировать перезапуск ФЗ или повторную обработку документа нет, но т.к. нормальной паузы в 1С нет, то не представляю как это красиво сделать
   fisher
 
41 - 22.04.20 - 14:00
(40) Тебе в любом случае нужен либо координатор, контролирующий работу воркеров либо персистентная очередь заданий на регистре сведений, либо и то и другое.
   Cyberhawk
 
42 - 22.04.20 - 14:02
(40) "нормальной паузы в 1С нет" // Даже в БТС уже давненько есть, самому сделать тоже дело двух минут
   VladZ
 
43 - 22.04.20 - 14:03
(0) " Метод УстановитьПометкуУдаления работает долго, поэтому делаю аналог." - ага-ага.

Ждем стадии: вся конфа работает долго, поэтому делаю аналог.
   fisher
 
44 - 22.04.20 - 14:07
(40) Координатор - да. Нормально без паузы не построишь. Но в фоновом пауза очень просто реализуется, путем ожидания завершения собственного фонового (там таймаут можно задать).
   Cyberhawk
 
45 - 22.04.20 - 20:52
(44) Координатору пауза может потребоваться только если этот управляющий сеанс живет все время, пока живы воркеры. Иначе никакой паузы внутри там не требуется - просто очередной такт РЗ становится очередным координатором.
   Сияющий в темноте
 
46 - 23.04.20 - 00:43
нет,а что вам не нравится в версии данных?

док=докСсылка.ПолучитьОбьект();
НачатьТранзакцию();
//  здесь что-то меняем в документе

док.Записать(РежимЗаписиДокумента.Запись);
// отменяем транзакцию

ОтменитьТранзакцию();
// и при попытке записать получаем различие версий

док.Записать(...);
   fisher
 
47 - 23.04.20 - 09:09
(45) > Координатору пауза может потребоваться только если этот управляющий сеанс живет все время, пока живы воркеры
А в противном случае состояние придется персистить. А если это будет персистентная очередь, то можно и вообще без координатора обойтись.
   Franchiser
 
48 - 23.04.20 - 11:05
(42) Видел я паузу в БТС, эта пауза работает если вызвать ее с сервера, а вызов из фонового по ней не работает, т.к. проверяется сеанс фоновое здание или нет.
   Cyberhawk
 
49 - 23.04.20 - 11:06
(47) Реализация идемпотентности для повторных стартов воркеров, как правило, дороже и сложнее, чем хранение состояний обработки.
У хранения состояний разве что единственный минус - это нужда в дополнительном контуре контроля, когда оно там начало обрабатываться и на подозрительно долгое время безнадежно подвисло.
   Franchiser
 
50 - 23.04.20 - 11:07
" путем ожидания завершения собственного фонового (там таймаут можно задать)." Объясни подробнее, мне пауза нужна внутри фонового, а не снаружи.
   Franchiser
 
51 - 23.04.20 - 11:10
(46) да я понял, это как следствие
   Cyberhawk
 
52 - 23.04.20 - 11:11
(48) Никто не мешает из сеанса ФЗ запустить ФЗ и ОжидатьЗавершенияВыполнения
   fisher
 
53 - 23.04.20 - 11:12
(50) У фонового задания есть метод ОжидатьЗавершения(). Это и есть человеческая пауза.
Находишь в фоновом задании через менеджер фоновых свое фоновое же текущее фоновое и вызываешь ему ОжидатьЗавершения() с нужным таймаутом. И получается что оно становится в паузу ожидая завершения себя же.
Ну, это один из вариантов.
   Franchiser
 
54 - 23.04.20 - 11:12
(52) так и сделано, я не хочу полностью все ФЗ перезапускать, т.к. это дольше чем перезаписать 1 документ внутри порции ФЗ.
   Franchiser
 
55 - 23.04.20 - 11:14
(52) если из фз можно запустить ФЗ то ок (нужно попробовать).
Но функция БТС.Пауза() все равно не подъодит в том виде.


Список тем форума
Рекламное место пустует  Рекламное место пустует
Прочитай, хотя бы, Митичкина "Разработка в системе 1С:Предприятие 8". Волшебник
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.