Имя: Пароль:
1C
1С v8
Контроль остатков регистра после записи
0 vi0
 
09.03.14
19:37
Добрый день

В статье на ИТС есть описание контроля остатков после записи. Вопрос не по самой методике, а по одному пункту:

"В начале транзакции (например, в обработчике ОбработкаПроведения документа) в явном виде записать движения по всем регистрам, которые в данном случае НЕ требуют контроля остатков. Следует всегда придерживаться одинакового порядка записи регистров (например, алфавитного). Обратите внимание на то, что у всех записываемых регистров накопления и бухгалтерии должен быть включен разделитель итогов, а у наборов записей опция БлокироватьДляИзменения должна быть установлена в значение ЛОЖЬ"

Вопрос: зачем делать это именно в начале транзакции?

http://its.1c.ru/db/metod81#content:4053:1
1 Kookish
 
09.03.14
19:53
Может быть, потому что транзакция есть вещь неделимая? По определению.
2 ДенисЧ
 
09.03.14
19:55
Чтобы сразу сказать системе, что ты будешь менять.
3 erp20
 
09.03.14
20:08
(2) Намеренье это установка управляемой блокировки (в транзакции) или выполнение запроса с "ДЛЯ ИЗМЕНЕНИЯ" в транзакции. Запись регистров это уже факт изменения данных.
4 vi0
 
09.03.14
20:10
(2) я рассуждаю, что разумная логика проведения должна быть такая:
1) Выполняем какие то расчеты
2) Записываем регистры требующие контроля
3) Если в этих регистрах появились отрицательные остатки то откатываемся и останавливаемся
4) Иначе записываем все остальные регистры

Т.е. не записываем остальные регистры вначале т.к. есть риск отката транзакции, т.е. не делаем заведомо лишнюю работу.
5 erp20
 
09.03.14
20:13
(4) При таких действиях есть риск возникновения неразрешимого конфликта блокировок.
6 vi0
 
09.03.14
20:15
(5) почему именно при этих действиях?
7 Ненавижу 1С
 
гуру
09.03.14
20:16
(5) мне кажется, этот риск есть в любом случае
8 erp20
 
09.03.14
20:17
(6) В случае "Захвата ресурсов в разном порядке": http://kb.1c.ru/articleView.jsp?id=46#case2
9 vi0
 
09.03.14
20:28
(8) Я понимаю, что идеальный случай, когда все регистры пишутся в конфигурации в одинаковом порядке. Мы можем определить не алфавитный порядок, а такой, что все регистры будут упорядочены всегда так как нам нужно. Например есть регистры А,Б,В,Г. Где Б и В иногда требуют контроля остатков. Тогда определяем для себя порядок такой Б,В,А,Г (т.е. пишем остальные регистры только если остатков хватило). Используем этот порядок во всей конфигурации. Мне кажется, что здесь дедлоков быть не должно.
10 hhhh
 
09.03.14
23:05
(9) " пишем остальные регистры только если остатков хватило" - это старинная методика из 8.0. Каменный век.

По новейшим исследованиям: Если просто записать все регистры, а потом проверить и откатиться - это будет в несколько раз быстрее.
11 NcSteel
 
09.03.14
23:09
(3) Причем тут ДЛЯ ИЗМЕНЕНИЯ и упр блокировки?
12 Aleksey
 
09.03.14
23:11
(10) бред, ибо Новая методика проведения используется только в том случае, когда известны значения всех измерений ресурсов и реквизитов для каждой формируемой записи регистра(например, если ведется только количественный учет товаров). В этом случае вся необходимая информация для формирования записей по списанию товаров в документе уже есть, т.о. можно применять новую методику.

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

Выбор методики не зависит от количества регистров, а зависит только от возможности ее применения. Всегда, когда можно использовать новую методику, следует использовать именно ее. Возможна ситуация, когда при проведении в одном документе для разных регистров используются разные методики.
13 NcSteel
 
09.03.14
23:13
(12) Лучше всегда использовать только одну методику, а именно новую. То есть например расчет себестоимости производить отдельным документов.
14 Aleksey
 
09.03.14
23:14
Т.е. если мы говорим про УТ11, в которой себестоимость считается в конце месяца - тогда тут идеально вписывается новая методика (тупо списываем количество из ТЧ документа).

А если нам нужно списать партии сразу ... то мартышкин труд, ибо у нас уже есть все остатки и можно проконтролировать до списания
15 NcSteel
 
09.03.14
23:16
(14) Да ты в теме ))
16 Aleksey
 
09.03.14
23:16
(13) Не плоди сущностей без нужды! а то мы договоримся до того что на каждый регистр свой отдельный документ
17 NcSteel
 
09.03.14
23:17
(16) На каждый регистр и не надо. ПРосто нужен однин ))) А именно закрытие месяца расчет себестоимости или что то подобное
18 vi0
 
10.03.14
00:11
(10) объясни, зачем писать все регистры, если проверяться на отрицательные остатки будет только часть из них
19 vi0
 
10.03.14
00:12
(11) это он пример намерения привел
20 hhhh
 
10.03.14
00:35
(18) раньше было 2 этапа: очистка регистров и потом запись. Теперь только запись. Выигрыш ровно в 2 раза. НО, писать надо во все регистры.
21 rozer76
 
10.03.14
06:14
Наверно на ИТС утверждение (0) излишнее. В данном случае т.к. "БлокироватьДляИзменения=Ложь" то по одинаковым измерениям другие транзакции (которые без контроля остатков) смогут записывать и до окончания текущей транзакции. С другой стороны новая методика имеет выигрыш как раз на том основании что только в небольшом проценте когда появляются отрицательных остатков надо откатить транзакцию. Насчет алфавитного порядка - его и не надо пытаться определять - нужно использовать при проведении "Движения.Записать()" тогда платформа будет записывать в нужном порядки и сама снимет флаг Записывать" у набора записей. Ну и конечно писать надо измененные наборы иначе заблокируется весь регистр.
22 vi0
 
10.03.14
08:24
(21)
> только в небольшом проценте когда появляются отрицательных остатков надо откатить транзакцию
Согласен

> нужно использовать при проведении "Движения.Записать()
Тоже соглашусь, странно, что в статье не упоминается об этом. В другой нашел, странно что так оторвано от других описаний http://its.1c.ru/db/metod81#content:2741:1

> Ну и конечно писать надо измененные наборы иначе заблокируется весь регистр.
Насколько я знаю, этот момент разруливает сама платформа перезаписывая только те строки набора, которые изменились.
23 vi0
 
10.03.14
08:26
(20) я немного о другом спрашивал
ну до кучи спрошу все равно:
- почему РОВНО в 2 раза? (откуда инфа)
- почему во все регистры?
24 hhhh
 
10.03.14
09:13
(23) потому нет проверки какие регистры заполнены, а какие нет. Эта проверка в 8.1 занимала очень много времени. Потом движения по этим регистрам очищались. Все эти действия в итоге больше занимали времени, чем собственно просто записать движения в регистр и не париться.
25 vi0
 
10.03.14
09:21
(24) не могу понять, какому моему высказыванию ты противопоставляешь свое высказывание "записать все регистры"

и что ты подразумеваешь под "записать все регистры"
я не говорил, что нужно записывать не все
речь шла о порядке их записи
26 hhhh
 
10.03.14
10:05
(25) и вот это "этот момент разруливает сама платформа перезаписывая только те строки набора, которые изменились." - полнейший бред. Платформа тупо стирает весь набор и записывает новый набор.
27 vi0
 
10.03.14
10:25
(26) бред? слишком много эмоций
- проверка профайлером показывает, что перезаписываются только измененные строки
- два документа, которые блокируют друг друга на регистре если документы новые или измененные, не станут блокировать друг друга при перепроведении если они не были изменены, т.к. запись в регистр не происходит
28 NcSteel
 
10.03.14
10:59
(21) Вы не правильно представляете зачем нужен "БлокироватьДляИзменения". Даже если его не будет, то упр блокировки будут вешаться.
Можно даже с уверенностью сказать,что в 99% и не нужно ставить этот флаг.
29 NcSteel
 
10.03.14
11:00
(23) Не в два раза, но есть выйгрыш в уменьшении времени блокирования + немного по скорости выигрываем, так как в запросе по остаткам меньше выборка.
30 NcSteel
 
10.03.14
11:01
(26) ты не прав, платформа оптимизирует наборзаписей и обновляет только изменившиеся данные.
31 vi0
 
10.03.14
11:17
(24) такое поведение платформы будет только если свойство документа УдалениеДвижений = Удалять автоматически
32 vi0
 
10.03.14
11:23
комментарий к (26)
33 NcSteel
 
10.03.14
11:25
(31) Это только при чистке? Ведь при Движения.Записать() в 8.2 и выше набор записей оптимизируется не смотря на свойство "УдалениеДвижений"?
34 vi0
 
10.03.14
11:35
(33) что значит при чистке?
не увидел разницы как проводить документ
8.2.18.109 при УдалятьАвтоматически весь набор перезаписывается
35 rozer76
 
10.03.14
11:51
(28) почитайте на досуге про это http://infostart.ru/public/196565/
36 rozer76
 
10.03.14
11:53
+(35) т.о. если не ставить этот флаг то при при чтении регистров с разделением итогов вы на "блокировочнике" получите дедлоки а на "версионнике" отриц остатки
37 rozer76
 
10.03.14
12:04
+(21) и например в ут11 сделано не как в статье на ИТС: БлокироватьДляИзменения=Истина только для РН с контролем остатков (откл разделителя) и потом запись ВСЕЙ коллекции движений и только потом в модуле РН и далее сравнение движений до записи набора и после записи для определения увеличения количества в списании и контроль на отриц остатки.
38 NcSteel
 
10.03.14
12:48
(35) Ну читаем внимательно:

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

Ни какие блокировки это свойство не ставит и в большинстве случаев оно не нужно, так как разделитель обычно не используется.
39 NcSteel
 
10.03.14
12:49
(36) Ну а я что выше написал.... в 99% разделители итогов не используются . И вы путаете ситуацию подразумевая, что без этого флага не будет установлена блокировка. Она будет установлена.
40 NcSteel
 
10.03.14
12:52
Я часто встречаюсь с мнением что "БлокироватьДляИзменения" нужна именно для установки упр блокировок. На самом деле они и так установятся. Это свойство нужно только в одном случае, а именно подсказать системе, что нужно не учитывать разделитель итогов (сплитер).

В большинстве случаев разделители не используются, так же если используется контроль остатков, то разделитель использовать нет смысла. Так что в 99% это свойство не влияет на проведение ну ни как.
41 vi0
 
10.03.14
14:01
(38)
> Это свойство делает одну единственную вещь, оно отключает разделитель итогов
верно по факту работы свойства, но терминология не верна

> Ни какие блокировки это свойство не ставит
тоже не верно

смотрим СП БлокироватьДляИзменения:
"Устанавливает режим, при котором в процессе записи набора будет установлена управляемая блокировка для всех комбинаций измерений в соответствии с записями набора записей. Имеет смысл использовать, если проверка итогов регистра выполняется после записи и заблокировать нужно именно те комбинации, по которым записываются записи. В этом случае можно не использовать объект БлокировкаДанных."

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

Отличие от блокировки, которая установится платформой при записи регистра в том, что блокировка устанавливаемая платформой не будет блокировать другие запись итогов - с другими разделителями. Отсюда возможен дедлок на разном порядке захвата ресурсов.
42 vi0
 
10.03.14
14:04
(40)
> В большинстве случаев разделители не используются
спорно. если посмотреть хотя бы на ут11, да и по логике

> так же если используется контроль остатков, то разделитель использовать нет смысла
тоже спорно. т.к. при большом количестве движений где не требуется контроль остатков (приходы например) разделение итогов увеличит паралельность
43 rozer76
 
10.03.14
15:47
(41) >> Т.о.
БлокироватьДляИзменения именно устанавливает
блокировку.

нет, блокировка порождается именно записью набора и до конца проведения.
44 vi0
 
10.03.14
16:01
(43) согласен, свойство БлокироватьДляИзменения не устанавливает, а указывает установить блокировку "для всех комбинаций измерений в соответствии с записями набора записей"
45 rozer76
 
10.03.14
16:04
(44) нет, оно временно выключает разделитель итогов :)
46 vi0
 
10.03.14
16:10
(45) смайлик расценивать как шутку?)
47 GROOVY
 
10.03.14
16:12
(46) Очень надеюсь... А то уже задолбали чуваки с фразой "временно выключает разделитель итогов". Прочитали коммент Балоусова и вперед на амбразуру, а что реально там происходит, как работает, никто в голову не берет.
48 vi0
 
10.03.14
16:15
(45) если в терминологии хочется упомянуть "разделитель" то можно сказать так: блокирует записи итогов без учета разделителя.
хотя в документации нет такой формулировки

потому как (процитирую себя из (41))
> для того чтобы избежать дедлоков при наличии разделения итогов можно использовать объект БлокировкаДанных и не устанавливать БлокироватьДляИзменения = Истина.
49 vi0
 
10.03.14
16:20
все что я написал легко поверить на практике - как критерий корректности
50 NcSteel
 
10.03.14
18:01
(41) Начинаем разбираться по порядку:
> Ни какие блокировки это свойство не ставит
тоже не верно

Что не верно?

Блокировка устанавливается при записи набора записей и факт установки флага не влияет на сам факт установки блокировки.

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

Так же насчет СП. В ней к сожаленью очень криво написано поэтому и возникает неверное толкование .
51 NcSteel
 
10.03.14
18:05
(44) Вы сами себе противоречите, то устанавливает, то теперь не устанавливает. Все же определитесь окончательно.

Так же БлокироватьДляИзменения  не указывает установить блокировку по всем наборам измерений, она и так будет установлена. Но по разрезу "Сплитер" установлена не будет.

Пример:
ЭлементБлокировки.УстановитьЗначение("РазделительИтогов", 1);

С включенным флагом этой строки не будет.
52 NcSteel
 
10.03.14
18:05
(45) Все же не совсем верно. Сплитер из таблиц базы данных никуда не денется, но область блокирующих данных будет больше.
53 NcSteel
 
10.03.14
18:07
(47) Кто такой Белоусов?

Достаточно Морозова почитать. А так же посмотреть ТЖ и профайлер.
54 rozer76
 
10.03.14
18:30
я так для заметки то что написано в проф разработке "Чтобы избежать изменения итогов между моментом записи и моментом чтения остатков, еще до формирования и записи движений регистра свойство набора записей БлокироватьДляИзменения устанавливается в значение Истина. В этом случае в момент записи набора записей платформа отключит разделитель итогов в регистре. Таким образом, другая транзакция не сможет записать движения по тем же измерениям, что и текущая, до окончания проведения документа. В результате после записи движений будут получены правильные остатки из регистров." Если у кого какая бругая "библия 1с" - дайте пруфлинк плз.
55 NcSteel
 
10.03.14
18:32
(54) kb.1c.ru
так де профайлер и ТЖ.

В профразработке написано для среднестатистического 1С-ка, который не должен лишнего знать.
56 rozer76
 
10.03.14
18:55
(54) ааа, пасиб .. нам тупымижажным фрилансерам и профразработка сойдет :-)
в тж и профайлер лениво такое смотреть про такое ибо изменить оное нельзя.  всем спасибки за комменты.
57 rozer76
 
10.03.14
18:56
(56) в (55) :-)
58 vi0
 
10.03.14
22:41
консенсус
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший