Есть некий документ в 1с8, который распечатали со штрихкодом.
Первый пользователь сканирует штрихкод и у него открывается окошко с данными описываемого документа с кнопками "Подтвердить", "Отменить".
После нажатия на кнопку "Подтвердить" - документ заблокируется.
Но есть второй пользователь, который после открытия формы подтверждения у первого пользователя резко успевает поменять данные документа в результате чего первый пользователь подтверждает совершенно другие данные (устаревшие).
Хотелось бы при открытии формы у первого пользователя установить временную блокировку на данный документ, которая в случае нажатия на кнопку "Отмена" или "Подтвердить" будет сниматься.
То есть мне нужно в процедуре формы "ПриСозданииНаСервере" - заблокировать документ, а при закрытии формы - разблокировать.
Рассматриваю объект "Блокировка данных" и столкнулся с ступором того что я ведь не смогу открыть транзакцию при открытии формы, а закрыть транзакцию при ее закрытии. Получится "Блокировкой данных" я сделать ничего не смогу?
Посоветуйте что то пожалуйста.
Первый пользователь сканирует штрихкод и у него открывается окошко с данными описываемого документа с кнопками "Подтвердить", "Отменить".
После нажатия на кнопку "Подтвердить" - документ заблокируется.
Но есть второй пользователь, который после открытия формы подтверждения у первого пользователя резко успевает поменять данные документа в результате чего первый пользователь подтверждает совершенно другие данные (устаревшие).
Хотелось бы при открытии формы у первого пользователя установить временную блокировку на данный документ, которая в случае нажатия на кнопку "Отмена" или "Подтвердить" будет сниматься.
То есть мне нужно в процедуре формы "ПриСозданииНаСервере" - заблокировать документ, а при закрытии формы - разблокировать.
Рассматриваю объект "Блокировка данных" и столкнулся с ступором того что я ведь не смогу открыть транзакцию при открытии формы, а закрыть транзакцию при ее закрытии. Получится "Блокировкой данных" я сделать ничего не смогу?
Посоветуйте что то пожалуйста.
По теме из базы знаний
- Работа с управляемыми блокировками в примерах. Новая схема проведения документов 1с 8.2.
- Информирование пользователя. Работа с объектом «СообщениеПользователю»
- Разбор причины ошибки "Нарушение целостности чтения объекта базы данных из-за параллельного изменения объекта другим сеансом"
- Правила работы с транзакциями 1С
- Компонента ExchangeStruc (Структура Обмена). Прямой обмен данными между потоками, сессиями и окнами.
Найденные решения
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(2) Понял, но в моей ситуации легче на кнопку "Получить" снова вытянуть данные и сверить их с подтверждаемыми значениями на форме, после чего ожидать снова подтверждения обновленных данных.
Хотелось бы понять, я правильно понял ли принцип объекта "Блокировка данных". В моем случае его никак не применить? Блокировка происходит только в одной транзакции?
Хотелось бы понять, я правильно понял ли принцип объекта "Блокировка данных". В моем случае его никак не применить? Блокировка происходит только в одной транзакции?
Сразу при открытии формы делай формальное изменение данных объекта в этой форме. Неважно какое, главное чтобы объект в форме начал считаться измененным. В этот момент сработает штатная объектная блокировка и второй пользователь не сможет интерактивно изменить данные параллельно. Если же второй пользователь уже начал менять данные, то наоборот - вылетит исключение у пользователя, который пытается заблокировать документ.
(3)
Я Вас не совсем понял. Немного конкретизирую для взаимопонимания.
1 человек - кладовщик.
2 человек - диспетчер.
документ - реализация.
бумажка со штрих кодом - распечатанный документ реализация со штрихкодом для сканировки.
Ситуация:
1) кладовщику попадает печатная форма реализации;
2) он сканирует ее в результате чего открывается общая форма с табличной частью, которая в процедуре "ПриСозданииНаСервере" заполняется данными из документа реализации;
(итак, на данном этапе у нас открыта форма с кнопками принять/отменить у кладовщика и он сидит и сверяет циферки с формой и напечатанным документом).
3) диверсант диспетчер меняет документ реализации;
4) кладовщик заканчивает проверку данных и все у него сходится. Это он подтверждает нажатием кнопки "Подтвердить".
(в результате получается ситуация, когда кладовщик подтвердил данные, но они оказались на самом деле другие. Все дело в том что диспетчер во время проверки текущих данных обновил циферки в реализации).
Можно мне подробно объяснить как заблокировать для изменения документ "реализация" когда кладовщик уже открыл форму. Либо как решить ситуацию, а то я перечитал Ваш комментарий несколько раз и не понял к сожалению что мне сделать :(
формальное изменение данных объекта в этой форме. Неважно какое, главное чтобы объект в форме начал считаться измененным. В этот момент сработает штатная объектная блокировка и второй пользователь не сможет интерактивно изменить данные параллельно. Если же второй пользователь уже начал менять данные, то наоборот - вылетит исключение у пользователя, который
Я Вас не совсем понял. Немного конкретизирую для взаимопонимания.
1 человек - кладовщик.
2 человек - диспетчер.
документ - реализация.
бумажка со штрих кодом - распечатанный документ реализация со штрихкодом для сканировки.
Ситуация:
1) кладовщику попадает печатная форма реализации;
2) он сканирует ее в результате чего открывается общая форма с табличной частью, которая в процедуре "ПриСозданииНаСервере" заполняется данными из документа реализации;
(итак, на данном этапе у нас открыта форма с кнопками принять/отменить у кладовщика и он сидит и сверяет циферки с формой и напечатанным документом).
3) диверсант диспетчер меняет документ реализации;
4) кладовщик заканчивает проверку данных и все у него сходится. Это он подтверждает нажатием кнопки "Подтвердить".
(в результате получается ситуация, когда кладовщик подтвердил данные, но они оказались на самом деле другие. Все дело в том что диспетчер во время проверки текущих данных обновил циферки в реализации).
Можно мне подробно объяснить как заблокировать для изменения документ "реализация" когда кладовщик уже открыл форму. Либо как решить ситуацию, а то я перечитал Ваш комментарий несколько раз и не понял к сожалению что мне сделать :(
(8)
Вроде как получилось. В "ПриСозданииНаСервере" написал:
В параметрах указал "УникальныйИдентификатор" текущей формы и как написано в справочнике - это должно снимать автоматически блокировку при закрытии окна, но у меня почему то не снялись все блокировки (как я понял, потому что я закрыл окно, а снова при открытии на "ЗаблокироватьДанныеДляРедактирования" я получал ошибку "данные уже заблокрованы"). Пришлось написать код ниже (и так, вроде, работает:
ЗаблокироватьДанныеДляРедактирования
Вроде как получилось. В "ПриСозданииНаСервере" написал:
//там несколько накладных блокировать нужно и ссылки я получил в запросе
ЗаблокироватьДанныеДляРедактирования(Выборка.Ссылка,ЭтаФорма.УникальныйИдентификатор); // блокирую с каждыйм обходом по ссылке каждую накладную
В параметрах указал "УникальныйИдентификатор" текущей формы и как написано в справочнике - это должно снимать автоматически блокировку при закрытии окна, но у меня почему то не снялись все блокировки (как я понял, потому что я закрыл окно, а снова при открытии на "ЗаблокироватьДанныеДляРедактирования" я получал ошибку "данные уже заблокрованы"). Пришлось написать код ниже (и так, вроде, работает:
&НаСервере
Процедура СнятьБлокировку()
Для каждого Документ Из СсылкиДокументов Цикл
РазблокироватьДанныеДляРедактирования(Документ.Значение);
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура ПриЗакрытии()
СнятьБлокировку();
КонецПроцедуры
Показать
Есть еще Заблокировать() - но это скорее для объектной блокировки при программной работе с объектами (обычно используют для кривой проверки через попытку/исключение, не начал ли уже какой-либо пользователь редактировать объект. Потому что иначе его при попытке записи изменений просто отлупит с невнятным для пользователей сообщением об изменившейся версии объекта в базе данных).
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот