Имя: Пароль:
1C
1C 7.7
v7: Недопустимое состояние курсора
0 1snik_d
 
18.11.25
15:13
Всем привет. Есть база 7.7 сильно переписанная ТиС, используются прямые запросы, FormEx и т.д., имеется УРБД. Суть проблемы следующая: есть прямой запрос, который вставляет в таблицу регистрации изменений УРБД записи для отправки справочников в нужные периферийки по условию. Периодически при попытке выполнения такого запроса вылетает критическая ошибка "Недопустимое состояние курсора" и 1С тупо закрывается. Перед этим обычно происходит deadlock. Помогите решить проблему, хотя бы с какой стороны подойти к решению.
1 arsik
 
гуру
18.11.25
15:15
(0) Перед вставкой наверно нужно блокировку наложить. Не?
2 1snik_d
 
18.11.25
15:24
		ТекстЗапроса = "
		|DECLARE @SelectedId char(9)
		|DECLARE @SelectedDef int
		|DECLARE @SelectedSign char(3)
		|DECLARE @count int
		|SET @SelectedId=?
		|SET @SelectedDef=?
		|SET @SelectedSign=?
		|UPDATE _1sjourn SET verstamp=(SELECT verstamp FROM _1sjourn WHERE iddocdef=@SelectedDef AND iddoc=@SelectedId)+1
		|WHERE iddocdef=@SelectedDef AND iddoc=@SelectedId
		|SET @count=(SELECT count(*) FROM _1supdts WHERE typeid=@SelectedDef AND objid=@SelectedId AND dbsign=@SelectedSign)
		|IF @Count=0
		|BEGIN INSERT INTO _1supdts VALUES (@SelectedSign,@SelectedDef,@SelectedId,' ',' ')
		|END
		|ELSE
		|BEGIN
		|UPDATE _1supdts SET dwnldid='' WHERE Typeid=@SelectedDef AND Objid=@SelectedId AND DBSign=@SelectedSign
		|END";
		
		Если Элемент.Выбран() = 1 Тогда
			ИдЭлемента = глMDW.ЗначениеВСтрокуБД(Элемент);
			ДефЭлемента = глMDW.ИДСправочника(Элемент.Вид());
			
			глRecordSet1CPP.ДобПараметр(1,14,9,0);
			глRecordSet1CPP.ДобПараметр(1,4,4,0);
			глRecordSet1CPP.ДобПараметр(1,14,3,0);
			глRecordSet1CPP.УстПараметр(1, ИдЭлемента);
			глRecordSet1CPP.УстПараметр(2, ДефЭлемента);
			глRecordSet1CPP.УстПараметр(3, ИдБазы);
			глRecordSet1CPP.ВыполнитьСкалярный(ТекстЗапроса);
			
			глRecordSet1CPP.УдалитьПараметры(); // Удалить параметры
		КонецЕсли;


Вот такой запрос выполняется для вставки.
3 1snik_d
 
18.11.25
16:09
(1) А разве она сама не накладывается автоматически?
4 trad
 
18.11.25
16:38
set nocount on
в начале запроса
5 1snik_d
 
18.11.25
17:07
		|UPDATE _1sjourn SET verstamp=(SELECT verstamp FROM _1sjourn WHERE iddocdef=@SelectedDef AND iddoc=@SelectedId)+1
		|WHERE iddocdef=@SelectedDef AND iddoc=@SelectedId


Вот это я так понимаю тоже можно выкинуть, если регистрируются только справочники, без документов?
6 Ёпрст
 
гуру
18.11.25
17:31
(5) да