Конфликт блокировок при выполнении транзакции: Неустранимый конфликт блокировок

1. AndrewKop 12.01.19 19:05 Сейчас в теме
Написал вот такой код. Прошу не ругать (смотрите на аватар)
&НаКлиенте
Процедура Тык(Команда)
	ТыкНаСервере();
КонецПроцедуры

&НаСервереБезКонтекста
Процедура ТыкНаСервере()
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	Валюты.Ссылка,
		|	Валюты.ПометкаУдаления
		|ИЗ
		|	Справочник.Валюты КАК Валюты";
	
	РезультатЗапроса = Запрос.Выполнить();
	
	ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	
	Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
		Если ВыборкаДетальныеЗаписи.ПометкаУдаления Тогда
			НеправильнаяВалюта = ВыборкаДетальныеЗаписи.Ссылка;
		Иначе
			ПравильнаяВалюта = ВыборкаДетальныеЗаписи.Ссылка;
		КонецЕсли;
	КонецЦикла;
	
	МассивСсылка = Новый Массив;
	МассивСсылка.Добавить(НеправильнаяВалюта);
	ТабСсылок = НайтиПоСсылкам(МассивСсылка);
	Первые10 = 0;
	Для Каждого Ссылка из ТабСсылок Цикл
		
		Попытка //получить объект
			ОбъектПоССылке = Ссылка[1].ПолучитьОбъект();
		Исключение
			//Не объектный тип данных просто пропустим
			Продолжить;
		КонецПопытки;
		
		ОбъектМетаданных = Метаданные.НайтиПоТипу(ТипЗнч(ОбъектПоССылке));
		КоллекцияРеквизитов = ОбъектМетаданных.Реквизиты;
		
		Для Каждого Реквизит Из КоллекцияРеквизитов Цикл
			Если ОбъектПоССылке[Реквизит.Имя] = НеправильнаяВалюта Тогда
				ОбъектПоССылке[Реквизит.Имя] = ПравильнаяВалюта;
			КонецЕсли;
		КонецЦикла;
		
		НачатьТранзакцию();
			Если НЕ ОбъектПоССылке.ПометкаУдаления Тогда //Непомеченный на удаление объект
				
				//Определим является ли объект документом
				Если Метаданные.Документы.Содержит(ОбъектМетаданных) Тогда
					ЭтоДокумент = Истина;
				Иначе
					ЭтоДокумент = Ложь;
				КонецЕсли;
				
				Если ЭтоДокумент Тогда
					Если ОбъектПоССылке.Проведен Тогда
						ОбъектПоССылке.Записать(РежимЗаписиДокумента.ОтменаПроведения);
						ОбъектПоССылке.Записать(РежимЗаписиДокумента.Проведение);	
					Иначе 
						ОбъектПоССылке.Записать();
					КонецЕсли; 
				Иначе
					ОбъектПоССылке.Записать();
				КонецЕсли;
				
			Иначе	//Помеченные на удаление объекты просто перезаписываем.
				//Может и не надо 2 раза записывать, я хз. На всякий.
				ОбъектПоССылке.Записать();	
				ОбъектПоССылке.УстановитьПометкуУдаления(Ложь);
				ОбъектПоССылке.Записать();
				ОбъектПоССылке.УстановитьПометкуУдаления(Истина);
				ОбъектПоССылке.Записать();
			КонецЕсли;
		ЗафиксироватьТранзакцию();
		
		Сообщить ("" + СокрЛП(Ссылка[0]) + "  " + СокрЛП(Ссылка[1]));
		
		//Первые10 = Первые10 + 1;
		//Если Первые10 >1000 Тогда
		//	Прервать;
		//КонецЕсли;
	КонецЦикла;

	
КонецПроцедуры
Показать


Запускаю, и до конца не отрабатывает, получаю следующую ошибку:
{ВнешняяОбработка.ИсправлениеВалют.Форма.Форма.Форма(64)}: Ошибка при вызове метода контекста (Записать)
ОбъектПоССылке.Записать(РежимЗаписиДокумента.ОтменаПроведения);
по причине:
Конфликт блокировок при выполнении транзакции:
Неустранимый конфликт блокировок

Каждый раз видимо на разных объектах, так как выводимый список исправленных объектов разный.
Подскажите, не могу понять. где в коде накосячил.
ЗЫ. УТ11.3/SQL2012
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. kumi2012 103 12.01.19 19:15 Сейчас в теме
Попробуйте убрать НачатьТранзакцию ()/ЗафиксироватьТранзакцию ()
3. AndrewKop 12.01.19 19:18 Сейчас в теме
(2) Без неё тоже самое было. Транзакцию добавил после первой ошибки. Чтобы не менялось состояние объектов, если ошибка повторится и скажем документ снимется с проведения, но не проведётся обратно.
4. DarkUser 12.01.19 19:32 Сейчас в теме
За "ТыкНаСервере" поубивав бы...

Хорошо бы конечно ещё увидеть код ОтменыПроведения. А так же техжурнал по deadlock-ам.

Но, возможно, будет достаточно просто убрать строку: "ОбъектПоССылке.Записать(РежимЗаписиДокумента.ОтменаПроведения);"
5. AndrewKop 12.01.19 20:06 Сейчас в теме
(4) Про "ТыкНаСервере" согласен. Уже получал тут на форуме "по шапке" за это. Но обработка как бы на один раз. Исправить валюты и забыть. Но исправлюсь, обещаю.
Хорошо бы конечно ещё увидеть код ОтменыПроведения.

Немного не понял. Какой код вы имели ввиду? Если вы про обработку проведения, то это УТ11.3 на полной поддержке.
А так же техжурнал по deadlock-ам.

Не умею пока собирать.
Но, возможно, будет достаточно просто убрать строку: "ОбъектПоССылке.Записать(РежимЗаписиДокумента.ОтменаПроведения);"

а может такое быть из-за того, что я пытаюсь снять с проведения документ, который уже ранее изменил. Ща попробую его сначала .записать()
6. DarkUser 12.01.19 21:15 Сейчас в теме
(5) А зачем вы отменяете проведение вообще?
7. AndrewKop 12.01.19 23:34 Сейчас в теме
(6) Задачей стоит удаление неправильной валюты из базы и замены её на верную. Но на неё ссылки у ~15к объектов. В том числе в различных регистрах. И скажем, документ может быть помечен на удаление, но движения в некоторых регистрах со ссылкой на него есть. Насколько мне хватило ума - помогает только снятие пометки на удаление, запись и повторная установка пометки на удаление. Ну и по аналогии для проведенных документов решил сделать. Перепроведение, как мне показалось, не всегда приводит к полному очищение старых движений.
8. acanta 13.01.19 03:59 Сейчас в теме
(7) вы пробовали типовую обработку поиск и замена дублей из БСП или функционал платформы (замены в удалении помеченных объектов)?
AndrewKop; +1 Ответить
9. AndrewKop 13.01.19 10:42 Сейчас в теме
(8) Не уверен, что это можно использовать. по крайне мере, не понимаю как это сделать.
Ситуация следующая. Кто-то еще на старте базы поставил галку несколько валют, завел туда новую валюту - еще один рубль. потом эту галку на каком-то этапе убрали. Я вообще не знал о существовании второй валюты, пока не начал обновляться и получил ошибку не заданного курса валют. Причем обновления между 11.3 релизами проходили корректно, а вот на 11.4 - с ошибкой. Открыл валюты. Там галка снята с "несколько валют". Открываю валюты - получаю форму элемента валюты RUR. Все ок. Потом решил все же поставить галку и увидел эту ситуацию. Пометил на удаление неправильный элемент. Хотел удалить, но на неё более 15 тыс. ссылок (на правильной валюте около 21). Посмотрел поиск и замену дублей и что-то не сообразил как её использовать. Тут теоретически больше подходит групповое изменение реквизитов. Но валюта ссылается на множество разных объектов, поэтому мне показалось легче написать обработку, чем руками выбирать разные типы метаданных в этой обработке.
10. ret 63 13.01.19 22:59 Сейчас в теме
Если наименования валют одинаковые, то используй стандартную обработку по замене дублей. Там все просто. Выбрать нужный справочник, валюты в в твоем случае, и отобрать совпадающие по наименованию. Перед этим лучше грохнуть все курсы в регистре сведений по валюте, которую надо удалить.
AndrewKop; +1 Ответить
11. AndrewKop 14.01.19 09:07 Сейчас в теме
(10) Да ё-мае! Я думал, у неё функционал на уровне - нашел 2 одинаковых поставщика и дальше сам удаляй. Сейчас вот решил до конца её попробовать, а она еще все ссылки показала, ну значит наверное их поправит - шикарно. Запустил, жду.
Что я сразу умным людям не верю? (Это я к (8))
Оставьте свое сообщение

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