1с как узнать кто заблокировал объект

Обновлено: 06.07.2024

В данном примере речь идет об объектных блокировках, которые могут быть установлены автоматически расширениями форм объектов либо программно с помощью метода Заблокировать().
Проверка в контексте объекта, через который и производилась сама блокировка, выполняется следующим образом:
Код 1C v 8.х
Следует отметить, что в случае если объект заблокирован через другую переменную (например, открытую форму объекта), то метод Заблокирован() вернет значение Ложь.

Блокировка данных объекта влияет только на возможность его блокировки, но не препятствует изменению данных в базе данных. Поэтому, прежде чем изменять данные объекта, следует убедиться, что эти данных не заблокированы. Для этого необходимо попытаться установить блокировку:
Код 1C v 8.х
Если попытка заблокировать объект была удачной, это означает, что объект ранее не был заблокирован.

Разместил: E_Migachev  Версии: | 8.x | 8.2 УП |  Дата: 15.09.2010   Прочитано: 26307

Распечатать

Похожие FAQ

17 правил для составления оптимального ЗАПРОСа к данным базы 1С  42
Для формирования и выполнения запросов к таблицам базы данных в платформе 1С используется специальный объект языка программирования Запрос . Создается этот объект вызовом конструкции Новый Запрос . Запрос удобно использовать, когда требуется получ 1C и Google Maps  20
была поставлена задача отображения на географической карте медицинских учреждений. После обзора предлагаемых решений был выбран сервис google. Но так же подобного рода подход будет работать и с картами сервиса yandex. Во время решения задачи было реш 1C медленно работает по сети с базой на SQL Server  20
Данное обстоятельство может быть обусловлено многими причинами. Одна из них - неоптимальная настройка MS SQL . Перечислим неоптимальности в настройке: 1) Неправильно указанный сетевой протокол, используемый для взаимодействия 1С с SQL Server. П 1С Предприятие что это?  11
Что такое 1С? 1С — это фирма , у которой одно из направлений деятельности — разработка программного обеспечения для автоматизации бизнес-процессов предприятий. « 1С:Предприятие » - конкретный продукт, который выпускает компания 1С . Что такое COM-подключение к базе 7.7 из 8.2 1С  6
Если код выполняется на стороне клиента, то необходимо наличие базы 7.7 на локальной машине. Пример (На форме объекта присутствует реквизит Таблица(ТаблицаЗначений)): НаКлиенте Процедура Загрузки() ПутьКБазе=" D:ВашаБаза1с77" ; Пользователь= Посмотреть все результаты поиска похожих

Еще в этой же категории

Полнотекстовый поиск в 1С (что это и пример использования)  22
Полнотекстовый поиск - позволит найти текстовую информацию, размещенную практически в любом месте используемой конфигурации. При этом искать нужные данные можно либо по всей конфигурации в целом, либо сузив область поиска до нескольких объектов Формат, функция форматирования значений  21
//Функция формирует удобное для чтения представление значений. // Примеры форматирования чисел ЗначФормат = Формат(123456.789, " ЧЦ=10; ЧДЦ=2" ); // ЗначФормат = " 123 456,79" ЗначФормат = Формат(123456.789, " ЧГ=0; ЧДЦ=2" ); // Знач Обработчики событий при записи объектов. Зачем и что за чем?  11
Программисту, имеющего немного опыта на платформе 1С 8.2, бывает сложно разобраться: ПередЗаписью, ПриЗаписи, ПослеЗаписи, на сервере, на клиенте, в модуле формы, в модуле объекта, а-а-а-а-аааа. Именно такое сложное чувство непонимания МоментВремени, получение остатков до и после проведения  9
" Момент времени" - виртуальное поле, не хранится в базе данных. Содержит объект МоментВремени (который включает в себя дату и ССЫЛКУ НА ДОКУМЕНТ) В 7.7 было понятие ПозицияДокумента, а в 8.x Момент времени Для получения Остатков, Движений: М Задать вопрос пользователю, ответ на вопрос  7
Режим = РежимДиалогаВопрос.ДаНетОтмена; Ответ = Вопрос(" Выполнить?" , Режим, 0); Если Ответ =КодВозвратаДиалога.Да Тогда Сообщить(" Выполнено" ); ИначеЕсли Ответ = КодВозвратаДиалога.Нет Тогда Сообщить(" Не выполнено" ); КонецЕсли; Режим = Посмотреть все в категории Встроенные Функции

При этом, выяснить, какой же пользователь держит объект открытым, довольно проблематично. Приходится открывать журнал регистрации, долго и нудно искать нужный объект и по событиям журнала пытаться определить, кто же все же открыл данный объект.


Для её реализации требуется загрузка внешних компонент:

Для реализации, нижеследующий код нужно поместить в глобальный модуль.

ЗЫ: для любителей "универсальности", предлагаю объединить оба метода в один самостоятельно.

ЗЫЫ: в монопольном режиме, база блокировок не нужна , как и их обработка в нижеописаных процедурах. Для этого

в ПриНачалеРаботыСистемы нужна всего лишь проверка на

Если МонопольныйРежим ()= 0 Тогда

//тут создать объекты запроса/базы /табличек и прочий мусор

ТекстГм = " сюда пишем текст процедур ПриНачалеБлокировкиОбъекта и ОбработкаБлокирокиОбъекта";

гСервис= СоздатьОбъект ("Сервис");
гСервис.ДобавитьГлобальныйМодуль(ТекстГМ);
КонецЕсли ;

ЗЫЫЫ: принимаю пожертвования в качесте благодарности на

яндекс деньги 41001277400750

wmr R285258832971

Версия для DBF-варианта:

Перем запросSQLLite ;
Перем глМД ;
//======================================================================
Процедура ПриНачалеБлокировкиОбъекта ( Объект )
Тип = ТипЗначенияСтр( Объект );
Если ( Тип = "Документ" )или( Тип = "Справочник" ) Тогда
ИДОбъекта = глМД . ЗначениеВДлиннуюСтрокуБД ( Объект );
ТекстЗапроса = "
| INSERT or REPLACE INTO БазаБлокировок
| VALUES ('" + ИДОбъекта + "','" +ПолноеИмяПользователя()+ "')
|-- для типовой торговли можно пользовать глПользователь:
|-- VALUES ('" + ИДОбъекта + "','" + глПользователь . Наименование + "')
|" ;
фл = 0 ;
Пока фл = 0 Цикл
Попытка
запросSQLLite . ВыполнитьЗапрос ( ТекстЗапроса );
фл = 1 ;
Исключение
КонецПопытки;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
//======================================================================
Процедура ОбработкаБлокировкиОбъекта ( Объект , Повторить , ДопТекст )
Тип = ТипЗначенияСтр( Объект );
Если ( Тип = "Документ" )или( Тип = "Справочник" )Тогда
ИДОбъекта = глМД . ЗначениеВДлиннуюСтрокуБД ( Объект );
фл = 0 ;
Пока фл = 0 Цикл
Попытка
ИмяВредителя = запросSQLLite . ВыполнитьЗапрос ( "Select База.Пользователь From БазаБлокировок База Where База.ИДОбъекта = '" + ИДОбъекта + "'" , 0 );
фл = 1 ;
Исключение
КонецПопытки;
КонецЦикла;
Сообщить( "" + Объект + " открыт пользователем " + ИмяВредителя , "!" );
//для красоты, можно писать так, заместо Сообщить:

В данном примере речь идет об объектных блокировках, которые могут быть установлены автоматически расширениями форм объектов либо программно с помощью метода Заблокировать().
Проверка в контексте объекта, через который и производилась сама блокировка, выполняется следующим образом:
Код 1C v 8.х
Следует отметить, что в случае если объект заблокирован через другую переменную (например, открытую форму объекта), то метод Заблокирован() вернет значение Ложь.

Блокировка данных объекта влияет только на возможность его блокировки, но не препятствует изменению данных в базе данных. Поэтому, прежде чем изменять данные объекта, следует убедиться, что эти данных не заблокированы. Для этого необходимо попытаться установить блокировку:
Код 1C v 8.х
Если попытка заблокировать объект была удачной, это означает, что объект ранее не был заблокирован.

Разместил: E_Migachev  Версии: | 8.x | 8.2 УП |  Дата: 15.09.2010   Прочитано: 26306

Распечатать

Похожие FAQ

Еще в этой же категории

Полнотекстовый поиск в 1С (что это и пример использования)  22
Полнотекстовый поиск - позволит найти текстовую информацию, размещенную практически в любом месте используемой конфигурации. При этом искать нужные данные можно либо по всей конфигурации в целом, либо сузив область поиска до нескольких объектов Формат, функция форматирования значений  21
//Функция формирует удобное для чтения представление значений. // Примеры форматирования чисел ЗначФормат = Формат(123456.789, " ЧЦ=10; ЧДЦ=2" ); // ЗначФормат = " 123 456,79" ЗначФормат = Формат(123456.789, " ЧГ=0; ЧДЦ=2" ); // Знач УстановитьСсылкуНового  11
Установить ссылку нового это специальный механизм программиста, который позволяет присваивать новому объекту нужную ссылку. В основном это задача обмена, во многих типовых обменах используется синхронизация по UID объекта. Рассмотрим этот метод на к Обработчики событий при записи объектов. Зачем и что за чем?  11
Программисту, имеющего немного опыта на платформе 1С 8.2, бывает сложно разобраться: ПередЗаписью, ПриЗаписи, ПослеЗаписи, на сервере, на клиенте, в модуле формы, в модуле объекта, а-а-а-а-аааа. Именно такое сложное чувство непонимания МоментВремени, получение остатков до и после проведения  9
" Момент времени" - виртуальное поле, не хранится в базе данных. Содержит объект МоментВремени (который включает в себя дату и ССЫЛКУ НА ДОКУМЕНТ) В 7.7 было понятие ПозицияДокумента, а в 8.x Момент времени Для получения Остатков, Движений: М Посмотреть все в категории Встроенные Функции

нет там этой информации. Нет на уровне системы. Только если в среде 1С организуешь.

В скуле можно узнать, кто блокировал.
В нетвари можно узнать, кто блокировал

Но это даже не на уровне ОС, а на уровне сетевой ОС или самого скуля.

(11) должна быть. понимаешь, если я попытаюсь заблокировать уже заблокированный кем-то документ, система мне об этом сообщит. значит, знает кто это сделал.
Синтаксис:
Заблокирован()
Возвращаемое значение:
Тип: Булево. Истина - документ заблокирован; Ложь - в противном случае.
Описание:
Определяет, заблокирован ли документ ДАННЫМ ОБЪЕКТОМ.
Из контекста понимаю так, что нужно найти некий объект, и проверить - а не заблокировал-ли он ЭТОТ документ? .

Ты не понимаешь работы механизма блокировки. Он разный при блокировке на уровне ОС, сетевой ОС, файловой базы, скульной базы.

Общепринятым стандартом в случае, если делается попытка блокировки записи, уже кем то блокированной, то не предусмотрен возврат имени пользователя, блокировавшего запись. Только флаг - Выполнено/Отказано. Вот так просто сделали, хотя возврат имени был бы очень желателен.

(15) вот и мне интересно стало. раз система может определить, что документ зблокирован НЕ ДАННЫМ ОБЪЕКТОМ, значит она знает кто именно заблокировал
(16) как ты его найдешь, если это сделал ДРУГОЙ пользователь/другая копия программы.
(19) так система ведь мне сообщает, что документ ЗАБЛОКИРОВАН, только не сообщает кем именно.

информацию о блокировке (включая имя пользователя) можно посмотреть в скульном мониторе, в мониторе сетевой ОС, в мониторе файловой базы. Но в программных запросах оно не возвращается.

P.S. но может возвращаться, если в продукте есть специальный АПИ (такой есть, напрмер, в новеле - но надо работать на нормальном языке или писать ДЛЛ)

(24) да при чем тут это. ведь ясно, что система хранит у себя сведения о том, какой объект заблокировал документ. вопрос - можно ли эти свдеения получить, вот и все.
Есть-же спецы, которые изучили 1С на уровне физических записей. Их-бы сейчас сюда. Да и справка хромает. Лично я про функцию Заблокирован() из контекста ничего не понял
(28) подождем, сейчас кофы выпьют и появятся. зацепил меня этот вопрос.
(0) имхо - практически анреал.. Дело в том, что блокировка на стороне сиквела, а 1С с сиквелом общается только под одним пользователем. Итак.. получается.. Блокировка на стороне сиквела - "юзеронеразлечима", а в 1С (где юзеров собственно можно разлечить) как таковой блокировки нет (этим рулит именно сиквел)
Сиквел хранит соединение на каждое подключение (хоть и под одним юзером). Может быть по нему и определяется: сам блокировал или нет?
(31) блокировка производится не только в сиквеловской базе. но и в локальной, сл-но средствами самой платформы.

(33) ну-у-у. Для этого нужно всё "раскручивать взад".. но платформа таких механизмов не даёт.

(32) и-и-и.. Вы знаете функцию 1С которая Вам вернёт информацию о соединениях в сиквеле.

А откуда такая уверенность? Зачем 1С "в себе" блокировать, если можно на уровне записей организовать средствами SQL? Согласна была бы, если база файловая, а так не уверена.

Вот по поводу 7.7. Но я думаю, что по аналогии можно что-нибудь придумать.

Пока искал ссылку, появился пост (31). Похоже, что так и есть. В 7.7-то разные юзеры в sql сидели. Чорт.

а можно как-либо методом исключения выявить?
Хотя бы узнать хоть что-то тот пользователь заблокировал или нет?

исключением можно выявить, что документ заблокирован НЕ ДАННЫМ пользователем.

(38) а какая разница? для файловой всё просто более дубовей. При работе юзера с таблицей, на таблице устанавливается признак блокировки. Но это "флажёк".. в нём априори (для повышения того же быстродействия) НЕТ информации об источнике и причине блокировки. просто "состояние" - блокировано.

Отсюда и растут всё "ноги". Если так уж важно отслеживать что, где, когда.. То тогда имхо нужно дорабатывать сам документ, что бы он сам где-нибуть регистрировал того юзера, который в данное время делает "чёрное дело" :-)))

Читайте также: