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

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

Кто какие решения делал?
---
```1c
    Функция ЗаблокироватьДанные(Ссылка, ВерсияДанных, УникальныйИдентификатор) Экспорт
    Попытка ЗаблокироватьДанныеДляРедактирования(Ссылка, ВерсияДанных, УникальныйИдентификатор);
    Исключение Возврат ОписаниеОшибки();
    КонецПопытки;
    Возврат ";
    КонецФункции

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

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

P.S. Cкопистил из своей конфы, возможно где-то ошибся, но принцип примерно такой.
---
все получилось как нужно.
Транзакция не падает. Попытка в заблокировать для редактирование свое дело делает!
Ключевой момент в том что работает метод:

```1c
    ОписаниеОшибки()
```

А вот метод

```1c
    ИнформацияОбОшибке()
```

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

Дополнительно еще предложил до запуска алгоритма запустить такую проверку.
Чтобы пользователи которые влезли в документы не плювались, когда алгоритм завершится!
---
но если блокировка будет в фоне в жр же вроде и фоновые показывает (если с др сервера запускаются)
---
ЖР показывает сам факт записи. Но не блокировки.
---
которая в транзакции меняет множество документов это значит, что есть перепроведение, например? или запись в любой из регистров? (я к тому, что может это изменение и накладывает блокировки?)
---
проверил, схему. Я открыл док который будет алгоритм менять, внес туда правку и запустил обработку. Как итог обработка все сделала. А мне выдало что мои правки не примут, обновляй объект.
Выходит искать виновника, то не нужно.
Блокировка, короткая и достаточно просто вывести какой объект не удалось отредактировать.
Хотя у меня была проблема, иного характера. Код был паленный после обновления типовая функция переименовалась. А 1С не сообщила об ошибке, т.к. код был в транзакции.
---
точнее не так у меня попытка и в ней транзакция. Поэтому не увидел текста ошибки.
Кстати в 8.3.17 или 8.3.18 для анализа сделали более удобный механизм, кто уже его тестировал, если в 8.3.17?

Мы пока поставили 8.3.15.
---
Кстати в 8.3.17 или 8.3.18 ну уж их нафик...сидим пока ровно на 3.16
---
дополнительно оказалось, что тянуть результат
```1c
    ИнформацияОбОшибке()
```
 с сервера на клиент нельзя, а в справке написано, что везде есть.
Но и там и там пусто. В общем решил, что просто поменяю вывод сообщения, то что ошибка в коде. Ситуации с блокировкой как таковой выходит не может возникнуть, т.к. проведение 1 дока не будет занимать более 30 сек. И взаимоблокировка не возникнет.
---
Мб через технологический журнал попробовать проанализировать блокировки.
---
это конечно можно. Можно вообще взять за базу обработку по анализу блокировок.
Но хотелось бы простого решения, а не все это.
---
```1c
    Если ИнформацияОБлокирующихСеансах.ИмеютсяБлокирующиеСеансы Тогда
    ВызватьИсключение ИнформацияОБлокирующихСеансах.ТекстСообщения;
    КонецЕсли;
```
 такое не прокатит?
---
ИнформацияОБлокирующихСеансах
Это вы откуда придумали?) В справке такого не нашел.
---
а это в БП есть
но суть то как я понял из-за "множества документов", не получится всё заблокировать для единой транзакции,
но даже если и выяснить кто и что заблокировал, то какие действия то потом?
---
ну потом буду освобождать от блокировки.
А это модуль такой.
Тут УТ проверю, если аналоги по коду.
---
в БП вот такая функция

```1c
    // Определяет количество сеансов информационной базы и наличие сеансов,
    // которые не могут быть отключены принудительно. Формирует текст сообщения
    // об ошибке.
    //
    Функция ИнформацияОБлокирующихСеансах(ТекстСообщения = ") Экспорт

    ИнформацияОБлокирующихСеансах = Новый Структура;

    НомерТекущегоСеанса = НомерСеансаИнформационнойБазы();
    СеансыИнформационнойБазы = ПолучитьСеансыИнформационнойБазы();

    ИмеютсяБлокирующиеСеансы = Ложь;
    Если ОбщегоНазначения.ИнформационнаяБазаФайловая() Тогда
    ИменаАктивныхСеансов = ";
    Для Каждого Сеанс Из СеансыИнформационнойБазы Цикл
    Если Сеанс.НомерСеанса <> НомерТекущегоСеанса
    И Сеанс.ИмяПриложения <> "1CV8"
    И Сеанс.ИмяПриложения <> "1CV8C"
    И Сеанс.ИмяПриложения <> "WebClient" Тогда
    ИменаАктивныхСеансов = ИменаАктивныхСеансов + Символы.ПС + "• " + Сеанс;
    ИмеютсяБлокирующиеСеансы = Истина;
    КонецЕсли;
    КонецЦикла;
    КонецЕсли;

    ИнформацияОБлокирующихСеансах.Вставить("ИмеютсяБлокирующиеСеансы", ИмеютсяБлокирующиеСеансы);
    ИнформацияОБлокирующихСеансах.Вставить("КоличествоСеансов", СеансыИнформационнойБазы.Количество());

    Если ИмеютсяБлокирующиеСеансы Тогда
    Сообщение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
    НСтр("ru = 'Имеются активные сеансы работы с программой,
    |которые не могут быть завершены принудительно:
    |%1
    |%2'"),
    ИменаАктивныхСеансов, ТекстСообщения);
    ИнформацияОБлокирующихСеансах.Вставить("ТекстСообщения", Сообщение);

    КонецЕсли;

    Возврат ИнформацияОБлокирующихСеансах;

    КонецФункции
```
---
Как итог причина ошибки в коде в процедуре &НаКлиентеНаСервереБезКонтекста.
После того, как код падает в ошибку и переходит на исключение, то

```1c
    ИнформацияОбОшибке()
```

Ничего не выводит.
---
```1c
    Функция ЗаблокироватьДанные(Ссылка, ВерсияДанных, УникальныйИдентификатор) Экспорт
    Попытка ЗаблокироватьДанныеДляРедактирования(Ссылка, ВерсияДанных, УникальныйИдентификатор);
    Исключение Возврат ОписаниеОшибки();
    КонецПопытки;
    Возврат ";
    КонецФункции

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

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

P.S. Cкопистил из своей конфы, возможно где-то ошибся, но принцип примерно такой.
---
ЗаблокироватьДанныеДляРедактирования
Выходит метод есть!
Сейчас опробую.
---
опробовал метод тоже самое получил:
18.03.2020 16:04:41
В данной транзакции уже происходили ошибки!
И перезапуск клиента.
Хотя сейчас например, открыл док, который нужно редактировать.
Блокировка вывалилась в ошибку:
Ошибка при вызове метода контекста (ЗаблокироватьДанныеДляРедактирования): Ошибка блокировки объекта. Объект уже заблокирован:
компьютер: Мой, пользователь: я., сеанс: 9, начат: 18.03.2020 в 16:07:43, приложение: Тонкий клиент
---
все получилось как нужно.
Транзакция не падает. Попытка в заблокировать для редактирование свое дело делает!
Ключевой момент в том что работает метод:

```1c
    ОписаниеОшибки()
```

А вот метод

```1c
    ИнформацияОбОшибке()
```

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

Дополнительно еще предложил до запуска алгоритма запустить такую проверку.
Чтобы пользователи которые влезли в документы не плювались, когда алгоритм завершится!
---
Спасибо, воспользовался способом.
---
Попытался это обойти попытками в итоге, если в транзакции будет попытка, то ссылочные типы не отображаются.
Как итог ошибка кода все равно. И нет отладки.
Про это тогда вопроса нет.

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

Дополнительно напишу в 1С, чтобы подумали над реализацией программного анализа блокировки. По результатам отпишу.
---
Удалось чтото прояснить у 1С ?
---
уже не помню чем закончилось. Скорее всего ничем. Проверяйте свежие релизы.