Работа с объектом "Блокировка данных"

1. SantiouS 28.01.20 10:28 Сейчас в теме
Есть некий документ в 1с8, который распечатали со штрихкодом.
Первый пользователь сканирует штрихкод и у него открывается окошко с данными описываемого документа с кнопками "Подтвердить", "Отменить".
После нажатия на кнопку "Подтвердить" - документ заблокируется.

Но есть второй пользователь, который после открытия формы подтверждения у первого пользователя резко успевает поменять данные документа в результате чего первый пользователь подтверждает совершенно другие данные (устаревшие).

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

То есть мне нужно в процедуре формы "ПриСозданииНаСервере" - заблокировать документ, а при закрытии формы - разблокировать.

Рассматриваю объект "Блокировка данных" и столкнулся с ступором того что я ведь не смогу открыть транзакцию при открытии формы, а закрыть транзакцию при ее закрытии. Получится "Блокировкой данных" я сделать ничего не смогу?

Посоветуйте что то пожалуйста.
По теме из базы знаний
Найденные решения
8. herfis 499 28.01.20 10:48 Сейчас в теме
(6) А! Нужно залочить один документ, пока открыт другой. Интересная задача, не приходилось такое делать.
Попробуй ЗаблокироватьДанныеДляРедактирования(). Похоже на то, что надо.
SantiouS; +1 Ответить
11. herfis 499 28.01.20 12:12 Сейчас в теме
(10) Отлично. В описании метода упоминается, что блокировка может быть снята не сразу, а через некоторое время после закрытия формы. Что, конечно же, неудобно. С явной разблокировкой норм решение.
SantiouS; +1 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. VmvLer 28.01.20 10:30 Сейчас в теме
Для таких задач используют реквизит "Статус" в документах.
юзать блокировку от лукавого.
vadim.semyonov.rzn; succub1_5; +2 Ответить
4. SantiouS 28.01.20 10:36 Сейчас в теме
(2) Понял, но в моей ситуации легче на кнопку "Получить" снова вытянуть данные и сверить их с подтверждаемыми значениями на форме, после чего ожидать снова подтверждения обновленных данных.

Хотелось бы понять, я правильно понял ли принцип объекта "Блокировка данных". В моем случае его никак не применить? Блокировка происходит только в одной транзакции?
12. buganov 200 28.01.20 12:40 Сейчас в теме
(4) Не правильно. Не надо блокировок!
Да, блокировка только в транзакции.
14. SantiouS 28.01.20 12:56 Сейчас в теме
(12) Почему не нужно? Я ниже написал в (10) свое решение. Чем оно неудачно?
15. buganov 200 28.01.20 21:19 Сейчас в теме
(14)я про блокировка данных, а не объектную блокировку
3. herfis 499 28.01.20 10:35 Сейчас в теме
Сразу при открытии формы делай формальное изменение данных объекта в этой форме. Неважно какое, главное чтобы объект в форме начал считаться измененным. В этот момент сработает штатная объектная блокировка и второй пользователь не сможет интерактивно изменить данные параллельно. Если же второй пользователь уже начал менять данные, то наоборот - вылетит исключение у пользователя, который пытается заблокировать документ.
6. SantiouS 28.01.20 10:45 Сейчас в теме
(3)
формальное изменение данных объекта в этой форме. Неважно какое, главное чтобы объект в форме начал считаться измененным. В этот момент сработает штатная объектная блокировка и второй пользователь не сможет интерактивно изменить данные параллельно. Если же второй пользователь уже начал менять данные, то наоборот - вылетит исключение у пользователя, который


Я Вас не совсем понял. Немного конкретизирую для взаимопонимания.
1 человек - кладовщик.
2 человек - диспетчер.
документ - реализация.
бумажка со штрих кодом - распечатанный документ реализация со штрихкодом для сканировки.

Ситуация:
1) кладовщику попадает печатная форма реализации;
2) он сканирует ее в результате чего открывается общая форма с табличной частью, которая в процедуре "ПриСозданииНаСервере" заполняется данными из документа реализации;
(итак, на данном этапе у нас открыта форма с кнопками принять/отменить у кладовщика и он сидит и сверяет циферки с формой и напечатанным документом).
3) диверсант диспетчер меняет документ реализации;
4) кладовщик заканчивает проверку данных и все у него сходится. Это он подтверждает нажатием кнопки "Подтвердить".
(в результате получается ситуация, когда кладовщик подтвердил данные, но они оказались на самом деле другие. Все дело в том что диспетчер во время проверки текущих данных обновил циферки в реализации).

Можно мне подробно объяснить как заблокировать для изменения документ "реализация" когда кладовщик уже открыл форму. Либо как решить ситуацию, а то я перечитал Ваш комментарий несколько раз и не понял к сожалению что мне сделать :(
8. herfis 499 28.01.20 10:48 Сейчас в теме
(6) А! Нужно залочить один документ, пока открыт другой. Интересная задача, не приходилось такое делать.
Попробуй ЗаблокироватьДанныеДляРедактирования(). Похоже на то, что надо.
SantiouS; +1 Ответить
9. SantiouS 28.01.20 10:49 Сейчас в теме
(8) Сейчас начал читать за данный метод. Спасибо :)
10. SantiouS 28.01.20 11:36 Сейчас в теме
(8)
ЗаблокироватьДанныеДляРедактирования


Вроде как получилось. В "ПриСозданииНаСервере" написал:

//там несколько накладных блокировать нужно и ссылки я получил в запросе
ЗаблокироватьДанныеДляРедактирования(Выборка.Ссылка,ЭтаФорма.УникальныйИдентификатор); // блокирую с каждыйм обходом по ссылке каждую накладную


В параметрах указал "УникальныйИдентификатор" текущей формы и как написано в справочнике - это должно снимать автоматически блокировку при закрытии окна, но у меня почему то не снялись все блокировки (как я понял, потому что я закрыл окно, а снова при открытии на "ЗаблокироватьДанныеДляРедактирования" я получал ошибку "данные уже заблокрованы"). Пришлось написать код ниже (и так, вроде, работает:

&НаСервере
Процедура СнятьБлокировку()
	Для каждого Документ Из СсылкиДокументов Цикл
		РазблокироватьДанныеДляРедактирования(Документ.Значение); 	
	КонецЦикла;
КонецПроцедуры

&НаКлиенте
Процедура ПриЗакрытии()
	СнятьБлокировку();
КонецПроцедуры
Показать
11. herfis 499 28.01.20 12:12 Сейчас в теме
(10) Отлично. В описании метода упоминается, что блокировка может быть снята не сразу, а через некоторое время после закрытия формы. Что, конечно же, неудобно. С явной разблокировкой норм решение.
SantiouS; +1 Ответить
13. SantiouS 28.01.20 12:55 Сейчас в теме
(11) Спасибо за помощь, хорошего дня :)
5. herfis 499 28.01.20 10:41 Сейчас в теме
Нарыл еще ЗаблокироватьДанныеДляРедактирования() и ЗаблокироватьДанныеФормыДляРедактирования() глобального контекста. Но сам не юзал.
А БлокировкаДанных - да, не для этого. Это транзакционные блокировки.
7. herfis 499 28.01.20 10:45 Сейчас в теме
Есть еще Заблокировать() - но это скорее для объектной блокировки при программной работе с объектами (обычно используют для кривой проверки через попытку/исключение, не начал ли уже какой-либо пользователь редактировать объект. Потому что иначе его при попытке записи изменений просто отлупит с невнятным для пользователей сообщением об изменившейся версии объекта в базе данных).
Оставьте свое сообщение

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