Многопоточная запись и проведение документов в пустуой базе

1. VladC# 64 31.10.23 08:43 Сейчас в теме
Всем привет, ситуация следующая: пишу в несколько потоков документы ввода остатков в пустую базу, код запуска заданий:
	Задания = Новый Массив;
	АдресаРезультатов = Новый Массив;
	Для Каждого КлючИЗначение Из СкладыПоПотокам Цикл
		
		Ключ = Новый УникальныйИдентификатор;
		АдресРезультата = ПоместитьВоВременноеХранилище(Неопределено, Ключ);
		АдресаРезультатов.Добавить(АдресРезультата);
		
		Параметры = Новый Массив;
		Параметры.Добавить(Товары);
		Параметры.Добавить(КлючИЗначение.Значение);
		Параметры.Добавить(Организация);
		Параметры.Добавить(ДатаЗаписиОстатков);
		Параметры.Добавить(АдресРезультата);
		
		Задание = ФоновыеЗадания.Выполнить("НагрузочноеТестированиеСервер.СоздатьВводОстатков", Параметры);
		Задания.Добавить(Задание);
		
	КонецЦикла;
Показать


текст процедуры ВводОстатков:
Процедура СоздатьВводОстатков(Знач Товары, Знач Склады, Знач Организация, Знач ДатаЗаписиОстатков, Знач АдресРезультата) Экспорт
	
	Массив = Новый Массив;
	
	Генератор = Новый ГенераторСлучайныхЧисел;
	ТипыОстатковКупленныеТовары = Перечисления.ТипыОстатков.КупленныеТовары;
	
	Запрос = Новый Запрос;
	Запрос.УстановитьПараметр("Товары", Товары);
	
	Запрос.Текст = "ВЫБРАТЬ
	|	ЦеныПоставщиковСрезПоследних.Номенклатура КАК Номенклатура,
	|	ЦеныПоставщиковСрезПоследних.Цена КАК Цена
	|ИЗ
	|	РегистрСведений.ЦеныПоставщиков.СрезПоследних(, Номенклатура В (&Товары)) КАК ЦеныПоставщиковСрезПоследних";
	
	Выборка = Запрос.Выполнить().Выбрать();
	
	НачатьТранзакцию(РежимУправленияБлокировкойДанных.Управляемый);
	
	Попытка

		Для Каждого Склад Из Склады Цикл
			
			Магазин = Склад.Владелец;
			
			ДокументОбъект = Документы.ВводОстатков.СоздатьДокумент();
			ДокументОбъект.Дата = ДатаЗаписиОстатков;
			ДокументОбъект.Фирма = Организация;
			ДокументОбъект.СтруктурнаяЕдиница = Магазин;
			ДокументОбъект.ТипОстатков = ТипыОстатковКупленныеТовары;
			ДокументОбъект.Комментарий = ТекущаяДата();
			
			Для Каждого Товар Из Товары Цикл
				
				Выборка.Сбросить();
				Если Выборка.НайтиСледующий(Товар, "Номенклатура") Тогда
					
					НоваяСтрока = ДокументОбъект.Состав.Добавить();
					НоваяСтрока.Номенклатура = Товар;
					НоваяСтрока.Склад = Склад;
					НоваяСтрока.Количество = Генератор.СлучайноеЧисло(100, 500);
					НоваяСтрока.Цена = Выборка.Цена;
					НоваяСтрока.СуммаБезНДС = Выборка.Цена * НоваяСтрока.Количество;
					НоваяСтрока.Всего = НоваяСтрока.СуммаБезНДС;
					
				КонецЕсли;
				
			КонецЦикла;
			
			Если ЗначениеЗаполнено(ДокументОбъект.Состав) Тогда
				
				ДокументОбъект.ДополнительныеСвойства.Вставить("ОтключитьКонтрольМестаСозданияДокумента", Истина);
				УстановитьДополнительныеСвойстваНовогоОбъекта(ДокументОбъект);
				ДокументОбъект.Записать(РежимЗаписиДокумента.Запись);
				
				Массив.Добавить(ДокументОбъект.Ссылка);
				
			КонецЕсли;
			
		КонецЦикла;
		
		ЗафиксироватьТранзакцию();
		
	Исключение
		ОтменитьТранзакцию();
	КонецПопытки;
	
	Для Каждого Док Из Массив Цикл
		ДокОбъект = Док.ПолучитьОбъект();
		ДокОбъект.Записать(РежимЗаписиДокумента.Проведение);
	КонецЦикла;
	
	ПоместитьВоВременноеХранилище(Массив, АдресРезультата);
	
КонецПроцедуры
Показать


Проблема в следующем: при первом запуске все документы записываются в базу, но не все проводятся из-за неустранимого конфликат блокировок, при всех последующих запусках все документы проводятся, никаких конфликтов нет, из-за чего это может быть?

UPD.
Разделение итогов по регистру, на котором происходит конфликт блокировок, включено.
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. user1880116 31.10.23 09:40 Сейчас в теме
У тебя внешняя транзакция держит все блокировки, которые накладываются при проведении каждого документа до своего завершения. Надо смотреть, что в процедуре проведения написано.
3. VladC# 64 31.10.23 10:06 Сейчас в теме
(2)внешней транзакции нет, в обработке проведения обычный код по заполнению регистра
4. user1880116 31.10.23 10:31 Сейчас в теме
(3)
внешней транзакции нет
Есть. Ты же ее и сделал.

Ты открываешь транзакцию внутри СоздатьВводОстатков строкой НачатьТранзакцию(РежимУправленияБлокировкойДанных.Управляемый); После этого все блокировки, накладываемые внутри обработки проведения документа как вручную, так и платформой, держатся до конца этой твоей транзакции.

Потом один из документов при проведении наступает на блокировку, которую наложил и не снял предыдущий документ и всё.
5. VladC# 64 31.10.23 11:23 Сейчас в теме
(4)я думал речь о транзакции, которая является внешней по отношению к той, которую я создал. Без этой транзакции всё работает также, она роли не играет.
Оставьте свое сообщение

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