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

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

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

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

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

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


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

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

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

Дополнительно еще предложил до запуска алгоритма запустить такую проверку.
Чтобы пользователи которые влезли в документы не плювались, когда алгоритм завершится!
Остальные ответы
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
2. ben19791010 18.03.20 12:27 Сейчас в теме
(1)
но если блокировка будет в фоне
в жр же вроде и фоновые показывает (если с др сервера запускаются)
3. Xershi 1475 18.03.20 12:29 Сейчас в теме
(2) ЖР показывает сам факт записи. Но не блокировки.
11. ben19791010 18.03.20 12:54 Сейчас в теме
(1)
которая в транзакции меняет множество документов
это значит, что есть перепроведение, например? или запись в любой из регистров? (я к тому, что может это изменение и накладывает блокировки?)
12. Xershi 1475 18.03.20 12:57 Сейчас в теме
(11) проверил, схему. Я открыл док который будет алгоритм менять, внес туда правку и запустил обработку. Как итог обработка все сделала. А мне выдало что мои правки не примут, обновляй объект.
Выходит искать виновника, то не нужно.
Блокировка, короткая и достаточно просто вывести какой объект не удалось отредактировать.
Хотя у меня была проблема, иного характера. Код был паленный после обновления типовая функция переименовалась. А 1С не сообщила об ошибке, т.к. код был в транзакции.
13. Xershi 1475 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 1475 18.03.20 13:27 Сейчас в теме
(15) дополнительно оказалось, что тянуть результат
ИнформацияОбОшибке()
с сервера на клиент нельзя, а в справке написано, что везде есть.
Но и там и там пусто. В общем решил, что просто поменяю вывод сообщения, то что ошибка в коде. Ситуации с блокировкой как таковой выходит не может возникнуть, т.к. проведение 1 дока не будет занимать более 30 сек. И взаимоблокировка не возникнет.
4. duhin 18.03.20 12:29 Сейчас в теме
Мб через технологический журнал попробовать проанализировать блокировки.
7. Xershi 1475 18.03.20 12:40 Сейчас в теме
(4) это конечно можно. Можно вообще взять за базу обработку по анализу блокировок.
Но хотелось бы простого решения, а не все это.
5. ben19791010 18.03.20 12:32 Сейчас в теме
Если ИнформацияОБлокирующихСеансах.ИмеютсяБлокирующиеСеансы Тогда
		ВызватьИсключение ИнформацияОБлокирующихСеансах.ТекстСообщения;
	КонецЕсли;
такое не прокатит?
6. Xershi 1475 18.03.20 12:39 Сейчас в теме
(5)
ИнформацияОБлокирующихСеансах

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

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

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

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

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


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

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

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

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

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

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

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

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

Руководитель направления 1С
Москва
зарплата от 350 000 руб.
Полный день

1С Программист
Москва
зарплата от 180 000 руб.
Полный день

Программист 1С
Москва
зарплата от 180 000 руб. до 220 000 руб.
Полный день

Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)