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

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

nodalt

  • Новичок
  • *
  • Сообщений: 0
  • ФИО: Копейкин Дмитрий Николаевич
Блокировки и режим разделения итогов регистров
« Ответ #30 : Апрель 23, 2012, 05:30:17 pm »
safer, спасибо за информацию

crabzzy

  • Новичок
  • *
  • Сообщений: 6
  • ФИО: Alexander
Блокировки и режим разделения итогов регистров
« Ответ #31 : Апрель 26, 2012, 04:37:04 pm »
nodalt, не, там не я (не fisher)

 спасибо за инфу! надо всё же так писать!


gosn1ck

  • Новичок
  • *
  • Сообщений: 5
  • ФИО: gosn1ck
Блокировки и режим разделения итогов регистров
« Ответ #32 : Апрель 27, 2012, 02:05:24 pm »
вот что говорит по этому поводу Павел Чистов с тренинга http://mg.spec8.ru
 1) если сначала читаем данные из регистра, то нужно использовать объект "Блокировка Данных"
 2) если сначала пишем записи в регистр, а потом анализируем регистр - можно использовать "Блокировать изменения" - далее система сама поймёт, что и когда ей нужно заблокировать в регистре

sv_mikh

  • Новичок
  • *
  • Сообщений: 0
  • ФИО: Михайлов Сергей Валерианович
Блокировки и режим разделения итогов регистров
« Ответ #33 : Апрель 27, 2012, 02:27:45 pm »
Quote (gosn1ck)
вот что говорит по этому поводу Павел Чистов с тренинга http://mg.spec8.ru
 1) если сначала читаем данные из регистра, то нужно использовать объект "Блокировка Данных"
 2) если сначала пишем записи в регистр, а потом анализируем регистр - можно использовать "Блокировать изменения" - далее система сама поймёт, что и когда ей нужно заблокировать в регистре

 С этого то мы и начинали...

ТатьянаЯ

  • Новичок
  • *
  • Сообщений: 0
  • ФИО: Зубкова Татьяна Юрьевна
sv_mikh, я посмотрела у тебя в решении вот такие строки:
       БД = Новый БлокировкаДанных;
       
       ЭлементБД = БД.Добавить("РегистрНакопления.ОстаткиНоменклатуры");
       ЭлементБД.ИсточникДанных = СписокНоменклатуры;
       ЭлементБД.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура");
       ЭлементБД.УстановитьЗначение("Подразделние", Справочники.Подразделения.ОтделЗакупок);
       
       ЭлементБД = БД.Добавить("РегистрНакопления.ОстаткиНоменклатуры");
       ЭлементБД.ИсточникДанных = СписокНоменклатуры;
       ЭлементБД.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура");
       ЭлементБД.УстановитьЗначение("Подразделние", Подразделение);
       
       БД.Заблокировать();

 У меня задача была другая, но я тоже написала два раза БлокировкаДанных, мне в результате в списке ошибок написали "При описании блокировок каждое пространство блокируется индивидуально". Что им надо было написать?

sv_mikh

  • Новичок
  • *
  • Сообщений: 0
  • ФИО: Михайлов Сергей Валерианович
Quote (ТатьянаЯ)
У меня задача была другая, но я тоже написала два раза БлокировкаДанных, мне в результате в списке ошибок написали "При описании блокировок каждое пространство блокируется индивидуально". Что им надо было написать?

 sad Не могу ничего сказать.. Мне казалось, что это вполне естественно. Возможно нужно было скомпоновать все необходимые данные в результат запроса. Я не сталкивался с такой ошибкой. Скажу больше, что в дистанционном тренинге по опер.учету от УЦ3 Андрей Габец использовал в аналогичной ситуации подобную же конструкцию.

nodalt

  • Новичок
  • *
  • Сообщений: 0
  • ФИО: Копейкин Дмитрий Николаевич
ТатьянаЯ,
 пространство блокировок получается при использовании метода
Code
Добавить()

 В вашем коде переменной
Code
ЭлементБД
присваивается одно и тоже пространство два раза и описывается два раза. Таким образом, на самом деле заблокируется только вторая часть. Надо было во второй части использовать другую переменную, например
Code
ЭлементБД_1
.
 Однако, я могу ошибаться ... Движения записываются по такому же принципу и прокатывает ...
« Последнее редактирование: Май 19, 2012, 09:50:14 am от Копейкин Дмитрий Николаевич »

shlaev

  • Новичок
  • *
  • Сообщений: 1
  • ФИО: Kirill
Поставил MSSQL, решил опробовать блокировки, включил везде управляемый режим и поставил использовать разделение итогов у регистра остатков. В расходной накладной написал такой код:

 
Код
Для Каждого Строка Из Товары Цикл

    Движение = Движения.Остатки.ДобавитьРасход();

    Движение.Период = Дата;

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

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

   КонецЦикла;

 Движения.Остатки.Записать();


 В конце обработки проведения поставил точку останова и зациклил один сеанс. (Форма документа не открывал, а провел из списка). Запустил другой сеанс и провел документ с таким же товаров (тоже из списка документов). Второй документ провелся. Но, если проводить оба документа из формы документа, то при попытке проведения второго документа, вылазит ошибка блокировки транзакции. Почему она вылазит только при проведении из формы? Какие там блокировки и на что накладываются?

 Добавлено (20.05.2014, 23:34)
 ---------------------------------------------
 Второй вопрос. Тот же самый код. Так же зацикливаю один документ в конце обработки проведения. Отменяю проведение другого документа - вылазит опять конфликт блокировок. Что там при отмене проведения такого конфликтует, если никаких блокировок небыло наложено?

 А в файловом варианте как блокировать? Ставить режим блокировок "автоматический" и использовать запросы с инструкцией "ДЛЯ ИЗМЕНЕНИЯ"?
« Последнее редактирование: Май 21, 2014, 12:37:56 am от Kirill »

unf13

  • Пользователь
  • **
  • Сообщений: 23
  • ФИО: unf13
Блокировки и режим разделения итогов регистров
« Ответ #38 : Сентябрь 10, 2014, 04:02:26 pm »
Цитата
На сдаче экзамена оба экзаменатора за этот флаг драли. Если в регистре стоит разделение итогов - при очистки движений нужно флаг возводить в ИСТИНА. До экзамена такой же ответ получил от Гилёва ( но без объяснений) =(((. Белоусов объяснял так же, как nodalt .
 Ценная инфа, спасибо.  Получается, что несмотря на то,что мы при очистке движений записываем пустой набор и в нем соответственно, не содержатся комбинации измерений для блокировки, мы все равно используем флаг БлокироватьДляИзменения  с целью отключения разделителя итогов по всем записям с отбором по регистратору, как писал nodalt:

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

Добавлено (09.09.2014, 19:30)
---------------------------------------------
А раньше я все не понимал, ведь набор то пустой, записей для блокировки НЕТ.  Но отбор по регистратору присутствует и плюс отключаем разделитель.

Добавлено (10.09.2014, 16:02)
---------------------------------------------
Коллеги, на тему топика есть "маст-рид" статья Павал Чистова: http://1c.chistov.pro/2013/07/blog-post_25.html

 Интересно,что в качестве момента получения итогов для второго запроса Павел использует МоментВремени():

 

Код
Запрос.УстановитьПараметр("ТочкаИтоговДляСебестоимости", МоментВремени());


 хотя, когда проходил курс у него, он использовал такую конструкцию (которую, кстати, часто вижу в в выкладываемых на форуме решениях задач):

 
Код
Запрос.УстановитьПараметр("ТочкаИтоговДляСебестоимости", ?(Режим = РежимПроведенияДокумента.Оперативный,Неопределено,МоментВремени()));

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

 Как считаете, в чем может быть дело? Я задал вопрос в комментариях к статье,но ответа не получил  sad

 Какую конструкцию использовать на экзамене, как вы считаете?

Ran

  • Новичок
  • *
  • Сообщений: 2
  • ФИО: Ran
Блокировки и режим разделения итогов регистров
« Ответ #39 : Сентябрь 10, 2014, 08:04:13 pm »
unf13, думаю, правильнее так:
 Запрос.УстановитьПараметр("ТочкаИтоговДляСебестоимости", ?(Режим =
 РежимПроведенияДокумента.Оперативный,Неопределено,МоментВремени()));

 Если руководствоваться желтым учебником от 1с по крайней мере... Там сказано, что смысл оперативного проведения (в числе прочего) в том, что вводимый сейчас документ - последний по хронологии (за это отвечает механизм оперативной отметки времени), то есть можно смело брать последние актуальные итоги. Если использовать при этом МоментВремени, то посчитает тоже правильно, но будет менее производительно (системе придется досчитывать итоги до момента времени)

unf13

  • Пользователь
  • **
  • Сообщений: 23
  • ФИО: unf13
Блокировки и режим разделения итогов регистров
« Ответ #40 : Сентябрь 11, 2014, 11:17:18 am »
Ran, я тоже так всегда думал, но почему у Павла в статье по другому? Странно.

nvv

  • Пользователь
  • **
  • Сообщений: 13
Re: Блокировки и режим разделения итогов регистров
« Ответ #41 : Февраль 10, 2015, 08:31:47 am »
<b>unf13</b>, думаю, правильнее так:
 Запрос.УстановитьПараметр("ТочкаИтоговДляСебестоимости", ?(Режим =
 РежимПроведенияДокумента.Оперативный,Неопределено,МоментВремени()));

 Если руководствоваться желтым учебником от 1с по крайней мере... Там сказано, что смысл оперативного проведения (в числе прочего) в том, что вводимый <b>сейчас</b> документ - последний по хронологии (за это отвечает механизм оперативной отметки времени), то есть можно смело брать последние актуальные итоги. Если использовать при этом МоментВремени, то посчитает тоже правильно, но будет менее производительно (системе придется досчитывать итоги до момента времени)

При оперативном ПЕРЕпроведении проверьте какие получаются остатки и все станет ясно.
Например, имеем проведенный документ-расход на 10:00:00. Если просто читать остатки на моментвремени() этого документа, то списание в остатках не учитывается. Если читать остатки в момент оперативного проведения, то моментвремени() перескакивает вперед (напрмер, на 10:37:00), НО остатки на этот момент БУДУТ ВКЛЮЧАТЬ И ЗАПИСИ документа.
Это легко проверить самому и не ждать ответов с форумов. Вот такая особенность.

lagunovartur

  • Новичок
  • *
  • Сообщений: 1
Такс нужно ап! Очень нужно ап! Две недели тупо читаю про долбанные блокировки по началу не понимал ничего, сейчас напишу то что осталось в  голове , пожалуйста прокомментируйте.

Первый случай когда надо использовать Движения.ОстаткиТоваров.БлокироватьДляИзменения=Истина;

Старая методика проведения:
Движения.ОстаткиТоваров.БлокироватьДляИзменения=Истина;  :o :'(
Движения.ОстаткиТоваров.Записать();

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

Перепроводим существующий документ.
Такс устанавливаем блокировку... Блокируем Что? Регистр. По какому набору записей??? ФИГ знает толи по пустому толи по старому, а истина где то там--------------->...... НО в народе говорят что лучше написать, баллы на экзамене не лишние)). Например: регистр остатки товаров пустой и есть расходная (номенклатура:стол, количество: 1). Заходит пользователь и меняет стол на стул жмет Окей и ждет пока закончится транзакция , в этот момент второй юзер тем же документом расходная видит ага появился стол, щас спишу  и списывает. Обидно но транзакция не увенчалась успехом и мы ее отменили. В итоге столы полетели в минуса , вместе с баллами на экзамене. Чтоб такого не случилось пишем Движения.ОстаткиТоваров.БлокироватьДляИзменения=Истина;, тем самым блокируем регистр по старому набору записей.(<-------------здесь я вообще не уверен блин!!! ХЭЛП!). В итоге второй юзер вместе со своей расходной попадает в очередь, а потом получает отказ. Счастлив экзаменатор, сдающий, целы баллы).

Второй случай когда надо использовать Движения.ОстаткиТоваров.БлокироватьДляИзменения=Истина;

Новая методика проведения , у регистра накопления стоит свойство (в значение истина), разделять итоги.  В таблицу итогов попадает разделитель который позволяет писать данные нескольким документам у которых одинаковый набор записей (например приходная накладная не должна стоять в очереди), НО гадкий разделитель попадает в блокировку при внесении записей списания. Например проводим одновременно: расходная 1 (блокируем Номенклатура: стол, склад:основной, разделитель1), расходная 2(блокируем Номенклатура: стол, склад:основной, разделитель2). Потом начинаем читать и тут  :o. Расходная 1 заблокировала данные позиции и расходная 2 тоже, только по разным разделителям, а читаем остатки мы по всем позициям в целом, в итоге ловим deallock.
Чтоб такого не получилось пишем злополучное Движения.ОстаткиТоваров.БлокироватьДляИзменения=Истина; отключаем разделитель и вторая расходная попадает  в очередь, таким образом первая спокойно все читает и мы радуемся.
« Последнее редактирование: Апрель 27, 2015, 08:34:51 am от lagunovartur »

ksandr

  • Проверенный
  • ***
  • Сообщений: 138
  • ФИО: ksandr
Ну все правильно Вы понимаете, ну или я тоже так понимаю:)

z4z4z

  • Новичок
  • *
  • Сообщений: 3
  • ФИО: Константин
вроде еще и  так надо!

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