Помогите разобраться с блокировками в групповых обработках
Здравствуйте. помогите разобраться с тем, какие блокировки использовать и когда.
Следующая ситуация: есть групповая обработка, которая записывает набор записей в регистр сведений. Регистр сведений состоит из 2-х измерений, без ресурсов. Каждое измерение является ссылкой на справочник. Обработка работает след. образом, создаем коллекции из ссылок на объекты справочника для первого измерения и, соответственно, также для второго. Создаем набор записей, куда в цикле добавляем записи. После того, как цикл закончился, мы записываем набор в регистр.
Здесь у меня возникает сложность в понимании того, что и каким образом мы должны блокировать. Не могу понять следующего, допустим первое измерение содержит ссылку на справочник автозапчасти, а второе - ссылку на модели автомобилей. Когда я нажимаю кнопку, запускающую обработку, я пишу в регистр запись: измерение1: "Передний тормозной диск", измерение2: "ВАЗ 2110". Мне необходимо, чтобы в регистр попала запись именно с этими значениями, чтобы никакой пользователь и никакой скрипт не изменил значение реквизитов этих объектов, пока запись не выполнена. также мне необходимо, чтобы никто после начала обработки, но до записи наборов в регистр, не удалил никакой из этих объектов, дабы избежать записи в регистр ссылки на несуществующий объект. Нужны ли здесь объектные блокировки или транзакционные блокировки или нет, да и вообще, как решаются подобные проблемы, которые я назвал?
Или второй пример, мы массово меняем значения реквизитов объектов в обработке, есть условие, должны быть изменены или все объекты или ни одного, раз так, значит нам необходимо делать все это в единой транзакции, чтобы в случае ошибки, отменить всю транзакцию. Как я понимаю нам нужно на каждый изменяемый объект наложить объектную блокировку, Нужно ли нам в транзакции помимо этого устанавливать транзакционные блокировки на все изменяемые объекты справочника или нет?
Следующая ситуация: есть групповая обработка, которая записывает набор записей в регистр сведений. Регистр сведений состоит из 2-х измерений, без ресурсов. Каждое измерение является ссылкой на справочник. Обработка работает след. образом, создаем коллекции из ссылок на объекты справочника для первого измерения и, соответственно, также для второго. Создаем набор записей, куда в цикле добавляем записи. После того, как цикл закончился, мы записываем набор в регистр.
Здесь у меня возникает сложность в понимании того, что и каким образом мы должны блокировать. Не могу понять следующего, допустим первое измерение содержит ссылку на справочник автозапчасти, а второе - ссылку на модели автомобилей. Когда я нажимаю кнопку, запускающую обработку, я пишу в регистр запись: измерение1: "Передний тормозной диск", измерение2: "ВАЗ 2110". Мне необходимо, чтобы в регистр попала запись именно с этими значениями, чтобы никакой пользователь и никакой скрипт не изменил значение реквизитов этих объектов, пока запись не выполнена. также мне необходимо, чтобы никто после начала обработки, но до записи наборов в регистр, не удалил никакой из этих объектов, дабы избежать записи в регистр ссылки на несуществующий объект. Нужны ли здесь объектные блокировки или транзакционные блокировки или нет, да и вообще, как решаются подобные проблемы, которые я назвал?
Или второй пример, мы массово меняем значения реквизитов объектов в обработке, есть условие, должны быть изменены или все объекты или ни одного, раз так, значит нам необходимо делать все это в единой транзакции, чтобы в случае ошибки, отменить всю транзакцию. Как я понимаю нам нужно на каждый изменяемый объект наложить объектную блокировку, Нужно ли нам в транзакции помимо этого устанавливать транзакционные блокировки на все изменяемые объекты справочника или нет?
По теме из базы знаний
Ответы
В избранное
Подписаться на ответы
Сортировка:
Древо развёрнутое
Свернуть все
1. Работа происходит со ссылками, смысл париться о состоянии объекта, как может элемент справочника "ВАЗ 2110" превратится в "Porsche Cayenne", если это происходит, то кому то надо вправить мозг.
2. Транзакция все сделает за тебя сама.
2. Транзакция все сделает за тебя сама.
(1)
При записи набора записей явно блокировать что-то не обязательно. Платформа неявным образом открывает транзакцию и устанавливает блокировки. Если у вас запись происходит в несколько регистров и в случае ошибки должны откатываться записи из всех регистров - тогда устанавливайте отдельную транзакцию.
Для принудительного блокирования записей регистра до окончания записи набора можно воспользоваться объектом БлокировкаДанных - почитайте про него в синтаксис-помощнике. Но тут есть подводные камни. Если у вас 8.2 или режим совместимости с 8.2 и режим управления блокировками автоматический, то блокировка данных будет вызывать исключение.
Для этих целей будет использоваться транзакционная блокировка.
Объектная блокировка - немного не то, как вы ее понимаете. Она больше нужна для того чтобы выводить сообщения пользователям при попытке изменить заблокированный объект. Они устанавливаются только автоматически платформой
При записи набора записей явно блокировать что-то не обязательно. Платформа неявным образом открывает транзакцию и устанавливает блокировки. Если у вас запись происходит в несколько регистров и в случае ошибки должны откатываться записи из всех регистров - тогда устанавливайте отдельную транзакцию.
Для принудительного блокирования записей регистра до окончания записи набора можно воспользоваться объектом БлокировкаДанных - почитайте про него в синтаксис-помощнике. Но тут есть подводные камни. Если у вас 8.2 или режим совместимости с 8.2 и режим управления блокировками автоматический, то блокировка данных будет вызывать исключение.
Для этих целей будет использоваться транзакционная блокировка.
Объектная блокировка - немного не то, как вы ее понимаете. Она больше нужна для того чтобы выводить сообщения пользователям при попытке изменить заблокированный объект. Они устанавливаются только автоматически платформой
Вакансии
Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)