Доброго времени суток, уважаемые форумчане!

У меня вопрос по блокировкам объекта.

Задача - сделать так, чтобы, если пользователь открыл управляемую форму элемента справочника, другие пользователи не могли редактировать или удалять этот элемент, пока открыта форма.

В обычных формах проблема решалась с помощью метода Объект.Заблокировать( ) при открытии формы.

В управляемой форме я пытаюсь решить проблему так: в модуле процедуры ПриСозданииНаСервере пишу такой код:

Попытка
 ЗаблокироватьДанныеФормыДляРедактирования();
Исключение
 ТолькоПросмотр = Истина;
КонецПопытки;

Этот код срабатывает - когда другой пользователь открывает этот же элемент, форма открывается только на просмотр,
и он ничего не может изменить.

Но если написать внешнюю обработку, которая принудительно будет менять этот элемент справочника вызовом

Объект.Записать( )

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

Можно ли защитить элемент справочника на время открытия формы от программных изменений?

Заранее благодарю.
---
Да, вы правы.
---
от программных нельзя, заранее пожалуйста
---
user623969_dusa, я хочу попробовать такой вариант:

В модуле формы:

В процедуре ПриСозданииНаСервере( ) пишу такой фрагмент:

Попытка
ЗаблокироватьДанныеФормыДляРедактирования();
Исключение
ТолькоПросмотр = Истина;
КонецПопытки;

В процедуре ПередЗаписьюНаСервере( )

ТекущийОбъект.ДополнительныеСвойства.Вставить("ЗаписьИзФормы", Истина);

Модуль объекта:

В процедуре ПередЗаписью( ) такой фрагмент:

ЭтоЗаписьИзФормы = Неопределено;
ДополнительныеСвойства.Свойство("ЗаписьизФормы", ЭтоЗаписьизФормы);

Если ЭтоЗаписьИзФормы <> Истина Тогда
 Если ЗначениеЗаполнено(Ссылка) Тогда
  Попытка
   Заблокировать();
  Исключение
   Отказ = Истина;
   ВызватьИсключение("Элемент заблокирован!");
  КонецПопытки;
 КонецЕсли;
КонецЕсли;

Т.е., если запись идет не из формы, то проверяется, не заблокирован ли объект.
И если заблокирован (т.е. открыта форма), то выдается ошибка, и запись не выполняется.

Решение я протестировал - вроде как работает. Хотел бы узнать Ваше мнение - можно ли использовать такой способ?
---
Как вариант, в модуле формы:

```1c
    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    Попытка
    ЗаблокироватьДанныеФормыДляРедактирования();
    Исключение
    ТолькоПросмотр = Истина;
    КонецПопытки;
    КонецПроцедуры

    &НаСервере
    Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
    ТекущийОбъект.ДополнительныеСвойства.Вставить("РазрешитьЗапись");
    КонецПроцедуры
```

И в модуле объекта (или в подписке):

```1c
    Процедура ПередЗаписью(Отказ)
    Отказ = Не ДополнительныеСвойства.Свойство("РазрешитьЗапись");
    КонецПроцедуры
```
---
SlavaKron, если в процедуре ПередЗаписью( ) в модуле объекта написать

Отказ = Не ДополнительныеСвойства.Свойство("РазрешитьЗапись");

то отказ будет при ЛЮБОЙ записи не из формы, даже когда форма закрыта. А надо, чтобы отказ был только при записи не из формы и только если форма открыта. Поэтому я сделал так:

ЭтоЗаписьИзФормы = Неопределено;
ДополнительныеСвойства.Свойство("ЗаписьизФормы", ЭтоЗаписьизФормы);

Если ЭтоЗаписьИзФормы <> Истина Тогда
Если ЗначениеЗаполнено(Ссылка) Тогда
Попытка
Заблокировать();
Исключение
Отказ = Истина;
ВызватьИсключение("Элемент заблокирован!");
КонецПопытки;
КонецЕсли;
КонецЕсли;
---
Действительно, но тогда всё ещё проще, ДополнительныеСвойства вообще не нужны, модуль формы остаётся как у вас:

```1c
    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    Попытка
    ЗаблокироватьДанныеФормыДляРедактирования();
    Исключение
    ТолькоПросмотр = Истина;
    КонецПопытки;
    КонецПроцедуры
```
А модуль объекта:

```1c
    Процедура ПередЗаписью(Отказ)
    Попытка
    Заблокировать();
    Исключение
    Отказ = Истина;
    ВызватьИсключение("Элемент заблокирован!");
    КонецПопытки;
    КонецПроцедуры
```
---
SlavaKron, так не годится - эта процедура ПередЗаписью( ) модуля объекта будет также блокировать и запись из самой формы, которая установила блокировку. Поэтому и надо в модуле формы сделать, как у Вас было сначала:

&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
    ТекущийОбъект.ДополнительныеСвойства.Вставить("РазрешитьЗапись");
КонецПроцедуры

А в ПередЗаписью( ) модуля объекта:

Если НЕ ТекущийОбъект.ДополнительныеСвойства.Свойство("РазрешитьЗапись") Тогда
 Попытка
  Заблокировать();
 Исключение
  Отказ = Истина;
  ВызватьИсключение("Элемент заблокирован!");
 КонецПопытки;
КонецЕсли;

Т.е. при записи из формы в этот фрагмент мы вообще не попадем, а при записи из программного кода будет проверка, не установлена ли на объект блокировка.
---
Да, вы правы.
---
Спасибо, SlavaKron, так и реализую!