ERP Ошибка блокировки объекта. Объект уже заблокирован

1. user-z99999 71 01.07.24 18:38 Сейчас в теме
Интеграция с оборудованием на производстве.

После создания (изменения, удаления) документа в 1с,
нужно отправить в стороннюю базу (не 1с) информацию,
и записать результат в документ id задачи.

Создал подписку на событие у Документа ПередЗаписью
У меня доп.реквизит документа, пытаюсь в него записать.

Если просто выполнить код ниже, ошибок нет (создать отдельную обработку)
        Док = СсылкаДок;
	ДопСвойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("Имя", "Апи_id_2bc314bc370d4bd9bf8a246085953af3");
	
	ТабЗнач = Новый ТаблицаЗначений;        
	ТабЗнач.Колонки.Добавить("Свойство");
	ТабЗнач.Колонки.Добавить("Значение");

	НоваяСтрока = ТабЗнач.Добавить();
	НоваяСтрока.Свойство = ДопСвойство;
	НоваяСтрока.Значение = id; 
	УправлениеСвойствами.ЗаписатьСвойстваУОбъекта(Док, ТабЗнач);
Показать


А когда Пользователь открывает форму Документа и нажимает Провести и Закрыть,
ошибка -
Ошибка блокировки объекта. Объект уже заблокирован


Как правильно нужно сделать, чтобы удалось записать?

УправлениеСвойствами.ЗаписатьСвойстваУОбъекта(Док, ТабЗнач); -- бсп использую
Прикрепленные файлы:
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
7. user-z99999 71 02.07.24 18:11 Сейчас в теме
Решение:
Отказался от использования БСП.

Событие формы использую, ниже
&НаСервере
Процедура АПИ_ПриЗаписиНаСервереПосле(Отказ, ТекущийОбъект, ПараметрыЗаписи

                  ДопСвойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("Имя", "Апи_id_2bc314bc370d4bd9bf8a246085953af3");

				МассивСтрок = ТекущийОбъект.ДополнительныеРеквизиты.НайтиСтроки(Новый Структура("Свойство", ДопСвойство));
				Если МассивСтрок.Количество() Тогда
					СтрокаСвойства = МассивСтрок[0];
				Иначе
					СтрокаСвойства = ТекущийОбъект.ДополнительныеРеквизиты.Добавить();
				КонецЕсли;                                     
				   
				новСтруктура = Новый Структура("Свойство,Значение,ТекстоваяСтрока");
				новСтруктура.Свойство = ДопСвойство;
				новСтруктура.Значение = РезультатОтправки.id;

				ЗаполнитьЗначенияСвойств(СтрокаСвойства, новСтруктура, "Свойство,Значение,ТекстоваяСтрока");
				ТекущийОбъект.Записать();  

Показать
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Zevzm 01.07.24 21:15 Сейчас в теме
(1) Эта функция БСП пытается заблокировать объект и записать свойства в транзакции, но ПередЗаписью тоже внутри другой транзакции записи объекта, поэтому он заблокирован. Вызывайте запись доп свойств раньше или после основной транзакции. ИМХО
3. user-z99999 71 02.07.24 09:02 Сейчас в теме
4. Zevzm 02.07.24 09:06 Сейчас в теме
(3) В моем понимании все что внутри транзакции под запретом, т.к. объект будет заблокирован. Значит в любой момент до или после.
Прикрепленные файлы:
5. user-z99999 71 02.07.24 09:23 Сейчас в теме
(4)
В расширении, у формы события
Пробую ПередЗаписьюНаСервереПосле (в расширении)
ошибка - Ошибка блокировки объекта. Объект уже заблокирован....
Пробую ПослеЗаписиНаСервереПосле (в расширении)
ошибка - Ошибка блокировки объекта. Объект уже заблокирован...
6. Zevzm 02.07.24 09:34 Сейчас в теме +0.01 $m
(5) У нас на новых релизах перестала выводиться информация в УПП кто заблокировал объект и пользователи бегали искали кто сидит в доке. Прикрутили кнопку с проверкой методом Заблокировать(). Получается согласно этому методу модифицированный объект уже заблокирован, даже до записи - я ввел вас в заблуждение. Но после записи, как только * исчезла он свободен. Почему у вас он все еще заблокирован в "ПослеЗаписиНаСервереПосле" я не понимаю.
Попробуйте использовать метод Заблокирован() у объекта, чтобы выяснить в каком из событий снимется блокировка.
7. user-z99999 71 02.07.24 18:11 Сейчас в теме
Решение:
Отказался от использования БСП.

Событие формы использую, ниже
&НаСервере
Процедура АПИ_ПриЗаписиНаСервереПосле(Отказ, ТекущийОбъект, ПараметрыЗаписи

                  ДопСвойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("Имя", "Апи_id_2bc314bc370d4bd9bf8a246085953af3");

				МассивСтрок = ТекущийОбъект.ДополнительныеРеквизиты.НайтиСтроки(Новый Структура("Свойство", ДопСвойство));
				Если МассивСтрок.Количество() Тогда
					СтрокаСвойства = МассивСтрок[0];
				Иначе
					СтрокаСвойства = ТекущийОбъект.ДополнительныеРеквизиты.Добавить();
				КонецЕсли;                                     
				   
				новСтруктура = Новый Структура("Свойство,Значение,ТекстоваяСтрока");
				новСтруктура.Свойство = ДопСвойство;
				новСтруктура.Значение = РезультатОтправки.id;

				ЗаполнитьЗначенияСвойств(СтрокаСвойства, новСтруктура, "Свойство,Значение,ТекстоваяСтрока");
				ТекущийОбъект.Записать();  

Показать
Оставьте свое сообщение

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