Конфликт блокировок при записи объекта справочника

1. user1772925 24.09.24 09:36 Сейчас в теме
Есть процедура создания контрагента и физического лица, при попытке записать объект ФизЛицо выскакивает конфликт блокировок. Не могу понять в чем причина. Возможен ли конфликт блокировок именно при создании нового объекта или все же это из-за полученного объекта (ПолучитьОбъект()) ?

МЕСТО ОШИБКИ:
Попытка
        ФизЛицо.Записать();                            
    Исключение                
        ОбщегоНазначения.СообщитьПользователю("Не удалось записать физ.лицо по причине: " + ОписаниеОшибки(),,,,Отказ);                    
        ОтменитьТранзакцию();
        Возврат;    
    КонецПопытки;


КРАТКИЙ КОД:
&НаСервере
Процедура СоздатьВладельцаНаСервере(Знач Контрагент = Неопределено, Отказ)
	НачатьТранзакцию();
	Если Контрагент = Неопределено Тогда
		Контрагент = Справочники.Контрагенты.СоздатьЭлемент();		
		// заполняем реквизиты контрагента					
	Иначе
		Контрагент = Контрагент.ПолучитьОбъект();		
		// заполняем реквизиты контрагента					
	КонецЕсли;
	
	//Создадим физика	
	Если НЕ ЗначениеЗаполнено(Контрагент.ФизЛицо) Тогда		
		ФизЛицо = Справочники.ФизическиеЛица.СоздатьЭлемент();
		// заполняем реквизиты физ. лица		
	Иначе
		ФизЛицо = Контрагент.ФизЛицо.ПолучитьОбъект();	
		// заполняем реквизиты физ. лица			
	КонецЕсли;
	// заполняем другие реквизиты физ. лица	
	
	Попытка
		ФизЛицо.Записать();							
	Исключение				
		ОбщегоНазначения.СообщитьПользователю("Не удалось записать физ.лицо по причине: " + ОписаниеОшибки(),,,,Отказ);					
		ОтменитьТранзакцию();
		Возврат;	
	КонецПопытки;
	
	// заполняем другие реквизиты контрагента		
	Попытка
		Контрагент.Записать();
	Исключение
		ОбщегоНазначения.СообщитьПользователю("Не удалось записать контрагента по причине: "+ОписаниеОшибки(),,,,Отказ);
		ОтменитьТранзакцию();
		Возврат;
	КонецПопытки;
	
	ЗаполнитьДополнительныеСвойства(Контрагент.Ссылка);
	ЗафиксироватьТранзакцию();	
	ВладелецКарты = Контрагент.Ссылка;
	
КонецПроцедуры
Показать


ПОЛНЫЙ КОД:
&НаСервере
Процедура СоздатьВладельцаНаСервере(Знач Контрагент = Неопределено, Отказ)
	НачатьТранзакцию();

	Если Контрагент = Неопределено Тогда
		Контрагент = Справочники.Контрагенты.СоздатьЭлемент();
		
		//контакты
		НомерТелефона = Контрагент.КонтактнаяИнформация.Добавить();
		НомерТелефона.Тип = Перечисления.ТипыКонтактнойИнформации.Телефон;
		НомерТелефона.Вид = Справочники.ВидыКонтактнойИнформации.ТелефонКонтрагента;
		НомерТелефона.Представление = Телефон;
		НомерТелефона.НомерТелефона = Телефон;
		
		Если ЗначениеЗаполнено(ЭлектроннаяПочта) Тогда
			
			КИ_ЭлектроннаяПочта = Контрагент.КонтактнаяИнформация.Добавить();
			КИ_ЭлектроннаяПочта.Тип = Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты;
			КИ_ЭлектроннаяПочта.Вид = Справочники.ВидыКонтактнойИнформации.EmailКонтрагента;
			КИ_ЭлектроннаяПочта.Представление = ЭлектроннаяПочта;
			КИ_ЭлектроннаяПочта.АдресЭП = ЭлектроннаяПочта;
			
		КонецЕсли;
		
		Контрагент.м_Страна = ЭтаФорма.РеквСтрана;
		Контрагент.м_Город = ЭтаФорма.РеквГород;
				
	Иначе
		Контрагент = Контрагент.ПолучитьОбъект();
		
		Для каждого СтрокаКИ Из Контрагент.КонтактнаяИнформация Цикл
			
			Если СтрокаКИ.Вид = Справочники.ВидыКонтактнойИнформации.EmailКонтрагента И ЗначениеЗаполнено(ЭлектроннаяПочта) Тогда
				СтрокаКИ.Представление = ЭлектроннаяПочта;
				СтрокаКИ.АдресЭП = ЭлектроннаяПочта;
			ИначеЕсли СтрокаКИ.Вид = Справочники.ВидыКонтактнойИнформации.ТелефонКонтрагента Тогда
				СтрокаКИ.Представление = Телефон;
				СтрокаКИ.НомерТелефона = Телефон;
			КонецЕсли;
			
		КонецЦикла;
			
		Если НЕ ЗначениеЗаполнено(Контрагент.м_Страна) Тогда
			Контрагент.м_Страна = ЭтаФорма.РеквСтрана;
		ИначеЕсли НЕ ЗначениеЗаполнено(Контрагент.м_Город) Тогда
			Контрагент.м_Город = ЭтаФорма.РеквГород;
		КонецЕсли;
				
	КонецЕсли;
	
	//Создадим физика
	
	Если НЕ ЗначениеЗаполнено(Контрагент.ФизЛицо) Тогда		
		ФизЛицо = Справочники.ФизическиеЛица.СоздатьЭлемент();
		//контакты
		НомерТелефона = ФизЛицо.КонтактнаяИнформация.Добавить();
		НомерТелефона.Тип = Перечисления.ТипыКонтактнойИнформации.Телефон;
		НомерТелефона.Вид = Справочники.ВидыКонтактнойИнформации.ТелефонФизическогоЛица;
		НомерТелефона.Представление = Телефон;
		НомерТелефона.НомерТелефона = Телефон;
		
		Если ЗначениеЗаполнено(ЭлектроннаяПочта) Тогда
			
			КИ_ЭлектроннаяПочта = ФизЛицо.КонтактнаяИнформация.Добавить();
			КИ_ЭлектроннаяПочта.Тип = Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты;
			КИ_ЭлектроннаяПочта.Вид = Справочники.ВидыКонтактнойИнформации.EmailФизическогоЛица;
			КИ_ЭлектроннаяПочта.Представление = ЭлектроннаяПочта;
			КИ_ЭлектроннаяПочта.АдресЭП = ЭлектроннаяПочта;
			
		КонецЕсли;
	
	Иначе
		ФизЛицо = Контрагент.ФизЛицо.ПолучитьОбъект();
		
		Для каждого СтрокаКИ Из ФизЛицо.КонтактнаяИнформация Цикл
			
			Если СтрокаКИ.Вид = Справочники.ВидыКонтактнойИнформации.EmailФизическогоЛица И ЗначениеЗаполнено(ЭлектроннаяПочта) Тогда
				СтрокаКИ.Представление = ЭлектроннаяПочта;
				СтрокаКИ.АдресЭП = ЭлектроннаяПочта;
			ИначеЕсли СтрокаКИ.Вид = Справочники.ВидыКонтактнойИнформации.ТелефонФизическогоЛица Тогда
				СтрокаКИ.Представление = Телефон;
				СтрокаКИ.НомерТелефона = Телефон;
			КонецЕсли;
			
		КонецЦикла;
		
	КонецЕсли;

	ФизЛицо.Наименование = СокрЛП(Фамилия + " " + Имя + " " + Отчество);
	ФизЛицо.ДатаРождения = ДатаРождения;
	ФизЛицо.Пол = Пол;
	ФизЛицо.EmailОтсутствует = EmailОтсутствует;
	ФизЛицо.м_ОтказалсяОтСМСРассылки = м_ОтказалсяОтСМСРассылки;
	
	Попытка
		ФизЛицо.Записать();		
				
		МенеджерЗаписи = РегистрыСведений.ФИОФизЛиц.СоздатьМенеджерЗаписи();
		МенеджерЗаписи.ФизЛицо = ФизЛицо.Ссылка;
		МенеджерЗаписи.Период = ТекущаяДата();
		МенеджерЗаписи.Фамилия = Фамилия;
		МенеджерЗаписи.Имя = Имя;
		МенеджерЗаписи.Отчество = Отчество;
		МенеджерЗаписи.Записать(Истина);
		
	Исключение				
		ОбщегоНазначения.СообщитьПользователю("Не удалось записать физ.лицо по причине: " + ОписаниеОшибки(),,,,Отказ);					
		ОтменитьТранзакцию();
		Возврат;
	
	КонецПопытки;
	
	//заполним контрагента
	Контрагент.Наименование = СокрЛП(Фамилия + " " + Имя + " " + Отчество);
	Контрагент.НаименованиеПолное = СокрЛП(Фамилия + " " + Имя + " " + Отчество);
	Контрагент.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ФизЛицо;
	Контрагент.ФизЛицо = ФизЛицо.Ссылка;
	Контрагент.Покупатель = Истина;
	
	Попытка
		Контрагент.Записать();
	Исключение
		ОбщегоНазначения.СообщитьПользователю("Не удалось записать контрагента по причине: "+ОписаниеОшибки(),,,,Отказ);
		ОтменитьТранзакцию();
		Возврат;
	КонецПопытки;
	
	ЗаполнитьДополнительныеСвойства(Контрагент.Ссылка);
	ЗафиксироватьТранзакцию();
	
	ВладелецКарты = Контрагент.Ссылка;
	
КонецПроцедуры
Показать
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. user2033930 24.09.24 09:47 Сейчас в теме
То есть на какой конкретно строчке у тебя крашится транзакция - нам дано предугадать самим. Замечательно.
3. user1772925 24.09.24 09:50 Сейчас в теме
(2) Здравствуйте, в начале написал при попытке записать объект ФизЛицо.

 Попытка
        ФизЛицо.Записать();                            
    Исключение                
        ОбщегоНазначения.СообщитьПользователю("Не удалось записать физ.лицо по причине: " + ОписаниеОшибки(),,,,Отказ);                    
        ОтменитьТранзакцию();
        Возврат;    
    КонецПопытки;


Вот здесь возникает конфликт блокировок
4. Lenten 25 24.09.24 10:17 Сейчас в теме
ФизЛицо.Записать();        
                
        МенеджерЗаписи = РегистрыСведений.ФИОФизЛиц.СоздатьМенеджерЗаписи();
        МенеджерЗаписи.ФизЛицо = ФизЛицо.Ссылка;
        МенеджерЗаписи.Период = ТекущаяДата();
        МенеджерЗаписи.Фамилия = Фамилия;
        МенеджерЗаписи.Имя = Имя;
        МенеджерЗаписи.Отчество = Отчество;
        МенеджерЗаписи.Записать(Истина);
Показать



попробуйте разделить 2 эти записи на 2 попытки


и скиньте текст ошибки
5. user1772925 24.09.24 10:41 Сейчас в теме
разделил на 2 попытки, но ошибка именно при записи объекта "ФизЛицо".

Текст ошибки: "Ошибка при вызове метода контекста (Записать): Конфликт блокировок при выполнении транзакции."
6. user1772925 24.09.24 10:42 Сейчас в теме
(4) разделил на 2 попытки, но ошибка именно при записи объекта "ФизЛицо".

Текст ошибки: "Ошибка при вызове метода контекста (Записать): Конфликт блокировок при выполнении транзакции."
Оставьте свое сообщение

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