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