Какие есть способы писать движения в регистр при проведении документа? #810310


#0 by DTX 4th
Обычно делаю так: Можно ли делать это как-то иначе, и как правильно?
#1 by vicof
А зачем ты их два раза записываешь?
#2 by vicof
Почитай статейку про новую методику проведения, там все разжевано
#3 by Borteg
насколько я помню они запишутся всеравно 1 раз, так как при выходе из обработчика проведения, пишутся только те записи у которых есть признак модифицированности.
#4 by DTX 4th
Новой методикой периодиски пользуюсь. Т.е. если не нужно читать измененные данные, то можно убрать Движения.Рег.Записать? Видимо, оттуда и засело в голове, что надо записать. Или с типовыми механизмами что-то не поделил.
#5 by vicof
"Начнем с последнего: Движения.ОстаткиТоваров.Записать; Этот способ безусловно запишет данные в регистр накопления. Но при этом флаг "Записывать" у набора записей снят не будет. Но это ерунда, главное тут то, что при большом количестве наборов записей у документа нам придется самостоятельно контролировать что в каком порядке в базу пишется, это может (да что там "может", точно скажется) негативно сказаться на проблеме взаимных блокировок (DeadLock), когда одна транзакция заблокирует таблицу А и будет ждать освобождения таблицы Б, а другая транзакция будет вести себя строго наоборот. теперь посмотрим как работает метод Движения.Записать; Метод записывает только те движения документа у которых установлен флаг "Записывать", при этом флаг в итоге снимается, что не приводит к повторной записи движений по окончании транзакции проведения. И главное, Движения.Записать; всегда записывают движения в том порядке в котором таблицы указаны в дереве метаданных, что на порядок уменьшает шансы взаимных блокировок, ведь все транзакции в одинаковом порядке блокируют таблицы."
#6 by Borteg
жесть какая-то написана. в управляемом режиме блокировок такое даже если захочешь не изобразишь
#7 by Borteg
в целом все зависит от того как у тебя проводятся документы. Ну и лучше писать не отдельные регистр, а или сразу все движения Движения.Записать, или вообще не использовать записать в обработчике проведения, она сама все проведет
#8 by Fragster
да не, там один раз, ибо при .Записать флаг системной записи при ЗапиыватьВыбранные или Модифицированные сбрасывается
#9 by Fragster
да запросто
#10 by Borteg
не представляю честно, при менеджером блокировок 1с, записать в регистр накопления где записи блокируются по регистратору одновременно блокировать записи по одному регистратору, так еще и с уровнем изоляции snapshot. Тоесть пишется в 2 транзакциях один и тот же документ?
#11 by Fragster
1с многопользовательская
#12 by Borteg
одновременно записывать один и тот же документ в 2 транзакциях? это шутка?
#13 by Fragster
не один и тот же. разные, но по пересекающимся наборам измерений.
#14 by DTX 4th
Раньше не понимал, зачем нужно свойство Записывать. Теперь понятно - при начале проведения там уже могут быть данные, которые не нужно записывать.
#15 by Borteg
Касательно написанного,там описан регистр накопления, у него будет 2 разных регистратора, следовательно измерения никак не пересекутся.
#16 by Borteg
Если там есть данные, которые не надо записывать и не указать конструкция записывать=истина, эти же данные и останутся, они даже не сотрутся.
#17 by DTX 4th
Что-то теперь и я запутался. Как происходит запись нескольких наборов? Поочередно блокируются регистры и происходит запись, после которой блокировка снимается? Если так, то про DeadLock в написана фигня.
#18 by DTX 4th
Подниму
#19 by DmitrO
Блокировка снимается только при завершении транзакции.
#20 by DTX 4th
Т.е. если документ пишет в два регистра, Регистр1 и Регистр2, то схема проведения будет иметь следующий вид? Разблокировка Регистр2 ?
#21 by Fragster
нет
#22 by DmitrO
да, думаю что даже при применении Движения.Записать; порядок будет такой.
#23 by DmitrO
А вообще, об этом почему-то никто не написал. Свойство Записывать у набора записей регистра придумано для применения в паре со свойством метаданных документа "Запись движений при проведении" и его значением "Записывать выбранные".
#24 by DmitrO
Сиськи мнете чета тут.. Ситуации и алгоритмы разные конечно бывают, но такой код: в общем случае не совсем нормальный. Если набор пишется явно, то Записывать = Истина; смысла не имеет.
#25 by Dmitrii
>> описан регистр накопления, у него будет 2 разных регистратора, следовательно измерения никак не пересекутся. Бред. Не пересекаются наборы в первичных таблицах (т.к. регистраторы разные). В таблицах итогов возможны пересечения. Сидят два менеджера и оба оформляют док-ты продажи одних и тех же товаров с одного и того же склада. У каждого свой документ. По набору измерений (склад и номенклатура) их наборы записей очень даже пересекутся. Так что, пока проводится документ первого менеджера, таблицы итогов будут заблокированы, а второй будет ждать пока блокировка не будет снята.
Тэги:
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С