Автор Тема: Блокировки и режим разделения итогов регистров  (Прочитано 38176 раз)

0 Пользователей и 1 Гость просматривают эту тему.

nodalt

  • Новичок
  • *
  • Сообщений: 0
  • ФИО: Копейкин Дмитрий Николаевич
Возник вопрос по поводу установки блокировок на регистры накопления и бухгалтерии, после того как в лекциях Павла Белоусова увидел такой вот код:

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

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

 Кто хорошо знаком с блокировками, объясните пожалуйста зачем здесь два приёма блокировки?
 Читал про блокировки статьи на ИТС и с документацией знаком, но то ли давно это было, то ли просто запутался…
 Хочу ещё раз от знающих людей услышать какой метод и когда надо использовать чтобы сравнить со своими представлениями о блокировках.

sv_mikh

  • Новичок
  • *
  • Сообщений: 0
  • ФИО: Михайлов Сергей Валерианович
Блокировки и режим разделения итогов регистров
« Ответ #1 : Апрель 18, 2012, 11:47:52 am »
Лично мне не понятно зачем это нужно.
 
Quote (nodalt)
Движения.ОстаткиНоменклатуры.БлокироватьДляИзменения = Истина;  
 Движения.ОстаткиНоменклатуры.Записать();        

 Здесь очищаются движения документа по ОстаткиНоменклатуры и устанавливается блокировка на пустой набор измерений. Т.е. ничего не блокируется. Зачем?
 Ну а дальше обычная управляемая блокировка на указанные поля пространства блокировок.
 Кстати сказать у NikZagVit (могу ошибаться) были такие последовательности.. Я тоже удивлялся к чему бы это.


nodalt

  • Новичок
  • *
  • Сообщений: 0
  • ФИО: Копейкин Дмитрий Николаевич
Блокировки и режим разделения итогов регистров
« Ответ #2 : Апрель 18, 2012, 11:53:10 am »
sv_mikh,
 В общем, я сам так понимаю ...
 Метод Записать() очищает старые движения документа и как вы сказали блокирует пустой набор, но одновременно с этим ещё игнорирует режим разделение итогов.
 Затем накладывается, так сказать "ручная", блокировка на нужные данные.
 В этом случае всё логично.
 Но в литературе я читал, что при ручной блокировке режим разделения итогов тоже игнорируется. Выходит врали?

crabzzy

  • Новичок
  • *
  • Сообщений: 6
  • ФИО: Alexander
Блокировки и режим разделения итогов регистров
« Ответ #3 : Апрель 18, 2012, 01:02:03 pm »
я склоняюсь к тому, что строки

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


 не нужны, если дальше ручная идёт блокировка
« Последнее редактирование: Апрель 18, 2012, 01:03:42 pm от Alexander »

nodalt

  • Новичок
  • *
  • Сообщений: 0
  • ФИО: Копейкин Дмитрий Николаевич
Блокировки и режим разделения итогов регистров
« Ответ #4 : Апрель 18, 2012, 01:14:10 pm »
Я тоже всегда к этому склонялся, но боюсь что авторитет и опыт Белоусова рушат эти склонности. Не знаю теперь что думать. Может кто-нибудь прояснит картину окончательно и бесповоротно?

sv_mikh

  • Новичок
  • *
  • Сообщений: 0
  • ФИО: Михайлов Сергей Валерианович
Блокировки и режим разделения итогов регистров
« Ответ #5 : Апрель 18, 2012, 01:32:25 pm »
Quote (nodalt)
о в литературе я читал, что при ручной блокировке режим разделения итогов тоже игнорируется

 Приведите ссылку. Самому интересно.

Добавлено (18.04.2012, 13:32)
---------------------------------------------

Quote (nodalt)
в лекциях Павла Белоусова увидел такой вот код:

 Что за лекции, можно ли их увидеть. Может это подстава? Такое реально. Методичка к "Сквозной пример решения задач" содержит не одну подставу и это сделана как говорят специально...

nodalt

  • Новичок
  • *
  • Сообщений: 0
  • ФИО: Копейкин Дмитрий Николаевич
Блокировки и режим разделения итогов регистров
« Ответ #6 : Апрель 18, 2012, 03:04:31 pm »
sv_mikh,
Quote (sv_mikh)
в литературе я читал, что при ручной блокировке режим разделения итогов тоже игнорируется

 по этому поводу ссылку дать не могу, т.к. читал всего много и не только в официальной документации - так что здесь возможно у меня просто сложилось общее мнение благодаря как вы говорите какой-нибудь "подставе".
 А лекции - это "Конфигурирование платформы "1С:Предприятие 8.2" (курс подготовки к экзамену "1С:Специалист" по платформе "1С:Предприятие 8.2"). Дело в том, что в конце прошлого года был на курсе Павла Белоусова, посвященному аттестации 1С:Специалист по платформе (очень понравилось). На тот момент задачи ещё не решал и вопросов не возникло по этому поводу и вроде бы всё было понятно. К сожалению после этого пришлось забросить подготовку а прорешивать задачи все подряд и как следует стал только сейчас.
 Вот Gyd на этот счет мудрее поступает - сначала порешал, а теперь может вопросы задать и до конца всё прояснить smile

Gyd

  • Новичок
  • *
  • Сообщений: 0
  • ФИО: Олег
Блокировки и режим разделения итогов регистров
« Ответ #7 : Апрель 18, 2012, 04:39:15 pm »
У меня уже был опыт "сначала курсы потом задачи", в этот раз решил наоборот попробовать. Из минусов думаю только один: до всего приходится доходить своим умом, что вызывает задержки по времени.

 Был еще вариант пройти каждую компоненту отдельно на дистанционных курсах УЦ-3. Но что-то не захотелось, хотя там неплохой уровень подготовки дают. Думаю таким образом я бы уже давно сдал smile но решил всё сам пройти.

nodalt

  • Новичок
  • *
  • Сообщений: 0
  • ФИО: Копейкин Дмитрий Николаевич
Блокировки и режим разделения итогов регистров
« Ответ #8 : Апрель 19, 2012, 09:07:58 am »
sv_mikh, crabzzy, я разобрался наконец с блокировками.
 Привожу фрагмент моей переписки на другом форуме. Человек очень доходчиво объяснил этот момент =)

 Я:
 Возник вопрос по поводу установки блокировок на регистры накопления и бухгалтерии, после того как в лекциях Павла Белоусова увидел такой вот код:
 
Code
Движения.ОстаткиНоменклатуры.БлокироватьДляИзменения = Истина;    
 Движения.ОстаткиНоменклатуры.Записать();           

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

 ...

 Ответ:
 При записи "пустого" набора движений нужно блокировать записи по "Удаляемым" данным (если они были в случае перепроведения), чтобы гарантировать при откате транзакции неизменность итогов

 Я:
 Честно говоря, не понял. Не могли бы вы на примере объяснить?
 Я себе так представляю:
 На складе Основной есть Товар1 в количестве 1 шт.
 Расходной накладной мы списываем этот товар в количестве 1 шт. со склада Основной. Всё хорошо проводится.
 При перепроведении у нас сначала записывается пустой набор в регистр, т.е. очищаем старые движения и на складе Основной опять появляется 1 шт.
 Затем устанавливаем ручную блокировку на склад Основной и Товар1.
 Читаем остатки - получаем остаток 1 шт.
 И списываем. Опять всё хорошо проводится.
 Если мы при перепроведении списываем не 1 шт. а больше, то после чтения остатков понимаем что не хватает и отказываемся от проведения документа.
 Т.е. в итоге документ не проведен, в остатке 1 шт. Товара1 на складе Основной. Опять всё правильно.
 Зачем тут
 
Code
БлокироватьДляИзменения

 ?
 Может я неправильно рассуждаю?

 Ответ:
 Ок, а как тебе такая версия:
 Допустим: в уже имеющемся проведённом документе "Реализация" продан товар "стул" в количестве одна штука, при этом на складе их ноль штук.
 Затем пользователь заходит в документ и меняет, "стул" на "кресло". Далее нажимает кнопку провести, и запускается обработка проведения.
 В момент выполнения строки: Записать() движение в регистре с позицией "стул" очищается и запишется в базу данных, в результате на остатке на складе появится одна позиция "стул".
 Далее внутри тойже обработки проведения наложится блокировка на "кресло" и начнётся транзакция.
 При этом, по скольку на складе появился один незаблокированный "стул" на остатке, другой пользователь в это время возьмёт и побыстрому проведёт, этот "стул" в другом документе "реализация" и на складе станет ноль позицый "стул".
 Затем уже в нашем документе, при попытке списать заменённый стул на кресло, произошла какая-то ошибка, и мы решили откатить транзакцию. т.е. "стул" возвращается на место.
 И в результате таких действий, стул будет в количестве "минус один" на складе.
 Вот для того, чтобы такого не произошло, нужно заблокировать, не только новые позиции, но и старые которые были в документе, до момента окончания текущей транзакции записи, до тех пор, пока мы не будем точно уверены, что не планируется её откат.
 PS: надеюсь, так понятно, для чего нужна доп. блокировка старых позиций документа? :)))

sv_mikh

  • Новичок
  • *
  • Сообщений: 0
  • ФИО: Михайлов Сергей Валерианович
Блокировки и режим разделения итогов регистров
« Ответ #9 : Апрель 19, 2012, 09:14:54 am »
Quote (nodalt)
Далее внутри тойже обработки проведения наложится блокировка на "кресло" и начнётся транзакция.

 Обработка проведения уже открывается в транзакции...

 И все же... Записать() в начале записывает именно ПУСТОЙ набор данных. А не заполненный старыми движениями... А если он пустой то и блокировка накладывается на ПУСТОЙ набор данных по его пустым измерениям... Как же заблокируется стул, если его там нет???

nodalt

  • Новичок
  • *
  • Сообщений: 0
  • ФИО: Копейкин Дмитрий Николаевич
Блокировки и режим разделения итогов регистров
« Ответ #10 : Апрель 19, 2012, 09:44:57 am »
Quote (sv_mikh)
Обработка проведения уже открывается в транзакции...

 это да.

 
Quote (sv_mikh)
Как же заблокируется стул, если его там нет???

 Записывается пустой набор, но с отбором по РЕГИСТРАТОРУ!
 Соответсвенно заблокируются все записи документа.

sv_mikh

  • Новичок
  • *
  • Сообщений: 0
  • ФИО: Михайлов Сергей Валерианович
Блокировки и режим разделения итогов регистров
« Ответ #11 : Апрель 19, 2012, 09:47:16 am »
Quote (nodalt)
Записывается пустой набор, но с отбором по РЕГИСТРАТОРУ!
 Соответсвенно заблокируются все записи документа.

 Да заблокируются, но причем тут стулья? В пустом наборе нет записей.
« Последнее редактирование: Апрель 19, 2012, 09:47:46 am от Михайлов Сергей Валерианович »

nodalt

  • Новичок
  • *
  • Сообщений: 0
  • ФИО: Копейкин Дмитрий Николаевич
Блокировки и режим разделения итогов регистров
« Ответ #12 : Апрель 19, 2012, 10:17:26 am »
Мы наверное не понимаем друг друга ...
 Объясню как я вижу ситуацию.
 Заблокируется конечно не конкретный стул во всем регистре, так чтобы его нельзя было продавать, а заблокируется запись в регистре с полем Регистратор и продаваемым количеством, чтобы другой пользователь смог продать не больше чем есть остатков в регистре. Т.е. если до перепроведения было 3 стула в остатке, а в документе мы продавали 2, то другой пользователь во время работы нашей транзакции, как бы она не закончилась, сможет продать только 1 стул.

Добавлено (19.04.2012, 10:17)
---------------------------------------------
В общем суть в том, что изначально код правильный и Свойство БлокироватьДляИзменения здесь нужно устанавливать.

« Последнее редактирование: Апрель 19, 2012, 10:14:55 am от Копейкин Дмитрий Николаевич »

sv_mikh

  • Новичок
  • *
  • Сообщений: 0
  • ФИО: Михайлов Сергей Валерианович
Блокировки и режим разделения итогов регистров
« Ответ #13 : Апрель 19, 2012, 10:31:32 am »
Quote (nodalt)
В общем суть в том, что изначально код правильный и Свойство БлокироватьДляИзменения здесь нужно устанавливать.

 Пока не убедили. Нужны более весомые объяснения, чем ответ в другом форуме.

 Заглянем в сборник задач. Конкретно в базу с решенным примером. Документ РасходнаяНакладная, модуль проведения, начало:

 
Code
Процедура ОбработкаПроведения(Отказ, Режим)
  //Установим флаг возможности записи
  Движения.ОстаткиНоменклатуры.Записывать = Истина;
  Движения.Продажи.Записывать = Истина;
  Движения.Управленческий.Записывать = Истина;
   
  // Получим данные по учетной политике из периодического регистра сведений
  ТекущаяПолитика = РегистрыСведений.УчетнаяПолитика.ПолучитьПоследнее(Дата).Значение;
  Если ТекущаяПолитика = Перечисления.УчетнаяПолитика.ЛИФО Тогда
   ПорядокПартий = "УБЫВ";
  Иначе
   ПорядокПартий = "ВОЗР";
  КонецЕсли;
   
  //Установим исключительную блокировку на те записи регистров, по которым осуществляется чтение, а потом - запись
  Блокировка = Новый БлокировкаДанных;
  ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры");
  ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
  ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры;
  ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура");
    
  ЭлементБлокировки = Блокировка.Добавить("РегистрБухгалтерии.Управленческий");
  ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
  ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры;
  ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Субконто1", "Номенклатура");
 
      

 Насколько я понимаю, автор написанного Павел Белоусов. Мне кажется комментарии излишне.
« Последнее редактирование: Апрель 19, 2012, 10:36:25 am от Михайлов Сергей Валерианович »

nodalt

  • Новичок
  • *
  • Сообщений: 0
  • ФИО: Копейкин Дмитрий Николаевич
Блокировки и режим разделения итогов регистров
« Ответ #14 : Апрель 19, 2012, 10:40:40 am »
Дело конечно ваше. Я не убеждаю - вдруг окажется всё это неправдой, я же не разработчик платформы smile
 Моя цель - узнать истину. Мы приводим аргументы, вы - свои, я - свои. Помоему я привел достаточно примеров и аргументов, кроме того это отрывок кода из лекций преподавателя Учебного центра 1С. Кому как не им верить? smile