Конструкция «ДЛЯ ИЗМЕНЕНИЯ» встречается в текстах запросов достаточно редко, поэтому многие программисты не до конца понимают ее предназначение. Несмотря на то, что данный оператор действует в режиме автоматических блокировок 1С, разработчики все же должны разбираться, для чего он существует. Если пока не удалось поработать с ним на практике, то изучить теоретическую часть стоит заранее.
Работа конструктора «ДЛЯ ИЗМЕНЕНИЯ»
Эту команду языка запросов используют для исключения взаимных блокировок в автоматическом режиме и контролирования остатков на складах или денежных средств. При работе в базе нескольких пользователей всегда существует вероятность, что они одновременно начнут выполнять одну операцию – списание со склада, например. Чаще всего подобная ситуация в любых конфигурациях возникает по единому алгоритму:
- Пользователь 1 запускает проведение документа на продажу товара со склада, и 1С проверяет остатки с помощью запроса к регистру накоплений. В результате запроса система понимает, что товар в наличии;
- Несколькими мгновениями позже пользователь 2 проводит аналогичный документ на реализацию той же номенклатуры. 1С проверяет остатки и аналогично одобряет операцию;
- При проведении документа пользователя 1 накладывается исключительная блокировка, и она «наталкивается» на разделяемую блокировку от действия пользователя 2. В результате после ожидания получается ошибка, так как эти блокировки несовместимы.
Именно для недопущения подобных ситуации и создали в языке запросов конструкцию «ДЛЯ ИЗМЕНЕНИЯ», которая накладывает исключительную блокировку с момента чтения. При выполнении запроса 1С бы запретила другим транзакциям считывать изменяемые данные. Проведение документа пользователя 2 приостановилось бы до того момента, пока не закончиться транзакция первого документа. Это происходит из-за того, что исключаемые блокировки несовместимы друг с другом.
Чтобы в запросе появилась конструкция «ДЛЯ ИЗМЕНЕНИЯ» с нужными нам ограничениями, необходимо использовать конструктор запроса. На вкладке «Дополнительно» нажмите галку для блокировки данных и перенесите вправо таблицы, которые нужно заблокировать. Блокировка всех таблиц избыточна, поэтому выбирайте конкретные источники данных из запроса.
ВЫБРАТЬ
ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура,
ТоварыНаСкладахОстатки.Склад КАК Склад,
ТоварыНаСкладахОстатки.КоличествоОстаток КАК КоличествоОстаток
ИЗ
РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки
ДЛЯ ИЗМЕНЕНИЯ
РегистрНакопления.ТоварыНаСкладах.Остатки
Если же вы работаете в режиме управляемых блокировок, то для оптимального решения подобных задач используйте функционал «БлокировкаДанных», заложенный в платформе. Также можно применять такой прием, как запись с последующим чтением данных в транзакции. Грамотно комбинируя эти приемы программирования, опытный разработчик сможет избежать проблем одновременного доступа к данным.
Движения.ТоварыНаСкладах.Записывать = Истина;
БлокДанных = Новый БлокировкаДанных;
БлокЭлемент = БлокДанных Блокировка.Добавить();
БлокЭлемент.Область = "РегистрНакопления.ТоварыНаСкладах ";
БлокЭлемент.Режим = РежимБлокировкиДанных.Исключительный;
БлокЭлемент.УстановитьЗначение("Номенклатура",Справочники.Номенклатура.НайтиПоНаименованию("Ботинки"));
БлокДанных.Заблокировать();
консультация эксперта
самые свежие новости 1 раз в месяц