0. Ёпрст 1036 01.01.70 03:00 Сейчас в теме

Кто заблокировал объект ? 7.7 (SQL/DBF)

Обработка блокировки объекта в базе для SQL/DBF варианта.


Перейти к публикации

Комментарии
Избранное Подписка Сортировка: Древо
103. Dolly_EV 267 01.11.12 08:05 Сейчас в теме
(102) проще уж завести глоб. переменную типа глГрупповаяОбработка. в Обработке документов делать ее =1, и в ПриНачалеБлокировкиОбъекта() Если глГрупповаяОбработка=0 Тогда <Пишем>. в Обработке документов, после проведения глГрупповаяОбработка=0.
А как без доп.писанины в ПриНачалеБлокировкиОбъекта() узнать, что это групповая обработка?
104. andrewks 1268 01.11.12 08:19 Сейчас в теме
(103) Dolly_EV, не понял про глоб.перем. она не даст ответ на поставленный вопрос.

а вот мой способ работает, сейчас проверил

Перем ЭтоГрупповоеПроведение;

Процедура ОбработкаПроведения()
	
	Сообщить("======== "+ТекущийДокумент());
	Сообщить("ЭтоГрупповоеПроведение = "+ЭтоГрупповоеПроведение);
	// тут обработчик проведения
	
	// конец обработчика проведения
	
	ЭтоГрупповоеПроведение=1;
КонецПроцедуры

ЭтоГрупповоеПроведение=0;
Показать
106. Dolly_EV 267 01.11.12 09:05 Сейчас в теме
(104) andrewks, а я тебя не понял. ЭтоГрупповоеПроведение=1, потом=0 пихать во все доки в процедуру ОбработкаПроведения() ?? что это дает?
У Документа есть метод ГрупповаяОбработка(), но проблема в том, что он доступен только в предопределенной процедуре ОбработкаПроведения(), т.е. в Процедура ПриНачалеБлокировкиОбъекта(Объект), к нему не обратишься типа Объект.ГрупповаяОбработка()=1.

Вобщем вот так у меня получилось:
// флаг = 1 выставляется в Обработке "ОбработкаДокументов" при Проведении/Распроведении/Удалении/ВклВыклПроводок
// по завершению: глГрупповаяОбработка=0 
Перем глГрупповаяОбработка Экспорт;

//==========================================================­============
Процедура ПриНачалеБлокировкиОбъекта(Объект)
    Тип = ТипЗначенияСтр(Объект);
    Если ((Тип = "Документ")или(Тип="Справочник")) И (глГрупповаяОбработка=0) Тогда
		ИДОбъекта = глМетаДата.ЗначениеВДлиннуюСтрокуБД(Объект);
		Юзверь = СокрП(глПользователь.Наименование);
		Если глЭтоSQL=1 Тогда
			//sql
	        ТекстЗапроса = "
	        |IF Exists (SELECT * FROM Blocks WHERE ИДОбъекта = '"+ИДОбъекта+"')
	        |     BEGIN
	        |         UPDATE Blocks 
	        |            SET 
	        |               ИДОбъекта = '"+ИДОбъекта+"', Пользователь  = '"+Юзверь+"'
	        |            WHERE ИДОбъекта = '"+ИДОбъекта+"'
	        |     END
	        |ELSE
	        |      BEGIN
	        |           INSERT INTO Blocks (ИДОбъекта, Пользователь)
	        |          VALUES ('"+ИДОбъекта+"','"+Юзверь+"')
	        |      END
	        |";
	        глЗапросSQL.ВыполнитьСкалярный(ТекстЗапроса);
		Иначе
			//dbf
	        ТекстЗапроса = "
	        |    INSERT or REPLACE INTO БазаБлокировок
	        |    VALUES ('"+ИДОбъекта+"','"+Юзверь+"')
	        |";
	        фл=0;
	        Пока фл=0 Цикл
	            Попытка
	                глЗапросSQLite.ВыполнитьЗапрос(ТекстЗапроса);
	                фл=1;
	            Исключение
	            КонецПопытки;
			КонецЦикла;
		КонецЕсли;
    КонецЕсли;
КонецПроцедуры
Показать
105. Dolly_EV 267 01.11.12 08:56 Сейчас в теме
+(101) про 1% - это я сильно преуменьшил, месяц перепродки - 39% времени ушло на глЗапросSQLite.ВыполнитьЗапрос(ТекстЗапроса)
Вобщем, сделал через флаг глГрупповаяОбработка.
107. Dolly_EV 267 01.11.12 10:06 Сейчас в теме
А вот еще бы имя пользователя терминальной сессии как отловить?
108. Ёпрст 1036 01.11.12 10:36 Сейчас в теме
Да уж...
флаги в обработке проведения - это моветон, как и их проверка в ПриНачалеБлокировкиОбъекта.
Достаточно в ПриНачалеРаботыСистемы проверить, что если конф открыта в монопольном режиме - ничего не делать, процы можно тупо оформить через доп глобальник формекса, выполняемый модуль, еще как - море фантазии.
andrewks; +1 Ответить
111. andrewks 1268 01.11.12 14:30 Сейчас в теме
(108)
Достаточно в ПриНачалеРаботыСистемы проверить, что если конф открыта в монопольном режиме - ничего не делать

всё гениальное - просто :)
112. Dolly_EV 267 03.11.12 08:29 Сейчас в теме
(108) так оно (время) отжирается и НЕ в монопольном режиме при групповом проведении, а смысла сохранять инфу про блокировки мало (доки блокируются кратковременно). Так что во флаге есть смысл
113. Ёпрст 1036 06.11.12 10:18 Сейчас в теме
(112) для нужных доков в таком случае, нужно передавать флаг параметром в Провести(), это всё лучше, чем глобальная переменная модуля.
109. Ёпрст 1036 01.11.12 10:41 Сейчас в теме
+ В монопольном режиме, у меня к примеру, вообще не пишется и не проверяется табличка блокировок.
110. Ёпрст 1036 01.11.12 13:54 Сейчас в теме
114. Ёпрст 1036 06.11.12 10:21 Сейчас в теме
Да и .. если уж не монопольно перепроводишь доки, то в цикле проведения так же легко вычисляется юзверь, который "держит" документ, тем же способом, выполнив запрос к базе блокировок (у меня так сделано в таких поделках). И тут вроде, как тоже флаг не нужен.
115. rendalina 02.09.13 10:23 Сейчас в теме
Спасибо за такую полезную вещь! ))

В описании на компоненту Formex.dll ссылка неправильная (стоит ссылка на http://www.1cpp.ru/forumfiles/Attachments/1sqlite-with-3-7-0.zip). Наверное должна быть какая-то такая: http://www.dorex.pro/files/?formex_t.zip
116. sput74 02.09.13 12:54 Сейчас в теме
Думаю, надо добавить в обработку при начале работы что-то вроде

DELETE FROM Blocks WHERE Пользователь = "+Пользователь

для обработки случая вылета программы в момент блокировки
117. Ёпрст 1036 17.09.13 09:23 Сейчас в теме
(116) Не надо.
Если пользователь вылетел - он ничего не блокирует.
118. sput74 17.09.13 10:17 Сейчас в теме
(117) а запись о блокировке остается...
119. Ёпрст 1036 17.09.13 10:17 Сейчас в теме
120. Ёпрст 1036 17.09.13 10:20 Сейчас в теме
Как только кто-то еще откроет объект - будет новая запись, с новым пользователем.
Так что, та запись ни на что не влияет.
121. Ёпрст 1036 17.09.13 10:20 Сейчас в теме
Даже не новая запись, а замена старой
122. dyak84 17.10.13 18:19 Сейчас в теме
интересно при груповой обработке несколькими отделами одновременно ближе к концу рабочего дня что будет говорить кто заблокировал. Тут наверное будет на ети вичисления будет ити больше времени чем на обюработку саміх накладніх или нет. зарание спасибо за ответ
123. Ёпрст 1036 17.10.13 19:10 Сейчас в теме
Скажем так, среднее количество документов в день ~1500, количество одновременно подключенных юзьверей в базе ~70, из них, активно "колотящих" документы ~20 - влияние поделки не замечено на производительность.
А групповых обработок для правки доков (типа выстраивания пко по-порядочку, в конфе хватает).
124. eshtrey 16.04.14 16:34 Сейчас в теме
125. mshi 19.04.17 15:17 Сейчас в теме
Сначала стал делать как автор, а потом переделал на журнал регистрации событий. При 80-90 пользователей работает достаточно быстро.
Используется ПоставщикДанныхЖурналРегистрации из ВК 1С++

Процедура ОбработкаБлокировкиОбъекта(Объект, Повторить, ДопТекст)
	
  Тип = ТипЗначенияСтр(Объект);
  Если (Тип = "Документ") или (Тип = "Справочник")Тогда
		ЗаблокировавшийПользователь = "";
		
		Если Вопрос("Объект заблокирован!
								|Попытаться определить пользователя сделавшего это?", "Да+Нет+Отмена") <> "Да" Тогда
			Возврат;
		КонецЕсли;
		
		оЛог = СоздатьОбъект("ПоставщикДанныхЖурналРегистрации");
		Если оЛог.ОткрытьФайл() = 0 Тогда
			Предупреждение("Не удалось открыть журнал!");
			Возврат;
		КонецЕсли;
		
		НачДатаПросмотра = ТекущаяДата() - 2;
		КонДатаПросмотра = ТекущаяДата();
		
		Пока (ПустоеЗначение(ЗаблокировавшийПользователь) = 1) И (ТекущаяДата() - НачДатаПросмотра <= 8) Цикл
			Состояние("Поиск событий открытия документа за " + ПериодСтр(НачДатаПросмотра, КонДатаПросмотра));
			
			оЛог.УстановитьПериод(НачДатаПросмотра, КонДатаПросмотра);
			оЛог.ИзменитьФильтр(141, Объект);
			
			Попытка
				Если оЛог.УстановитьФильтр(0) = 0 Тогда
					Предупреждение("Ошибка при установке фильтра!");
					Возврат;
				КонецЕсли;
				
				оЛог.ВыбратьСтроки();
				Пока оЛог.ПолучитьСтроку() = 1 Цикл
					ДатаВремяБлокировки = "" + оЛог.Дата + " " + оЛог.Время;
					ЗаблокировавшийПользователь = оЛог.Пользователь;
				КонецЦикла;
				
			Исключение
				оЛог.ЗакрытьФайл();
				Возврат;
			КонецПопытки;
			
			КонДатаПросмотра = НачДатаПросмотра - 1;
			НачДатаПросмотра = КонДатаПросмотра - 2;
		КонецЦикла;
		
		оЛог.ЗакрытьФайл();
		
		Если ПустоеЗначение(ЗаблокировавшийПользователь) = 0 Тогда
			Повторить = 0;
	    ДопТекст = "Объект: " + Объект + "
				|открыт " + ДатаВремяБлокировки + "
				|пользователем " + ЗаблокировавшийПользователь;
		КонецЕсли;
  КонецЕсли;
	
КонецПроцедуры	//ОбработкаБлокировкиОбъекта
Показать
126. Ёпрст 1036 05.06.17 14:34 Сейчас в теме
(125) Не все события пишутся в ЖР.
+ он может быть отключен. + не надо перебирать все строки, перебирай в обратном порядке + возврат, если есть что-то сразу, не крутя весь цикл
Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии

Специалист внедрения и сопровождения 1С
Омск
зарплата от 25 000 руб. до 50 000 руб.
Полный день

Ведущий 1С консультант по БГУ
Омск
зарплата от 50 000 руб. до 95 000 руб.
Полный день

Автор новостных обзоров на тему 1С и бухучета
Санкт-Петербург
По совместительству

Ведущий программист 1С
Санкт-Петербург
зарплата от 130 000 руб.
Полный день

Ведущий программист 1С
Омск
зарплата от 70 000 руб. до 110 000 руб.
Полный день