Определить, кто заблокировал объект

1. Xershi 1484 18.03.20 12:25 Сейчас в теме
Добрый день, коллеги!
Написал одну обработку, которая в транзакции меняет множество документов.
И сейчас возникла проблема, что кто-то один из этих объектов заблокировал.
Можно написать алгоритм, на каком объекте споткнулась обработка.
Но все равно придется выяснять кто наложил блокировку.

Посмотрел в 1С нет механизма, как это программно можно быстро сделать.
Есть варианты с костылями через ЖР, но если блокировка будет в фоне не уверен, что сработает.

Кто какие решения делал?
По теме из базы знаний
Найденные решения
17. noprogrammer 237 18.03.20 15:20 Сейчас в теме
(0)
Функция ЗаблокироватьДанные(Ссылка, ВерсияДанных, УникальныйИдентификатор) Экспорт
	Попытка ЗаблокироватьДанныеДляРедактирования(Ссылка, ВерсияДанных, УникальныйИдентификатор);
	Исключение Возврат ОписаниеОшибки();
	КонецПопытки;
	Возврат "";
КонецФункции

Результат=ЗаблокироватьДанные(Объект.Ссылка, Объект.ВерсияДанных, Форма.УникальныйИдентификатор);

МассивСтрок=СтрРазделить(СтрПолучитьСтроку(Результат, 2), ",");
Пользователь=СтрРазделить(МассивСтрок[1]; //Имя пользователя который заблокировал объект
Показать


P.S. Cкопистил из своей конфы, возможно где-то ошибся, но принцип примерно такой.
HFerus; aezdakov; HAMMER_59; nekit_rdx; KirillZ44; psa247; olezhe; Xershi; +8 Ответить
21. Xershi 1484 18.03.20 16:37 Сейчас в теме
(17) все получилось как нужно.
Транзакция не падает. Попытка в заблокировать для редактирование свое дело делает!
Ключевой момент в том что работает метод:
ОписаниеОшибки()

А вот метод
ИнформацияОбОшибке()

Ничего не выводит.

Дополнительно еще предложил до запуска алгоритма запустить такую проверку.
Чтобы пользователи которые влезли в документы не плювались, когда алгоритм завершится!
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. ben19791010 18.03.20 12:27 Сейчас в теме
(1)
но если блокировка будет в фоне
в жр же вроде и фоновые показывает (если с др сервера запускаются)
3. Xershi 1484 18.03.20 12:29 Сейчас в теме
(2) ЖР показывает сам факт записи. Но не блокировки.
11. ben19791010 18.03.20 12:54 Сейчас в теме
(1)
которая в транзакции меняет множество документов
это значит, что есть перепроведение, например? или запись в любой из регистров? (я к тому, что может это изменение и накладывает блокировки?)
12. Xershi 1484 18.03.20 12:57 Сейчас в теме
(11) проверил, схему. Я открыл док который будет алгоритм менять, внес туда правку и запустил обработку. Как итог обработка все сделала. А мне выдало что мои правки не примут, обновляй объект.
Выходит искать виновника, то не нужно.
Блокировка, короткая и достаточно просто вывести какой объект не удалось отредактировать.
Хотя у меня была проблема, иного характера. Код был паленный после обновления типовая функция переименовалась. А 1С не сообщила об ошибке, т.к. код был в транзакции.
13. Xershi 1484 18.03.20 13:01 Сейчас в теме
(12) точнее не так у меня попытка и в ней транзакция. Поэтому не увидел текста ошибки.
Кстати в 8.3.17 или 8.3.18 для анализа сделали более удобный механизм, кто уже его тестировал, если в 8.3.17?

Мы пока поставили 8.3.15.
15. ben19791010 18.03.20 13:21 Сейчас в теме
(13)
Кстати в 8.3.17 или 8.3.18
ну уж их нафик...сидим пока ровно на 3.16
16. Xershi 1484 18.03.20 13:27 Сейчас в теме
(15) дополнительно оказалось, что тянуть результат
ИнформацияОбОшибке()
с сервера на клиент нельзя, а в справке написано, что везде есть.
Но и там и там пусто. В общем решил, что просто поменяю вывод сообщения, то что ошибка в коде. Ситуации с блокировкой как таковой выходит не может возникнуть, т.к. проведение 1 дока не будет занимать более 30 сек. И взаимоблокировка не возникнет.
4. duhin 18.03.20 12:29 Сейчас в теме
Мб через технологический журнал попробовать проанализировать блокировки.
7. Xershi 1484 18.03.20 12:40 Сейчас в теме
(4) это конечно можно. Можно вообще взять за базу обработку по анализу блокировок.
Но хотелось бы простого решения, а не все это.
5. ben19791010 18.03.20 12:32 Сейчас в теме
Если ИнформацияОБлокирующихСеансах.ИмеютсяБлокирующиеСеансы Тогда
		ВызватьИсключение ИнформацияОБлокирующихСеансах.ТекстСообщения;
	КонецЕсли;
такое не прокатит?
6. Xershi 1484 18.03.20 12:39 Сейчас в теме
(5)
ИнформацияОБлокирующихСеансах

Это вы откуда придумали?) В справке такого не нашел.
8. ben19791010 18.03.20 12:42 Сейчас в теме
(6) а это в БП есть
но суть то как я понял из-за "множества документов", не получится всё заблокировать для единой транзакции,
но даже если и выяснить кто и что заблокировал, то какие действия то потом?
9. Xershi 1484 18.03.20 12:49 Сейчас в теме
(8) ну потом буду освобождать от блокировки.
А это модуль такой.
Тут УТ проверю, если аналоги по коду.
10. yurikmellon 6 18.03.20 12:53 Сейчас в теме
(9) в БП вот такая функция

// Определяет количество сеансов информационной базы и наличие сеансов,
// которые не могут быть отключены принудительно. Формирует текст сообщения
// об ошибке.
//
Функция ИнформацияОБлокирующихСеансах(ТекстСообщения = "") Экспорт
	
	ИнформацияОБлокирующихСеансах = Новый Структура;
	
	НомерТекущегоСеанса = НомерСеансаИнформационнойБазы();
	СеансыИнформационнойБазы = ПолучитьСеансыИнформационнойБазы();
	
	ИмеютсяБлокирующиеСеансы = Ложь;
	Если ОбщегоНазначения.ИнформационнаяБазаФайловая() Тогда
		ИменаАктивныхСеансов = "";
		Для Каждого Сеанс Из СеансыИнформационнойБазы Цикл
			Если Сеанс.НомерСеанса <> НомерТекущегоСеанса
				И Сеанс.ИмяПриложения <> "1CV8"
				И Сеанс.ИмяПриложения <> "1CV8C"
				И Сеанс.ИмяПриложения <> "WebClient" Тогда
				ИменаАктивныхСеансов = ИменаАктивныхСеансов + Символы.ПС + "• " + Сеанс;
				ИмеютсяБлокирующиеСеансы = Истина;
			КонецЕсли;
		КонецЦикла;
	КонецЕсли;
	
	ИнформацияОБлокирующихСеансах.Вставить("ИмеютсяБлокирующиеСеансы", ИмеютсяБлокирующиеСеансы);
	ИнформацияОБлокирующихСеансах.Вставить("КоличествоСеансов", СеансыИнформационнойБазы.Количество());
	
	Если ИмеютсяБлокирующиеСеансы Тогда
		Сообщение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Имеются активные сеансы работы с программой,
			|которые не могут быть завершены принудительно:
			|%1
			|%2'"),
			ИменаАктивныхСеансов, ТекстСообщения);
		ИнформацияОБлокирующихСеансах.Вставить("ТекстСообщения", Сообщение);
		
	КонецЕсли;
	
	Возврат ИнформацияОБлокирующихСеансах;
	
КонецФункции
Показать
14. Xershi 1484 18.03.20 13:10 Сейчас в теме
Как итог причина ошибки в коде в процедуре &НаКлиентеНаСервереБезКонтекста.
После того, как код падает в ошибку и переходит на исключение, то
ИнформацияОбОшибке()

Ничего не выводит.
17. noprogrammer 237 18.03.20 15:20 Сейчас в теме
(0)
Функция ЗаблокироватьДанные(Ссылка, ВерсияДанных, УникальныйИдентификатор) Экспорт
	Попытка ЗаблокироватьДанныеДляРедактирования(Ссылка, ВерсияДанных, УникальныйИдентификатор);
	Исключение Возврат ОписаниеОшибки();
	КонецПопытки;
	Возврат "";
КонецФункции

Результат=ЗаблокироватьДанные(Объект.Ссылка, Объект.ВерсияДанных, Форма.УникальныйИдентификатор);

МассивСтрок=СтрРазделить(СтрПолучитьСтроку(Результат, 2), ",");
Пользователь=СтрРазделить(МассивСтрок[1]; //Имя пользователя который заблокировал объект
Показать


P.S. Cкопистил из своей конфы, возможно где-то ошибся, но принцип примерно такой.
HFerus; aezdakov; HAMMER_59; nekit_rdx; KirillZ44; psa247; olezhe; Xershi; +8 Ответить
19. Xershi 1484 18.03.20 15:59 Сейчас в теме
(17)
ЗаблокироватьДанныеДляРедактирования

Выходит метод есть!
Сейчас опробую.
20. Xershi 1484 18.03.20 16:05 Сейчас в теме
(19) опробовал метод тоже самое получил:
18.03.2020 16:04:41
В данной транзакции уже происходили ошибки!

И перезапуск клиента.
Хотя сейчас например, открыл док, который нужно редактировать.
Блокировка вывалилась в ошибку:
Ошибка при вызове метода контекста (ЗаблокироватьДанныеДляРедактирования): Ошибка блокировки объекта. Объект уже заблокирован:
компьютер: Мой, пользователь: я., сеанс: 9, начат: 18.03.2020 в 16:07:43, приложение: Тонкий клиент
21. Xershi 1484 18.03.20 16:37 Сейчас в теме
(17) все получилось как нужно.
Транзакция не падает. Попытка в заблокировать для редактирование свое дело делает!
Ключевой момент в том что работает метод:
ОписаниеОшибки()

А вот метод
ИнформацияОбОшибке()

Ничего не выводит.

Дополнительно еще предложил до запуска алгоритма запустить такую проверку.
Чтобы пользователи которые влезли в документы не плювались, когда алгоритм завершится!
22. olezhe 21 21.12.20 19:37 Сейчас в теме
(17)
Спасибо, воспользовался способом.
18. Xershi 1484 18.03.20 15:56 Сейчас в теме
Попытался это обойти попытками в итоге, если в транзакции будет попытка, то ссылочные типы не отображаются.
Как итог ошибка кода все равно. И нет отладки.
Про это тогда вопроса нет.

А вот про поиск того кто заблокировал объект в случае чего тоже не вышло. Если поставить точку останова на документе, который нужно перепровести, то алгоритм просто валится, даже если 30 секунд ожидания не прошло.
Зато сразу понятно что проблема в ожидании на блокировке.

Дополнительно напишу в 1С, чтобы подумали над реализацией программного анализа блокировки. По результатам отпишу.
23. alljoke 13.03.23 16:20 Сейчас в теме
(18)
Удалось чтото прояснить у 1С ?
24. Xershi 1484 13.03.23 16:22 Сейчас в теме
(23) уже не помню чем закончилось. Скорее всего ничем. Проверяйте свежие релизы.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот