|
Какие есть способы писать движения в регистр при проведении документа? | ☑ | ||
---|---|---|---|---|
0
DTX 4th
14.12.17
✎
13:49
|
Обычно делаю так:
Можно ли делать это как-то иначе, и как правильно? |
|||
1
vicof
14.12.17
✎
13:50
|
А зачем ты их два раза записываешь?
|
|||
2
vicof
14.12.17
✎
13:51
|
Почитай статейку про новую методику проведения, там все разжевано
|
|||
3
Borteg
14.12.17
✎
13:52
|
(1) насколько я помню они запишутся всеравно 1 раз, так как при выходе из обработчика проведения, пишутся только те записи у которых есть признак модифицированности.
|
|||
4
DTX 4th
14.12.17
✎
13:53
|
(2) Новой методикой периодиски пользуюсь. Т.е. если не нужно читать измененные данные, то можно убрать Движения.Рег.Записать()? Видимо, оттуда и засело в голове, что надо записать. Или с типовыми механизмами что-то не поделил.
|
|||
5
vicof
14.12.17
✎
13:58
|
"Начнем с последнего: Движения.ОстаткиТоваров.Записать(); Этот способ безусловно запишет данные в регистр накопления. Но при этом флаг "Записывать" у набора записей снят не будет. Но это ерунда, главное тут то, что при большом количестве наборов записей у документа нам придется самостоятельно контролировать что в каком порядке в базу пишется, это может (да что там "может", точно скажется) негативно сказаться на проблеме взаимных блокировок (DeadLock), когда одна транзакция заблокирует таблицу А и будет ждать освобождения таблицы Б, а другая транзакция будет вести себя строго наоборот.
теперь посмотрим как работает метод Движения.Записать(); Метод записывает только те движения документа у которых установлен флаг "Записывать", при этом флаг в итоге снимается, что не приводит к повторной записи движений по окончании транзакции проведения. И главное, Движения.Записать(); всегда записывают движения в том порядке в котором таблицы указаны в дереве метаданных, что на порядок уменьшает шансы взаимных блокировок, ведь все транзакции в одинаковом порядке блокируют таблицы." |
|||
6
Borteg
14.12.17
✎
14:04
|
(5) жесть какая-то написана. в управляемом режиме блокировок такое даже если захочешь не изобразишь
|
|||
7
Borteg
14.12.17
✎
14:14
|
(0) в целом все зависит от того как у тебя проводятся документы. Ну и лучше писать не отдельные регистр, а или сразу все движения Движения.Записать(), или вообще не использовать записать в обработчике проведения, она сама все проведет
|
|||
8
Fragster
гуру
14.12.17
✎
14:17
|
(1) да не, там один раз, ибо при .Записать() флаг системной записи при ЗапиыватьВыбранные или Модифицированные сбрасывается
|
|||
9
Fragster
гуру
14.12.17
✎
14:17
|
(6) да запросто
|
|||
10
Borteg
14.12.17
✎
14:25
|
(9) не представляю честно, при менеджером блокировок 1с, записать в регистр накопления где записи блокируются по регистратору одновременно блокировать записи по одному регистратору, так еще и с уровнем изоляции snapshot. Тоесть пишется в 2 транзакциях один и тот же документ?
|
|||
11
Fragster
гуру
14.12.17
✎
14:27
|
(10) 1с многопользовательская
|
|||
12
Borteg
14.12.17
✎
14:28
|
(11) одновременно записывать один и тот же документ в 2 транзакциях? это шутка?
|
|||
13
Fragster
гуру
14.12.17
✎
14:29
|
(12) не один и тот же. разные, но по пересекающимся наборам измерений.
|
|||
14
DTX 4th
14.12.17
✎
14:29
|
(2) Перечитал, знания освежил, спасибо
Раньше не понимал, зачем нужно свойство Записывать. Теперь понятно - при начале проведения там уже могут быть данные, которые не нужно записывать. |
|||
15
Borteg
14.12.17
✎
14:31
|
(13) Касательно написанного,там описан регистр накопления, у него будет 2 разных регистратора, следовательно измерения никак не пересекутся.
|
|||
16
Borteg
14.12.17
✎
14:32
|
(14) Если там есть данные, которые не надо записывать и не указать конструкция записывать=истина, эти же данные и останутся, они даже не сотрутся.
|
|||
17
DTX 4th
14.12.17
✎
16:57
|
(15) Что-то теперь и я запутался.
Как происходит запись нескольких наборов? Поочередно блокируются регистры и происходит запись, после которой блокировка снимается? Если так, то про DeadLock в (5) написана фигня. |
|||
18
DTX 4th
18.12.17
✎
10:38
|
Подниму
|
|||
19
DmitrO
18.12.17
✎
10:42
|
(17)Блокировка снимается только при завершении транзакции.
|
|||
20
DTX 4th
18.12.17
✎
10:54
|
(19) Т.е. если документ пишет в два регистра, Регистр1 и Регистр2, то схема проведения будет иметь следующий вид?
Блокировка Регистр1 Запись Регистр1 Блокировка Регистр2 Запись Регистр2 Разблокировка Регистр1 Разблокировка Регистр2 ? |
|||
21
Fragster
гуру
18.12.17
✎
10:55
|
нет
|
|||
22
DmitrO
18.12.17
✎
11:08
|
(20)да, думаю что даже при применении Движения.Записать(); порядок будет такой.
|
|||
23
DmitrO
18.12.17
✎
11:17
|
(0)А вообще, об этом почему-то никто не написал. Свойство Записывать у набора записей регистра придумано для применения в паре со свойством метаданных документа "Запись движений при проведении" и его значением "Записывать выбранные".
|
|||
24
DmitrO
18.12.17
✎
11:22
|
Сиськи мнете чета тут..
Ситуации и алгоритмы разные конечно бывают, но такой код: Движения.Рег.Записывать = Истина; ...// Добавляем движения Движения.Рег.Записать(); в общем случае не совсем нормальный. Если набор пишется явно, то Записывать = Истина; смысла не имеет. |
|||
25
Dmitrii
гуру
18.12.17
✎
12:02
|
(15) >> описан регистр накопления, у него будет 2 разных регистратора, следовательно измерения никак не пересекутся.
Бред. Не пересекаются наборы в первичных таблицах (т.к. регистраторы разные). В таблицах итогов возможны пересечения. Сидят два менеджера и оба оформляют док-ты продажи одних и тех же товаров с одного и того же склада. У каждого свой документ. По набору измерений (склад и номенклатура) их наборы записей очень даже пересекутся. Так что, пока проводится документ первого менеджера, таблицы итогов будут заблокированы, а второй будет ждать пока блокировка не будет снята. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |