Имя: Пароль:
1C
1С v8
Насколько корректен механизм?
,
0 H A D G E H O G s
 
26.12.12
15:21
День добрый.
Ситуация:
- Документ делает движение в регистр.
- Документ заполняется автоматически на основании этого регистра без учета движений.

Насколько корректно в момент заполнения распроводить документ в транзакции, а потом откатывать транзакцию?

Как пример:

   НачатьТранзакцию();
   Если Не ЭтоНовый() Тогда
       ЭтотОбъект.Записать(РежимЗаписиДокумента.ОтменаПроведения);
   КонецЕсли;
   
   ТаблицаДанных=Запрос.Выполнить().Выгрузить();
   ОтменитьТранзакцию();
1 sapphire
 
26.12.12
15:23
Я бы так делать не стал.
2 H A D G E H O G s
 
26.12.12
15:24
(1) Причина?
3 mzelensky
 
26.12.12
15:24
(2) а если ГЛЮКАНЕТ и до "ОтменитьТранзакцию();" не дойдет?!
4 GROOVY
 
26.12.12
15:24
Подобный механизм в методичке от 1С есть. Но мне не нравится, блокировать таблицы ради забавы в форме... Как то не серьезно.
5 sapphire
 
26.12.12
15:25
(4) Так ведь не факт что на форме.
6 ptiz
 
26.12.12
15:25
Я бы просто движения почистил.
7 Господин ПЖ
 
26.12.12
15:25
(0) по факту это единственный способ без гимороя посчитать средний дневной заработок например...
8 sapphire
 
26.12.12
15:26
(0) Подыми ТЖ и посмотри что 1С отправит серванту, если по-душе - то пользуйся на здоровье.
9 H A D G E H O G s
 
26.12.12
15:26
(4) Понятно.
Документ работает с 1-им регистром накопления, так что думаю, не критично.
10 sapphire
 
26.12.12
15:27
(6) Если ты не понял кода в (0) лучше .. того...
11 GROOVY
 
26.12.12
15:27
А почему бы в запросе не исключить существующие движения текущего документа?
12 Stim
 
26.12.12
15:27
«1С:Предприятие» не поддерживает вложенных
транзакций. Это означает, что всегда действует только транзакция самого верхнего уровня. Все транзакции, вызванные внутри уже открытой транзакции, фактически относятся к той же транзакции, а не образуют вложенную транзакцию. Таким образом, отмена изменений, выполняемая во вложенной транзакции, будет приводить в конечном счете не к отмене
изменений самой вложенной транзакции, а к отмене всех изменений транзакции верхнего уровня.
(с)
13 ptiz
 
26.12.12
15:28
(10) Да всё понятно. Чистка движений легче для системы тем, что не срабатывают события документа.
14 sapphire
 
26.12.12
15:28
(9) Это как:
Документ заполняется автоматически на основании этого регистра без учета движений.

Т.е. на начало месяца или текущий остаток?
15 sapphire
 
26.12.12
15:28
(12) Не в кассу
16 Lys
 
26.12.12
15:28
(0) А зачем распроводить-то?
Какие именно данные из регистра требуется получить - остатки на момент "перед документом", или обороты без учета движений данного документа?
17 sapphire
 
26.12.12
15:29
(13) Я, наверное, тебя не понимаю.
18 sapphire
 
26.12.12
15:29
(16) Остатки без документа.
19 Фокусник
 
26.12.12
15:30
(3) Транзакция останется не завершенной, т.е. ничего не произойдет
20 H A D G E H O G s
 
26.12.12
15:30
(16) Обороты.
21 Lys
 
26.12.12
15:32
(20) Обороты ДО документа, или позиция документа находится внутри интервала получаемых оборотов?
22 kumena
 
26.12.12
15:32
(7) там движения для расчета базы нужны, без этого никак.
23 х86
 
26.12.12
15:32
(11)+1
я бы оборот по регистру сделанный этим доком "вычел"
24 H A D G E H O G s
 
26.12.12
15:33
Есть отдельный, рассово верный Учет затрат, строящийся на типовом УчетеЗатратБУ.

И надо приводить его в соответствии с типовым за месяц.
25 Lys
 
26.12.12
15:34
+(21) в зависимости от ответа - либо в периоде запроса юзаем Границу (ВидГраницы.Исключая), либо (11)
26 H A D G E H O G s
 
26.12.12
15:35
(23) Мне лениво было и я запилил (0). Вот думаю про подводные камни.
27 H A D G E H O G s
 
26.12.12
15:37
Ладно, понятно, блокировки пока только зло.
28 х86
 
26.12.12
15:38
(26)там еще с правами могут быть траблы, т.е. у пользователя может не быть прав на отмену проведения и это всё нужно делать в привилегированном модуле и т.п.
29 Dmitrii
 
гуру
26.12.12
15:44
Я бы сделал как-то так:

ТаблицаНабораЗаписей = Движения.МойРегистр.Выгрузить();
Движения.МойРегистр.Очистить();
Движения.МойРегистр.Записать();
ЗаполнитьДокументПоДаннымРегистра();
Движения.МойРегистр.Загрузить(ТаблицаНабораЗаписей);
Движения.МойРегистр.Записать();
30 ptiz
 
26.12.12
15:46
(29) Только всё равно - только в транзакции.
31 GROOVY
 
26.12.12
15:47
(29) Я бы (уж если выбирать из двух зол) остановился на отменетранзакции, чем на 2х записях и загрузки/выгрузки данных движений в ТЗ.
32 Dmitrii
 
гуру
26.12.12
16:03
(31) >> чем на 2х записях и загрузки/выгрузки данных движений в ТЗ.

А в транзакции при отмене проведения записи производится не будет?
Будет. Да к тому же не по одному регистру, а сразу по всем изменившимся наборам. Плюс запись самого документа и его ТЧ.
Потом еще откат транзакции.

Единственный сомнительный вопрос по выгрузке/загрузке набора записей через ТЗ. Но тут всё зависит от размера набора записей.
33 mistеr
 
26.12.12
16:12
(31) Еще вариант снять активность записей.
34 GROOVY
 
26.12.12
16:15
(32) Транзакция будет в кеше, по факту запись на диск не произойдет. в (29) будет 2 неявные транзакции, которые успешно завершаться, с блокировками блекджеком и пр.

(33) не вариант, так как записывать набор все равно надо будет.
35 Dmitrii
 
гуру
26.12.12
16:20
(34) >> Транзакция будет в кеше, по факту запись на диск не произойдет

Как так?
Если запись пустого набора не произведена в базу (отмена проведения в кеше), то как тогда получаются запросом (из базы) данные БЕЗ учета записей сделанных документом?
36 GROOVY
 
26.12.12
16:31
(35) А вот так. Транзакция она на то и транзакция, данные читаются через кеш, для других сеансов данные заблокированы.
37 mistеr
 
26.12.12
16:34
(34) Кто ж спорит. По сравнению с пересчетом итогов транзакции это мелочь IMHO.

Раз документ перезаполнятеся, значит итоговые движения будут скорее всего другими. Так что распроводить самое правильное. Только без откатов, как в типовых: "Для заполнения нужно отменить проведение. Продолжить?"
38 GROOVY
 
26.12.12
16:37
(37) А что после изменения активности пересчета итогов не будет?
39 mistеr
 
26.12.12
17:04
(38) Будет. Я не пропихиваю это как лучший вариант. Просто вариант.
40 MKZM
 
26.12.12
17:38
Года полтора назад делал создание цепочек связанных документов, если на каком-то этапе возникала ошибка - отменял транзакцию. Все изменения отменялись. Проблем не наблюдалось.