Переключение на Главную Страницу Страницы: 1 2 [3] 4  ОтправитьПечать
Очень популярная тема (более 25 ответов) Может быть кто сталкивался с ошибкой записи нового документа?( sql версия ) (число прочтений - 17374 )
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Может быть кто сталкивался с ошибкой записи нового документа?( sql версия )
Ответ #30 - 11. Сентября 2009 :: 10:26
Печать  
Можно немного OFF?

Хочу понять, зачем 1С-ка блокирует _1sjourn на все время проведения? Документ-то уже записан, а проведение только изменяеть одно поле в этой таблице.
  
Наверх
 
IP записан
 
alexdd
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 347
Зарегистрирован: 25. Июня 2007
Re: Может быть кто сталкивался с ошибкой записи нового документа?( sql версия )
Ответ #31 - 11. Сентября 2009 :: 10:45
Печать  
грубо говоря для сохранения целостности данных, пока не завершиться транзакция для всех логически связанных держится блокировка этих таблиц.
  
Наверх
 
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Может быть кто сталкивался с ошибкой записи нового документа?( sql версия )
Ответ #32 - 11. Сентября 2009 :: 10:51
Печать  
alexdd писал(а) 11. Сентября 2009 :: 10:45:
грубо говоря для сохранения целостности данных, пока не завершиться транзакция для всех логически связанных держится блокировка этих таблиц.


Я так подозреваю, что связано это с точкой актуальности.  А если я не использую торговлю, то, оно мне не надо.

Спрошу по другому: какие поля в _1sjourn меняются  при проведении?
  
Наверх
 
IP записан
 
alexdd
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 347
Зарегистрирован: 25. Июня 2007
Re: Может быть кто сталкивался с ошибкой записи нового документа?( sql версия )
Ответ #33 - 11. Сентября 2009 :: 10:58
Печать  
да нет, не с точкой актуальности. Ну, например, документ при проведении модифицирует какие-то таблицы. Если отпустить _1sjourn и писать в регистры, другое соединение может что-то сделать с тем же документом в _1sjourn пока первое соединение еще не закончило проведение.
  
Наверх
 
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Может быть кто сталкивался с ошибкой записи нового документа?( sql версия )
Ответ #34 - 11. Сентября 2009 :: 11:15
Печать  
Типа пока док проводится, в другом соединении я его удаляю...все понял.

А есть ведь блокировки не на всю таблицу, а на отдельные строки, с этим никто не игрался?
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Может быть кто сталкивался с ошибкой записи нового документа?( sql версия )
Ответ #35 - 11. Сентября 2009 :: 11:23
Печать  
chessman писал(а) 11. Сентября 2009 :: 10:26:
Можно немного OFF?

Хочу понять, зачем 1С-ка блокирует _1sjourn на все время проведения? Документ-то уже записан, а проведение только изменяеть одно поле в этой таблице.
 

Чтобы рассчитались правильно регистры
Происходит следущее
1.В начале проведения восстанавливаем регистры без документа проведения от текущего периода до ТА
2.Далее обрабатываем долго с клиента 1с модуль проведения при этом
для каждой строки добавить движение пересчитываем
состояние регистров от  текущего периода то ТА.

Если просто разрешить обоим то может возникнуть
фантомы т.е оба одновременно начнут добавлять запись.
Все остальные случаи вроде ловяться на ожидании по индексу.

и второе из-за чего если
отменили движения первого документа
отменили движения второго  документа с учетом первого документа
первый проведение окончилось откатом
второй закончился успешно.
Имеем неправильные итоги регистра.
то будет происходить по всем общим измерениям.
Хотя это тоже должно останавливаться по индексу.

Третье так как движения из 1с идут неупорядоченными то возрастает очень сильно вероятность возникновения взаимоблокировок.

Всякие свои блокировки это блокировать одно из измерений тогда их можно проводить паралельно. Т.е. весь регистр как бы делим
на подрегистры.
Но при этом тоже есть нюансы. Если измерения блокировок выбраны неправильно то таких блокировок становиться
очень много для одного проведения что становиться  хуже чем единственная блокировка на все.

  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Может быть кто сталкивался с ошибкой записи нового документа?( sql версия )
Ответ #36 - 11. Сентября 2009 :: 11:37
Печать  
chessman писал(а) 11. Сентября 2009 :: 10:51:
alexdd писал(а) 11. Сентября 2009 :: 10:45:
грубо говоря для сохранения целостности данных, пока не завершиться транзакция для всех логически связанных держится блокировка этих таблиц.


Я так подозреваю, что связано это с точкой актуальности.  А если я не использую торговлю, то, оно мне не надо.

Спрошу по другому: какие поля в _1sjourn меняются  при проведении?

флаги регистров могут измениться и поле closed
но не в этом дело. Т.к. _1sjourn одной строке всегда однозначно
только один документ то с точки зрения _1sjourn могут хоть все
документы проводиться паралельно.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Может быть кто сталкивался с ошибкой записи нового документа?( sql версия )
Ответ #37 - 11. Сентября 2009 :: 11:49
Печать  
alexdd писал(а) 11. Сентября 2009 :: 10:58:
да нет, не с точкой актуальности. Ну, например, документ при проведении модифицирует какие-то таблицы. Если отпустить _1sjourn и писать в регистры, другое соединение может что-то сделать с тем же документом в _1sjourn пока первое соединение еще не закончило проведение.

Документ другое соеденение изменить не сможет так как остается update блокировка на строку в таблице dh...
до окончания транзакции.

Ну и это очень Плохо из модуля проведения менять сам документ.
По логике должно быть все наоборот на основании данных документа генеряться движения(проводки).
  
Наверх
 
IP записан
 
alexdd
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 347
Зарегистрирован: 25. Июня 2007
Re: Может быть кто сталкивался с ошибкой записи нового документа?( sql версия )
Ответ #38 - 11. Сентября 2009 :: 11:54
Печать  
chessman писал(а) 11. Сентября 2009 :: 11:15:
с этим никто не игрался?

игрался, продают даже готовые решения, http://www.softpoint.ru/article_id1.htm. Статью эту я не читал, но там скриншот такой как Z1 постилУлыбка
  
Наверх
 
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Может быть кто сталкивался с ошибкой записи нового документа?( sql версия )
Ответ #39 - 11. Сентября 2009 :: 11:59
Печать  
Читал.
Просто может кто-нить из форума делал.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Может быть кто сталкивался с ошибкой записи нового документа?( sql версия )
Ответ #40 - 11. Сентября 2009 :: 12:04
Печать  
chessman писал(а) 11. Сентября 2009 :: 11:59:
Читал.
Просто может кто-нить из форума делал.

информации выше вполне достаточно чтобы сделать свои блокировки.

  
Наверх
 
IP записан
 
leov-001
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 150
Зарегистрирован: 05. Марта 2009
Re: Может быть кто сталкивался с ошибкой записи нового документа?( sql версия )
Ответ #41 - 26. Ноября 2013 :: 10:07
Печать  
Переписал дельфийский код из этой статьи >> http://www.softpoint.ru/article.php?id=2

Код
Выбрать все
Перем BinData, RS, Запрос;
//*******************************************
Процедура Сформировать()
	Если BinData.ПодключитьсяКФайлу("D:\TestWork\1SJOURN.$lk",1,0)=1 Тогда

		Для i=0 По 100000 Цикл
			Если BinData.УстБлокировку(i,1,0) = 1 Тогда
				BinData.СнятьБлокировку(i,1);
			Иначе
				Сообщить(СокрЛП(i)+" - Locked");
				RS.УстПараметр(1,Число(i));
				Сообщить(RS.ВыполнитьСкалярный());
			КонецЕсли;
		КонецЦикла;
		BinData.Close();
	Иначе
		Предупреждение("Не могу ПодключитьсяКФайлу: D:\TestWork\1SJOURN.$lk");
	КонецЕсли;
КонецПроцедуры
//*******************************************
BinData = СоздатьОбъект("BinaryData");
RS = СоздатьОбъект("ODBCRecordSet");
Запрос = "SELECT ''''+IDDOC+''''+DOCNO+'''' AS НомерДокумента
	   |FROM _1SJOURN
	   |WHERE ROW_ID = ?";
RS.Подготовить(Запрос);
RS.ДобПараметр(1,4,,0);
 

  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Может быть кто сталкивался с ошибкой записи нового документа?( sql версия )
Ответ #42 - 27. Ноября 2013 :: 05:35
Печать  
Прикольно..
Можно еще и фильтрануть только по интересующему доку, а не по всем заблокированным.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Может быть кто сталкивался с ошибкой записи нового документа?( sql версия )
Ответ #43 - 27. Ноября 2013 :: 07:04
Печать  
Как с помощью BinData.УстБлокировку(i,1,0)  так и с помощью стандартного Док.Блокировка() можно установить Блокировку
и в других сесиях этот документ будет заблокирован
и можно увидеть чужие блокировки.

Не получается снять чужую блокировку ( блокировку другой сессии).
задача такая : иногда в терминале "падает" сессия и при этом документ остается заблокирован и невозможно получить доступ к этому документу.
Может можно как-то снять блокировку ???
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3050
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Может быть кто сталкивался с ошибкой записи нового документа?( sql версия )
Ответ #44 - 27. Ноября 2013 :: 07:27
Печать  
если max(row_id) - несколько мильенов, то долго ждать
малость допилил для скорости
Код
Выбрать все
Процедура Сформировать()
	RS = СоздатьОбъект("ODBCRecordSet");
	МаксИД = RS.ВыполнитьСкалярный("select max(row_id) макс from _1sjourn (nolock)");

	BinData = СоздатьОбъект("BinaryData");
	Запрос = "
	|SELECT
	|	DOCNO AS НомерДок,
	|   cast(left(date_time_iddoc,8) as datetime) ДатаДок
	|FROM _1SJOURN (nolock)
	|WHERE ROW_ID = ?";
	RS.Подготовить(Запрос);
	RS.ДобПараметр(1,4,,0);

	Файл=КаталогИБ()+"1SJOURN.$lk";
	Если BinData.ПодключитьсяКФайлу(Файл,1,0)=1 Тогда

		Шаг=1000;
		КонИД=МаксИД;
		НачИД=Макс(КонИД-Шаг,0);
		Пока КонИД>0 Цикл
			Состояние(КонИД);
			Если BinData.УстБлокировку(НачИД,Шаг,0) = 1 Тогда
				BinData.СнятьБлокировку(НачИД,Шаг);
			Иначе
				Для i= -КонИД По -НачИД Цикл
					Если BinData.УстБлокировку(-i,1,0) = 1 Тогда
						BinData.СнятьБлокировку(-i,1);
					Иначе
						RS.УстПараметр(1,Число(-i));
						Рез=RS.ВыполнитьСкалярный();
						Сообщить(СокрЛП(-i)+" - Locked "+ Рез.НомерДок+" "+Рез.ДатаДок);
					КонецЕсли;
				КонецЦикла;
			КонецЕсли;
			КонИД=НачИД-1;
			НачИД=Макс(КонИД-Шаг,0);
		КонецЦикла;
		BinData.Close();
	Иначе
		Предупреждение("Не могу ПодключитьсяКФайлу: "+Файл);
	КонецЕсли;
КонецПроцедуры
 

  

1&&2&&3
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1 2 [3] 4 
ОтправитьПечать