Взаимные блокировки документов

1. Ivan_Stepnov 11.12.24 16:41 Сейчас в теме
Здравствуйте, уважаемые форумчане!

Прошу помочь организовать взаимную блокировку документов. В расширении у клиента создан вспомогательный документ, основанием которого является документ "Заказ клиента". Этот документ заполняется и потом обновляется из связанного заказа клиента, и наоборот - при изменении этого документа в связанном заказе клиента тоже должны меняться некоторые реквизиты.
И чтобы избежать ситуации, когда один документ при сохранении меняет реквизиты другого документа, а этот другой документ открыт другим пользователем, и после этого другой пользователь уже не сможет сохранить свои изменения, я сделал в процедуре ПриОткрытииНаСервере() модулей форм обоих документов такой блок:

Ключ = ЭтаФорма.Параметры.Ключ;
	
Попытка                              
	//Блокировка открываемого документа
	ЗаблокироватьДанныеДляРедактирования(Ключ, , ЭтаФорма.УникальныйИдентификатор);
		
	//Попытка заблокировать вспомогательный документ
	Если ЗначениеЗаполнено(ЭтаФорма.ВспомогательныйДокумент) Тогда
		ОбъектВсп = ЭтаФорма.ВспомогательныйДокумент.ПолучитьОбъект();
		ОбъектВсп.Заблокировать();
	КонецЕсли;	
Исключение
	ЭтаФорма.ТолькоПросмотр = истина;
КонецПопытки;
Показать


Т.е. делается попытка заблокировать открываемый документ, и в случае удачи - попытка заблокировать вспомогательный документ. В модуле формы вспомогательного документа процедура ПриОткрытииНаСервере( ) содержит аналогичный фрагмент, и если вызов ОбъектВсп.Заблокировать()
выпадает в исключение, значит, форма вспомогательного документа кем-то открыта, и форма заказа
открывается в режиме "Только просмотр".

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

Подскажите, пожалуйста, как решить такую проблему?
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. gml 11.12.24 21:22 Сейчас в теме
Если у Вас и основной, и вспомогательный - документы, попробуйте для них использовать один и тот же тип
блокировок, сохраняя их последовательность, например, так:
...
(при открытии формы)

Попытка
    ОбъектБлокировки1 = ОсновнойДокумент.ПолучитьОбъект();
    ОбъектБлокировки1 .Заблокировать();

    ОбъектБлокировки2 = ВспомогательныйДокумент.ПолучитьОбъект();
    ОбъектБлокировки2 .Заблокировать();
Исключение

    Если ОбъектБлокировки2.Заблокирован() Тогда
        ОбъектБлокировки2 .Разблокировать();
    КонецЕсли;

    Если ОбъектБлокировки1.Заблокирован() Тогда
        ОбъектБлокировки1 .Разблокировать();
    КонецЕсли;

    ЭтаФорма.ТолькоПросмотр = Истина;

КонецПопытки;


...
(при закрытии формы)

Если ОбъектБлокировки2.Заблокирован() Тогда
    ОбъектБлокировки2 .Разблокировать();
КонецЕсли;

Если ОбъектБлокировки1.Заблокирован() Тогда
    ОбъектБлокировки1 .Разблокировать();
КонецЕсли;
Показать
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот