Определить, кто заблокировал объект
Добрый день, коллеги!
Написал одну обработку, которая в транзакции меняет множество документов.
И сейчас возникла проблема, что кто-то один из этих объектов заблокировал.
Можно написать алгоритм, на каком объекте споткнулась обработка.
Но все равно придется выяснять кто наложил блокировку.
Посмотрел в 1С нет механизма, как это программно можно быстро сделать.
Есть варианты с костылями через ЖР, но если блокировка будет в фоне не уверен, что сработает.
Кто какие решения делал?
Написал одну обработку, которая в транзакции меняет множество документов.
И сейчас возникла проблема, что кто-то один из этих объектов заблокировал.
Можно написать алгоритм, на каком объекте споткнулась обработка.
Но все равно придется выяснять кто наложил блокировку.
Посмотрел в 1С нет механизма, как это программно можно быстро сделать.
Есть варианты с костылями через ЖР, но если блокировка будет в фоне не уверен, что сработает.
Кто какие решения делал?
По теме из базы знаний
Найденные решения
(0)
P.S. Cкопистил из своей конфы, возможно где-то ошибся, но принцип примерно такой.
Функция ЗаблокироватьДанные(Ссылка, ВерсияДанных, УникальныйИдентификатор) Экспорт
Попытка ЗаблокироватьДанныеДляРедактирования(Ссылка, ВерсияДанных, УникальныйИдентификатор);
Исключение Возврат ОписаниеОшибки();
КонецПопытки;
Возврат "";
КонецФункции
Результат=ЗаблокироватьДанные(Объект.Ссылка, Объект.ВерсияДанных, Форма.УникальныйИдентификатор);
МассивСтрок=СтрРазделить(СтрПолучитьСтроку(Результат, 2), ",");
Пользователь=СтрРазделить(МассивСтрок[1]; //Имя пользователя который заблокировал объект
ПоказатьP.S. Cкопистил из своей конфы, возможно где-то ошибся, но принцип примерно такой.
(17) все получилось как нужно.
Транзакция не падает. Попытка в заблокировать для редактирование свое дело делает!
Ключевой момент в том что работает метод:
А вот метод
Ничего не выводит.
Дополнительно еще предложил до запуска алгоритма запустить такую проверку.
Чтобы пользователи которые влезли в документы не плювались, когда алгоритм завершится!
Транзакция не падает. Попытка в заблокировать для редактирование свое дело делает!
Ключевой момент в том что работает метод:
ОписаниеОшибки()
А вот метод
ИнформацияОбОшибке()
Ничего не выводит.
Дополнительно еще предложил до запуска алгоритма запустить такую проверку.
Чтобы пользователи которые влезли в документы не плювались, когда алгоритм завершится!
Остальные ответы
В избранное
Подписаться на ответы
Сортировка:
Древо развёрнутое
Свернуть все
(11) проверил, схему. Я открыл док который будет алгоритм менять, внес туда правку и запустил обработку. Как итог обработка все сделала. А мне выдало что мои правки не примут, обновляй объект.
Выходит искать виновника, то не нужно.
Блокировка, короткая и достаточно просто вывести какой объект не удалось отредактировать.
Хотя у меня была проблема, иного характера. Код был паленный после обновления типовая функция переименовалась. А 1С не сообщила об ошибке, т.к. код был в транзакции.
Выходит искать виновника, то не нужно.
Блокировка, короткая и достаточно просто вывести какой объект не удалось отредактировать.
Хотя у меня была проблема, иного характера. Код был паленный после обновления типовая функция переименовалась. А 1С не сообщила об ошибке, т.к. код был в транзакции.
(15) дополнительно оказалось, что тянуть результат с сервера на клиент нельзя, а в справке написано, что везде есть.
Но и там и там пусто. В общем решил, что просто поменяю вывод сообщения, то что ошибка в коде. Ситуации с блокировкой как таковой выходит не может возникнуть, т.к. проведение 1 дока не будет занимать более 30 сек. И взаимоблокировка не возникнет.
ИнформацияОбОшибке()
Но и там и там пусто. В общем решил, что просто поменяю вывод сообщения, то что ошибка в коде. Ситуации с блокировкой как таковой выходит не может возникнуть, т.к. проведение 1 дока не будет занимать более 30 сек. И взаимоблокировка не возникнет.
(9) в БП вот такая функция
// Определяет количество сеансов информационной базы и наличие сеансов,
// которые не могут быть отключены принудительно. Формирует текст сообщения
// об ошибке.
//
Функция ИнформацияОБлокирующихСеансах(ТекстСообщения = "") Экспорт
ИнформацияОБлокирующихСеансах = Новый Структура;
НомерТекущегоСеанса = НомерСеансаИнформационнойБазы();
СеансыИнформационнойБазы = ПолучитьСеансыИнформационнойБазы();
ИмеютсяБлокирующиеСеансы = Ложь;
Если ОбщегоНазначения.ИнформационнаяБазаФайловая() Тогда
ИменаАктивныхСеансов = "";
Для Каждого Сеанс Из СеансыИнформационнойБазы Цикл
Если Сеанс.НомерСеанса <> НомерТекущегоСеанса
И Сеанс.ИмяПриложения <> "1CV8"
И Сеанс.ИмяПриложения <> "1CV8C"
И Сеанс.ИмяПриложения <> "WebClient" Тогда
ИменаАктивныхСеансов = ИменаАктивныхСеансов + Символы.ПС + "• " + Сеанс;
ИмеютсяБлокирующиеСеансы = Истина;
КонецЕсли;
КонецЦикла;
КонецЕсли;
ИнформацияОБлокирующихСеансах.Вставить("ИмеютсяБлокирующиеСеансы", ИмеютсяБлокирующиеСеансы);
ИнформацияОБлокирующихСеансах.Вставить("КоличествоСеансов", СеансыИнформационнойБазы.Количество());
Если ИмеютсяБлокирующиеСеансы Тогда
Сообщение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Имеются активные сеансы работы с программой,
|которые не могут быть завершены принудительно:
|%1
|%2'"),
ИменаАктивныхСеансов, ТекстСообщения);
ИнформацияОБлокирующихСеансах.Вставить("ТекстСообщения", Сообщение);
КонецЕсли;
Возврат ИнформацияОБлокирующихСеансах;
КонецФункции
Показать
(0)
P.S. Cкопистил из своей конфы, возможно где-то ошибся, но принцип примерно такой.
Функция ЗаблокироватьДанные(Ссылка, ВерсияДанных, УникальныйИдентификатор) Экспорт
Попытка ЗаблокироватьДанныеДляРедактирования(Ссылка, ВерсияДанных, УникальныйИдентификатор);
Исключение Возврат ОписаниеОшибки();
КонецПопытки;
Возврат "";
КонецФункции
Результат=ЗаблокироватьДанные(Объект.Ссылка, Объект.ВерсияДанных, Форма.УникальныйИдентификатор);
МассивСтрок=СтрРазделить(СтрПолучитьСтроку(Результат, 2), ",");
Пользователь=СтрРазделить(МассивСтрок[1]; //Имя пользователя который заблокировал объект
ПоказатьP.S. Cкопистил из своей конфы, возможно где-то ошибся, но принцип примерно такой.
(19) опробовал метод тоже самое получил:
И перезапуск клиента.
Хотя сейчас например, открыл док, который нужно редактировать.
Блокировка вывалилась в ошибку:
18.03.2020 16:04:41
В данной транзакции уже происходили ошибки!
В данной транзакции уже происходили ошибки!
И перезапуск клиента.
Хотя сейчас например, открыл док, который нужно редактировать.
Блокировка вывалилась в ошибку:
Ошибка при вызове метода контекста (ЗаблокироватьДанныеДляРедактирования): Ошибка блокировки объекта. Объект уже заблокирован:
компьютер: Мой, пользователь: я., сеанс: 9, начат: 18.03.2020 в 16:07:43, приложение: Тонкий клиент
компьютер: Мой, пользователь: я., сеанс: 9, начат: 18.03.2020 в 16:07:43, приложение: Тонкий клиент
(17) все получилось как нужно.
Транзакция не падает. Попытка в заблокировать для редактирование свое дело делает!
Ключевой момент в том что работает метод:
А вот метод
Ничего не выводит.
Дополнительно еще предложил до запуска алгоритма запустить такую проверку.
Чтобы пользователи которые влезли в документы не плювались, когда алгоритм завершится!
Транзакция не падает. Попытка в заблокировать для редактирование свое дело делает!
Ключевой момент в том что работает метод:
ОписаниеОшибки()
А вот метод
ИнформацияОбОшибке()
Ничего не выводит.
Дополнительно еще предложил до запуска алгоритма запустить такую проверку.
Чтобы пользователи которые влезли в документы не плювались, когда алгоритм завершится!
Попытался это обойти попытками в итоге, если в транзакции будет попытка, то ссылочные типы не отображаются.
Как итог ошибка кода все равно. И нет отладки.
Про это тогда вопроса нет.
А вот про поиск того кто заблокировал объект в случае чего тоже не вышло. Если поставить точку останова на документе, который нужно перепровести, то алгоритм просто валится, даже если 30 секунд ожидания не прошло.
Зато сразу понятно что проблема в ожидании на блокировке.
Дополнительно напишу в 1С, чтобы подумали над реализацией программного анализа блокировки. По результатам отпишу.
Как итог ошибка кода все равно. И нет отладки.
Про это тогда вопроса нет.
А вот про поиск того кто заблокировал объект в случае чего тоже не вышло. Если поставить точку останова на документе, который нужно перепровести, то алгоритм просто валится, даже если 30 секунд ожидания не прошло.
Зато сразу понятно что проблема в ожидании на блокировке.
Дополнительно напишу в 1С, чтобы подумали над реализацией программного анализа блокировки. По результатам отпишу.
Вакансии
Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)