Имя: Пароль:
1C
 
Какие есть способы писать движения в регистр при проведении документа?
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 разных регистратора, следовательно измерения никак не пересекутся.

Бред. Не пересекаются наборы в первичных таблицах (т.к. регистраторы разные). В таблицах итогов возможны пересечения.

Сидят два менеджера и оба оформляют док-ты продажи одних и тех же товаров с одного и того же склада. У каждого свой документ. По набору измерений (склад и номенклатура) их наборы записей очень даже пересекутся. Так что, пока проводится документ первого менеджера, таблицы итогов будут заблокированы, а второй будет ждать пока блокировка не будет снята.