ПриНачалеБлокировкиОбъекта #524131


#0 by Вуглускр1991
Привет! Вот и у меня появилась такая необходимость. Отслеживать когда блокировки закончатся. Пробегать по таблице блокировок роботом "с криком кия и ударом ноги", неудобно, потому как метод Блокировка работает с глюками: Итак: БС - реквизит на форме, форма элемента из БС открыта для редактирования. СпрБС = СоздатьОбъект("Документ.ПриемнаяКарточка"); Если пишем так:     Он сообщает 0 - объект не заблокирован. Если так РезБлок = СпрБС.Блокировка; Он сообщает 1 - объект принудительно разблокирован, что не правда. И наконец так Если так РезБлок = СпрБС.Блокировка; Вот тут он сообщает 0. Типа не получилось, и исходя из этого, делаем вывод, что он таки кем-то наверное заблокирован. Что же мы имеем? Робот бегает по таблице и блокирует объекты, кто получился - тот значит незаблокирован и робот должен его разблокировать обратно. бред.
#1 by Ёпрст
метод Блокировка работает без глюков.
#2 by Ёпрст
именно так и нужно всегда работать с методом Блокировка - самому пытаться её установить.
#3 by Ёпрст
+2 а так, она возвращает, заблокировал ли ты сам объект. Вот и имеешь, что нет.
#4 by Вуглускр1991
Оказывается в 1С-ке есть замечательный объект. CStoreObj, у него есть метод Locking(1 или 0) Вот это в точности и есть внутренняя реализация блокирования объекта. Вчера долго рассматривал работу этого объекта (не буду уточнять  при помощи какой программы). И вот чего не понял. Как поймать адрес CObjID? CObjIDSet:public CObjID и его 6 паблик переменная имеет тип CUniSet:public CObjectSet И у него есть метод GetMainRec Случайно не тупое возвращение той переменной ... CDocSet:public CUniSet Когда блокируется документ вызов идет именно из объекта CDocSet, Все это к тому, что пытаюсь подойти к созданию своего обработчика этого события. Но в силу небольшого опыта, не знаю, как перехватывать функции есть какой-нибудь "мануал" на эту тему? Неужели придется находить и переписывать адресок в таблице вызовов (она ведь в сегменте данных?) по идее адресок этот постоянный и я могу его в своей ВК знать просто как константу. Впрос лишь в том, как найти в стеке (или где?) CObjID элемента, для которого вызывается CStoreObj::Locking Я находил, пару раз, но что-то дюже далеко. А ещё было бы не плохо сделать это также элегантно как у АльФа.
#5 by Ёпрст
дык ты у альфа и спроси.. И быстрее тебе ответят на 1cpp
#6 by Вуглускр1991
Нет, это не правильно. Почему я должен блокировать объект, если мне надо _только_узнать_ блокирован он или нет? Конечно, если мне надо с объектом работать - то узнавать некогда, сегодня узнал, а завтра его кто-то уже схватил. Но если мне таки надо просто узнать. А я буду его хватать.
#7 by Ёпрст
дык, тут предпологалось, заблокирован ли он тобой, а не вообще, вот отсюда вся путанница.
#8 by Вуглускр1991
М-м-м! Как вкусно.
#9 by mikecool
твоя тирада и "Но в силу небольшого опыта" напоминает - у меня интернет не работает - а лампочка на модеме светится? - это не лампочка, а тиристорный светодиод - да, пожалуй, проблемы на нашей стороне
#10 by Вуглускр1991
:) Я в жизни сделал большую ошибку выбрав паскаль вместо си в далеком 9-ом классе. Несколько раз замахивался на такие вещи как "позднее связывание" линковка и либы. Так чтобы все это руками пощупать. Чтобы мог вручную подправить а в идеале отстроить таблицу функций. Но пока не прорубил.
#11 by Вуглускр1991
Все сделал на формэксе: ... Перем глТаблоБлокОб Экспорт; Перем глFormexСервис Экспорт; ... ПриНачале... ... КонецПроцеду... ...
#12 by Вуглускр1991
Из внешней обработки удалось позакрывать все формы блокирующие объекты сгласно таблице. Причем: Форма списка при редактировании элемента закрывается записывая редактируемый элемент. Форма документа, где "ПриЗаписиПерепроводить" закрывается не записываясь. Конечно, здорово. Что так быстро и нет нудного перебора процедур форм "ПриОткрытии", "ПриНачалеРедактированияСтроки" Да и половины форм списка в справочниках нет.
#13 by Вуглускр1991
Теперь, послав список объектов, которые шлепают в пакете обмена всем пользователям. В обработке внешнего события буду закрывать формы заблоченных объектов. И выполнять обмен.
#14 by orefkov
CStoreObj это только на дбф, походу лочит ту запись таблицы, на которой CStoreObj спозиционирован.
#15 by Ёпрст
можешь и это поглядеть
#16 by Вуглускр1991
Это я видел, функционал слегка другой. Не обязательно знать кто да почему. Обмен любой ценой. Поэтому пинка. Получается, что надо в CUniSet или в потомке CDocSet сперва идет позиционирование, а уже если надо то блокировка, поэтому я не смог быстро найти переменную с CObjID. А кроме неё мне ещё надо было найти форму. Видимо создание dll "по радуге" опять откладывается. Спасибо всем, вроде работает. И, конечно, АльФу особенно.
#17 by АЛьФ
2 Да на здоровье! :)
#18 by Вуглускр1991
А в исходники посмотреть Можно? Как ты это сделал, я увидел, что перехвачена именно CDocSet::Lock, и ещё наверное есть функции Lock, интересно как ты достал CObjID.
Тэги:
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С