Работа с управляемыми блокировками в примерах. Новая схема проведения документов 1с 8.2.





Много информации есть на тему работы с управляемыми блокировками в 1С 8.2. Но так, как я не нашел статьи, написанной в простых и понятных примерах, то решил написать свою статью. Она будет полезна тем, кто все еще не до конца понимает принципы работы управляемых блокировок и то, чем отличаются блокировки новой схемы проведения от старой.

Будем рассматривать принципы работы управляемых блокировок на некоторой тестовой конфигурации. Учет ведется в разрезе номенклатуры и свойств номенклатуры. Приходная накладная (ПН) ничего не блокирует, но пишет данные в регистр накопления «Остаток товара». На примере документа Расходная накладная (РН) изучим, как работают управляемые блокировки, а затем посмотрим на новую схему проведения документов. В ПН и РН есть одинаковые по структуре табличные части (ТЧ) СписокНоменклатуры, в которых содержится список Номенклатуры, Свойств, Количество, Сумма, Цена:

В Регистре накопления есть соответсвующие измерения: Номенклатура, Свойство и два ресурса — Сумма и Количество. 

Предварительно для работы с управляемыми блокировками установим управляемый режим блокировок для конфигурации в целом и управляемывй режим блокировок отдельно для Приходной накладной, Расходной накладной и для всех регистров, движения по которым эти документы делают. В наших примерах — это один регистр накопления Остаток товара.

Обратим внимание, что в файловой версии можно устанавливать блокировки только на таблицы целиком (см. таблицу ниже), построчные (в разрезе выбранных движений из регистра накопления, например) блокировки в файловом режиме не работают. Примеры тестировались на 1С 8.2 + MS SQL 2008 R2 Express.


Детальнее про поддерживаемые режимы блокировок тут: http://v8.1c.ru/overview/Term_000000642.htm

Примеры рассматриваются на следующих РН и ПН:

ПН — 01

ПН — 02

РН — 01

 

Пример 1. Блокировка по конкретно известной номенклатурной позиции.

Код процедуры ОбработкаПроведения(Отказ, Режим) модуля объекта документа РасходнаяНакладная:

Движения.ОстаткиНоменклатуры.Записывать = Истина;

Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить();
ЭлементБлокировки.Область = «РегистрНакопления.ОстаткиНоменклатуры»;
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
ЭлементБлокировки.УстановитьЗначение(«Номенклатура»,Справочники.Номенклатура.НайтиПоНаименованию(«Ботинки»)); //поиск по наименованию в целях примера
Блокировка.Заблокировать(); //установили блокировку по номенклатуре с наименованием «Ботинки»

//Далее идет заполнение движений

Как это работает:

Если в процессе проведение РН — 01, сделать попытку провести ПН — 01, то она будет ожидать завершения блокировки регистра накопления по измерению «Номенклатура» с наименованием «Ботинки» и ПН — 02 будет ожидать завершения блокировки регистра накопления по измерению «Номенклатура» с наименованием «Ботинки».


Пример 2. Блокировка по конкретно известной паре номенклатурная позиция — свойство.

Код процедуры ОбработкаПроведения(Отказ, Режим) модуля объекта документа РасходнаяНакладная:

Движения.ОстаткиНоменклатуры.Записывать = Истина;

Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить();
ЭлементБлокировки.Область = «РегистрНакопления.ОстаткиНоменклатуры»;
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
ЭлементБлокировки.УстановитьЗначение(«Номенклатура», Справочники.Номенклатура.НайтиПоНаименованию(«Ботинки»)); //поиск по наименованию в целях примера
ЭлементБлокировки.УстановитьЗначение(«Свойство», Справочники.Свойства.НайтиПоНаименованию(«черные 42 размера»)); //поиск по наименованию в целях примера
Блокировка.Заблокировать();

//Далее идет заполнение движений

Как это работает:

Если в процессе проведение РН — 01, сделать попытку провести ПН — 01, то она будет ожидать завершения блокировки регистра накопления по паре измерений «Номенклатура» (с наименованием «Ботинки») -«Свойство» (с наименованием «черные 42 размера»), а ПН — 02 проведется без ожидания, так как в ее ТЧ СписокНоменклатуры нет пары  «Номенклатура»-«Свойство», которая будет образовывать соответвствующее движение.

 

Пример 3. Блокировка на всю таблицу регистра накопления.

Код процедуры ОбработкаПроведения(Отказ, Режим) модуля объекта документа РасходнаяНакладная:

Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить();
ЭлементБлокировки.Область = «РегистрНакопления.ОстаткиНоменклатуры»;
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
Блокировка.Заблокировать();

//Далее идет заполнение движений

Как это работает:

Если в процессе проведение РН — 01, сделать попытку провести ПН — 01, то она будет ожидать завершения блокировки таблицы регистра накопления и ПН — 02 будет ожидать завершения блокировки таблицы регистра накопления.

 

Пример 4. Блокировка по одному полю из источника данных для блокировки (это, например, список движений или список номенклатуры по которой будут движения).

Код процедуры ОбработкаПроведения(Отказ, Режим) модуля объекта документа РасходнаяНакладная:

Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить();
ЭлементБлокировки.Область = «РегистрНакопления.ОстаткиНоменклатуры»;
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры;
ЭлементБлокировки.ИспользоватьИзИсточникаДанных(«Номенклатура», «Номенклатура»);
Блокировка.Заблокировать();

//Далее идет заполнение движений

Как это работает:

Если в процессе проведение РН — 01, сделать попытку провести ПН — 01, то она будет ожидать завершения блокировки регистра накопления по измерению «Номенклатура» и значением «Ботинки» из источника СписокНоменклатуры и ПН — 02 будет ожидать завершения блокировки регистра накопления по измерению «Номенклатура» и значением «Ботинки» из источника СписокНоменклатуры (так как именно такое значение реквизита «Номенклатура» в переданной как источник ТЧ).


Пример 5. Блокировка по комбинации полей из источника данных для блокировки (это, например, список движений или список номенклатуры со свойствами по которой будут движения).

Код процедуры ОбработкаПроведения(Отказ, Режим) модуля объекта документа РасходнаяНакладная:

Блокировка = Новый БлокировкаДанных;

ЭлементБлокировки = Блокировка.Добавить();
ЭлементБлокировки.Область = «РегистрНакопления.ОстаткиНоменклатуры»;
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры;
ЭлементБлокировки.ИспользоватьИзИсточникаДанных(«Номенклатура», «Номенклатура»);
ЭлементБлокировки.ИспользоватьИзИсточникаДанных(«Свойство», «Свойство»);
Блокировка.Заблокировать();
 

//Далее идет заполнение движений

Как это работает:

Если в процессе проведение РН — 01, сделать попытку провести ПН — 01, то она будет ожидать завершения блокировки регистра накопления по паре измерений «Номенклатура» значение «Ботинки» из переданного источника — «Свойство» значение «черные 42 размера» из переданного источника, а ПН — 02 проведется без ожидания, так как в ее ТЧ СписокНоменклатуры нет пары  «Номенклатура»-«Свойство», которая будет образовывать соответвствующее значениям полей источника блокировки движение.


Пример 6. Блокировка по двум полям из источника данных для блокировки.

Код процедуры ОбработкаПроведения(Отказ, Режим) модуля объекта документа РасходнаяНакладная:

//условие «И» — будут заблокированы и записи для номенклатуры из ТЧ СписокНоменклатуры

// с любыми свойствами и записи для любой номенклатуры со свойствами из ТЧ СписокНоменклатуры
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить();
ЭлементБлокировки.Область = «РегистрНакопления.ОстаткиНоменклатуры»;
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры;
ЭлементБлокировки.ИспользоватьИзИсточникаДанных(«Номенклатура», «Номенклатура»);
ЭлементБлокировки = Блокировка.Добавить();
ЭлементБлокировки.Область = «РегистрНакопления.ОстаткиНоменклатуры»;
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры;
ЭлементБлокировки.ИспользоватьИзИсточникаДанных(«Свойство», «Свойство»);
Блокировка.Заблокировать();

//Далее идет заполнение движений

Как это работает:

Если в процессе проведение РН — 01, сделать попытку провести ПН — 01, то она будет ожидать завершения блокировки регистра накопления по измерению «Номенклатура» значение «Ботинки» с любыми свойствами и отдельно по «Свойству» со значением «черные 42 размера» для любой номенклатуры, в ПН — 01 есть и номенклатура «Ботинки» и номенклатура со свойствами «черные 42 размера». Аналогично ПН — 02 будет ожидать завершения блокировки, так как в ПН — 02 есть номенклатура «Ботинки». 


Пример 7. Новая схема проведения (чем же отличается БлокироватьДляИзменеия = Истина от блокировок при помощи объекта БлокировкаДанных).

Код процедуры ОбработкаПроведения(Отказ, Режим) модуля объекта документа РасходнаяНакладная:

//Новая схема (без механизма контроля остатков)

//Разбор БлокироватьДляИзменения = Истина
Движения.ОстаткиНоменклатуры.БлокироватьДляИзменения = Истина;
Движения.ОстаткиНоменклатуры.Записать(); //Набор пустой, нет значений полей пространства блокировки. нечего блокировать.

//очень упрощенный пример создания движений расходной
Для Каждого СтрокаН Из СписокНоменклатуры Цикл
Движение = Движения.ОстаткиНоменклатуры.ДобавитьРасход();
Движение.Период = Дата;
Движение.Номенклатура = СтрокаН.Номенклатура;

Движение.Количество = СтрокаН.Количество;
Движение.Сумма = СтрокаН.Сумма;

Движение.Свойство = СтрокаН.Свойство;
КонецЦикла;

//1
Движения.ОстаткиНоменклатуры.БлокироватьДляИзменения = Истина;
Движения.ОстаткиНоменклатуры.Записать(); //Набор не пустой будет выполнена блокировка, источник — ТЧ СписокТоваров


//Далее должен идти механизм контроля остатков

Как это работает:

Если в процессе проведение РН — 01, сделать попытку провести ПН — 01, то она будет ожидать завершения блокировки регистра накопления по паре измерений «Номенклатура» значение «Ботинки» из переданного источника — «Свойство» значение «черные 42 размера» из переданного источника, а ПН — 02 проведется без ожидания, так как в ее ТЧ СписокНоменклатуры нет пары  «Номенклатура»-«Свойство», которая будет образовывать соответвствующее значениям полей источника блокировки движение.

При использовании команды БлокироватьДляИзменения = Истина на регистр накопления по значениям измерений движений установится исключительная блокировка. Никаких конструкций с использованием объекта БлокировкаДанных для этого писать не нужно.

Код под комментарием //1 выше аналогичен следующему коду:

//Работает аналогично, как и 1
Движения.ОстаткиНоменклатуры.Записать();
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить();
ЭлементБлокировки.Область = «РегистрНакопления.ОстаткиНоменклатуры»;
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
ЭлементБлокировки.ИсточникДанных = Движения.ОстаткиНоменклатуры.Выгрузить();
Для Каждого Измерение Из Метаданные.РегистрыНакопления.ОстаткиНоменклатуры.Измерения Цикл
    ЭлементБлокировки.ИспользоватьИзИсточникаДанных(Измерение.Имя, Измерение.Имя);
КонецЦикла;
Блокировка.Заблокировать();

//Далее должен идти механизм контроля остатков


P.S. Отличие исключительных блокировок от разделяемых в изложенных выше примерах в том, что при разделяемом режиме блокировок возможны разделяемые блокировки при параллельном проведении других документов по тем же полям источников данных, что и в заблокированных в данном документе данных. 

44 Comments

  1. Hany
    Движения.ОстаткиНоменклатуры.БлокироватьДляИзменения = Истина;

    Движения.ОстаткиНоменклатуры.Записать(); //Набор пустой, нет значений полей пространства блокировки. нечего блокировать.

    Вы забыли уточнить, зачем мы блокируем «пустой» набор. Когда пишется «пустой» набор, то:

    1) блокируются данные по «очищаемым» записям (т.е. тем, по которым были движения до перепроведения документа, ведь их тоже надо блокировать, чтобы в случае отмены транзакции гарантировать откат (отказ от проведения и возврат к предыдущим проводкам));

    2) все записи очищаются

    А также хочу добавить, что «БлокироватьДляИзменения» выставлять в значение «Истина» нужно, если у вас в регистре установлено «Разделение итогов», чтобы «временно отключить» это разделение.

    Reply
  2. Fruit83
    Отличие исключительных блокировок от разделяемых в изложенных выше примерах в том, что при разделяемом режиме блокировок возможны разделяемые блокировки при параллельном проведении других документов по тем же полям источников данных, что и в заблокированных в данном документе данных.

    Я читал более простое объяснение. При исключительных блокировках записывать ничего нельзя и читать данные тоже нельзя. При разделяемых читать данные можно.

    Reply
  3. kilokilo

    Хотя работа в блокировками мне знакома — большое спасибо, что разместили статью не в скачиваемом файле.

    Reply
  4. erina_valentina

    Спасибо! Очень полезная и интересная статья!

    Reply
  5. khaoos

    Автор молодец. Хорошо пишешь. Неплохо было бы и первый комментарий от Hany изящно как-нибудь воткнуть в статью 🙂 и добавить к нему, что при записи управляемые блокировки накладываются всегда (конечно, при соответствующем режиме) и БлокироватьДляИзменения нужно, чтобы в блокировках не учитывалось это самое измерение-разделитель. Ну в PS после статьи как-то мысль хитро завернута в слова, что на месте человека впервые разбирающегося с блокировками я бы не понял этой мысли 🙂

    Reply
  6. sockor

    вот спасибо, никак время не находил это изучить.

    Reply
  7. Altair777

    К концу статьи начинает коробить от тавтологий. Копипаст рулит 🙂

    Reply
  8. tolyan_ekb

    спасибо. Полезная статья с примерами и комментариями. Надеюсь, скоро попробую с блокировками поработать.

    Reply
  9. DenisCh

    Спасибо, полезная статья.

    Reply
  10. mikhailovaew

    Спасибо за статью!

    Присоединюсь к (5): не все читают комментарии, а замечание из (1) ценное, лучше его разместить в самой статье, хотя бы в комментариях в коде

    Reply
  11. Invaa

    (11) mikhailovaew,

    добавлю ценные замечания в статью обязательно и спасибо за них 🙂 руки пока не дошли еще…

    Reply
  12. briz

    Вопрос , а как поведет в примере 5 ПН 2, если в РН будет еще такая запись : Ботинки,Со шпильками 37 размера. ?

    Reply
  13. Invaa

    (13) briz,

    При блокировках РН, устанавливаемых в примере 5, и наличии в РН записи «Ботинки,Со шпильками 37», ПН 2 проведется, так как в этой приходной нет записей соотвествующих блокировкам. Есть записи отдельно по товару «Ботинки», отдельно по свойству «Со шпильками 37», но не с парой «Ботинки»-«Со шпильками 37».

    Reply
  14. briz

    (15)есть подозрение что блокируется все комбинации товаров и свойств, поэтому, имхо, ПН 2 будет ждать

    Reply
  15. Invaa

    (16) briz,

    такая блокировка накладывается в примере 6

    Reply
  16. hogik

    (0)

    Вызывает сомнение утверждение в первом примере, что приходные накладные будут ожидать завершение проведения расходной накладной, если код управляемых блокировок будет внесен только в расходную накладную.

    «Следует помнить, что чтение данных другими транзакциями будет невозможно только в том случае, если в других транзакциях устанавливаются несовместимые управляемые блокировки. Если управляемые блокировки в других транзакциях не устанавливаются, то чтение будет возможно.»(с)

    http://www.lavelin.ru/index.php/articles/1s/18-razrabotka/93-blokirovki-dannyh-v-1spredpriyatii-8

    Или я ошибаюсь?

    Reply
  17. rozer

    согласен с (18), только если в ПН прописать блокировки тогда утверждения в статье верны.

    Reply
  18. chemezov

    мне очень не хватало этой информации для понимания блокировок. огромное спасибо, +1.

    Reply
  19. USER--1C

    (18) hogik, Посмотрите дату статьи (2007 г.): http://www.lavelin.ru/index.php/articles/1s/18-razrabotka/93-blokirovki-dannyh-v-1spredpriyatii-8

    В конце указано: «Автор: © Белоусов Павел (Альтер Лого, Москва). Данная статья является фрагментом книги П.С.Белоусов, А.В.Островерх «1С:Предприятие: от 8.0 к 8.1». Дата выхода книги: ноябрь 2007.

    (Информация с ресурса http://1cexpo.ru)»

    На ИТС есть более свежие статьи по блокировкам, в том числе для 8.2. Например: от 18.08.2010 «Анализ и устранение взаимоблокировок» (для имеющих доступ на ИТС: http://www.its.1c.ru/db/metod81#content:4051:1)

    Reply
  20. hogik

    (21)

    «Посмотрите дату статьи (2007 г.)»(с)

    Информация устарела?

    Т.е. в (18) сообщении я ошибаюсь? 😉

    Reply
  21. rеd80
    Отличие исключительных блокировок от разделяемых в изложенных выше примерах в том, что при разделяемом режиме блокировок возможны разделяемые блокировки при параллельном проведении других документов по тем же полям источников данных, что и в заблокированных в данном документе данных.

    Не понял о чем это. Для меня понятна следующая разница:

    В режиме разделяемых блокировок блокированные записи остаются доступны для чтения другим пользователям и недоступны для записи.

    В режиме исключительных блокировок блокированные записи недоступны для чтения другим пользователям и недоступны для записи.

    Reply
  22. mihan

    (1) Hany,

    блокировать старые записи имхо перестраховка, другой документ итоги вроде не должен поменять по нормальному, он же будет считывать остаток чтобы в минус не уйти, а считать не сможет, так как одна из строк таблицы итогов эксклюзивно заблокирована первым документом

    Reply
  23. zigomodo

    Столкнулся с данной проблемой, статья очень кстати.

    Reply
  24. ZLENKO

    В настоящее время подходы, изложенные в статье, потеряли актуальность. Появились более прогрессивные подходы по использованию управляемых блокировок при проведении документов. Вот это больше соответствует современным реалиям http://infostart.ru/public/195591/

    Reply
  25. mr.Kot

    Хорошо структурирован и подан текст, всё становится понятно. Жаль, что первый комментарий в статье так и не учли. А я как знал, что в коментах обязательно что-нибудь дельное промелькнёт.

    Reply
  26. tiniji

    Правильно ли я понимаю?

    Если включить управляемые блокировки в УТ 10.3 для всей конфигурации (т.е. будут все объекты с упр. блокировками), то необходимо добавить блокировки на регистр ВзаиморасчетыСКонтрагентами (при контроле долга). На регистры товаров (НТТ, Розница, опт, организаций) при контроле остатков. И Регистры «Партии товаров», т.к. списание происходит по ФИФО. Регистры НДС не беру, т.к. ими не пользуемся.

    Нужно ли кроме этого управлять блокировками других объектов? Журналы, последовательность и др.

    Спрашиваю заранее, что бы не набивать шишки при переходе.

    Reply
  27. Alex123456

    Спасибо за статью. Как раз надо решить проблему с блокировками.

    Reply
  28. monstruz

    Спасибо. Полезно.

    Reply
  29. Nigelist

    Подскажите в в каких регистрах можно использовать управляемые блокировки? В регистрах накопления, сведений, бухгалтерии? Периодических и прочих регистрах?

    Reply
  30. nvv1970

    Различные тесты показали, что управляемые блокировки в 8.2 — это полная неадекватность. В 8.3 поведение вполне адекватное, за исключением некоторых особенностей.

    Reply
  31. ZLENKO

    (32) nvv1970, «Различные тесты показали, что управляемые блокировки в 8.2 — это полная неадекватность.»

    Думаю Вы просто не до конца разобрались в вопросе. В последних релизах 8.2 вполне адекватно работают.

    С чем именно у Вас возникли сложности ? Просто «полного счастья» с управляемыми блокировками при использовании MS SQL Server можно добиться только при переводе базы в режим версионирования (а не блокировщика), а для 8.2 это не «штатный» режим, хотя все отлично работает.

    Reply
  32. ZLENKO

    (28) tiniji, «Спрашиваю заранее, что бы не набивать шишки при переходе.»

    Чтобы не набить «шишки» Вам необходимо досконально разобраться в вопросах, связанных с управляемыми блокировками. Вам необходимо понимать что у Вас есть сейчас и что Вы хотите получить в результате. Данная статья просто описывает механизмы платформы. К практике использования управляемых блокировок в реальных конфигурациях она отношения не имеет. Поймите что нет «серебряной пули» для борьбы с избыточными блокировками.

    Reply
  33. ZLENKO

    Цитата из кода статьи: «Движения.ОстаткиНоменклатуры.Записать(); »

    Никогда так не поступайте — это прямой путь к взаимоблокировкам !

    Reply
  34. alex44ru

    Спасибо за статью, все понятно написано.

    Меня смутил ответ Максим Радченко, 1С на форуме http://devtrainingforum.v8.1c.ru/forum/thread.jsp?id=572655&threadtype=0, а именно:

    ………………..

    Блокировка = Новый БлокировкаДанных;
    ЭлементБлокировки = Блокировка.Добавить(«РегистрНакопления.ТоварыНаСкладах»);
    ЭлементБлокировки.УстановитьЗначение(«Качество», Справочники.Качество.НайтиПоКоду(«1»));
    ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
    ЭлементБлокировки.ИсточникДанных = ДокументОбъект.ВозвратнаяТара;
    ЭлементБлокировки.ИспользоватьИзИсточникаДанных(«Номенклатура», «Номенклатура»);
    ЭлементБлокировки.ИспользоватьИзИсточникаДанных(«Склад», «Склад»);
    Блокировка.Заблокировать();

    ………………..

    Блокировка будет наложена на те записи, в которых:

    — есть номенклатура из табличной части ВозвратнаяТара и Качество равно указанному значению,

    или

    — есть склад из табличной части ВозвратнаяТара и Качество равно указанному значению.

    Если нужно блокировать только по сочетанию значений Номенклатура — Склад, которые есть в табличной части, нужно использовать один оператор ИспользоватьИзИсточникаДанных, указывая в нем два поля через запятую.

    из его ответа следует что у Вас в пятом примере будет блокировка на номенклатуру или на свойство, помогите разобраться кто прав ?

    Reply
  35. Firefox27

    Чтоб избавмтса от блокировок чаще используйте запроси для получения данных. И как можна менше получайте реквизиты объектов через точку.

    Reply
  36. ZLENKO

    (37) Firefox27, «И как можна менше получайте реквизиты объектов через точку.»

    Чем быстрее (меньше длительность транзакции) проводятся документы, тем меньше вероятность возникновения блокировки.

    Reply
  37. Sanya2049

    Пытаю воспроизвести нечего не выходит

    Блокировка = Новый БлокировкаДанных;
    ЭлементБлокировки = Блокировка.Добавить(«РегистрНакопления.ОстаткиНоменклатуры»);
    ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
    ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры;
    ЭлементБлокировки.ИспользоватьИзИсточникаДанных(«Номенклатура», «Номенклатура»);
    Блокировка.Заблокировать();
    

    Ошибка при выполнении обработчика — ‘ОбработкаПроведения’

    по причине:

    {Документ.РасходнаяНакладная.МодульОбъекта(18)}: Ошибка при вызове метода контекста (Заблокировать)

    Блокировка.Заблокировать();

    по причине:

    Использование блокировки допустимо только внутри транзакции в режиме управляемых блокировок!

    Reply
  38. azhilichev

    (39) Sanya2049, Проверьте, что у вас документ находится в режиме управляемых блокировок:

    Reply
  39. fzt

    (36) alex44ru, возьми да проверь)

    Reply
  40. kuzyara

    (1)

    1) блокируются данные по «очищаемым» записям (т.е. тем, по которым были движения до перепроведения документа, ведь их тоже надо блокировать, чтобы в случае отмены транзакции гарантировать * (отказ от проведения и возврат к предыдущим проводкам));

    боже, какой бред

    Reply
  41. nytlenc

    (42) Согласен…. Оптимизм у автора комментария явно страдает.

    Reply
  42. sokir

    (42) в чем же бред? Как бы все верно.

    (43) тоесть если написано без оптимизма — значит не верно? Странная логика.

    Reply
  43. nytlenc

    (44) оптимизм тут не причем. Читайте про оптимистические блокировки

    Reply
  44. Xershi

    В справочнике характеристик завели доп. реквизит порядковый номер. Он должен быть уникальный, генерируется вычислением максимального значения этого реквизита с добавлением +1.

    Чтобы исключить его дублирование при программном создании элементов написал такую блокировку:

    Блокировка = Новый БлокировкаДанных;
    ЭлементБлокировки = Блокировка.Добавить(«Справочник.ХарактеристикиНоменклатуры»);
    ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
    Блокировка.Заблокировать();

    Если есть решение лучше, то было бы хорошо это озвучить и добавить в статью!

    В конфигурации режим управления блокировками управляемый стоит. И данный код должен быть в транзакции, иначе у меня в ошибку выбивало на

    Блокировка.Заблокировать()
    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *