Имя: Пароль:
1C
1С v8
Сохранить данные при отказе проведения документа
0 kugelfangg
 
02.07.12
16:41
Здравствуйте, Господа!
Суть проблемы:
При проведении документа через "попытку" производится запись в регистр сведений в ресурс/реквизит. Как только проведений документа уходит в исключение, все данные записанные в этот регистр в процессе проведения, удаляются.

Подскажите пожалуйста, как избежать удаления накопленных в процессе проведения данных из определенного регистра сведений в момент отказа проведения документа?
1 butterbean
 
02.07.12
16:43
убрать запись в регистр из попытки
2 Mort
 
02.07.12
16:43
Никак не могу выбрать между вопросами: "Накуа?" и "Как это себе представляешь?"
3 0_Serg_0
 
02.07.12
16:44
вывести эту запись в исключения
4 sanja26
 
02.07.12
16:44
при записи..
5 Rovan
 
гуру
02.07.12
16:48
(0) не советуем так делать
платформу 1С умные люди делали - они специально создали такой механизм !
6 kugelfangg
 
02.07.12
16:49
(5) я совершенно не против данного механизма. Но вот в одном регистре он очень мешает.
7 kugelfangg
 
02.07.12
16:52
(3)(4) в попытке у меня:
ИсходныйДокумент.Записать(РежимЗаписиДокумента.Проведение);

При проведении документ начинает лазить по огромному количеству общих модулей и регистрам. Так что такой вариант при текущем коде невозможен
8 Ненавижу 1С
 
гуру
02.07.12
16:54
сделай свой метод в модуле объекта:

ЗаписатьЧтотоВОсобыйРегистр();
Записать(РежимЗаписиДокумента.Проведение);
9 0_Serg_0
 
02.07.12
16:54
(7)
попытка
ИсходныйДокумент.Записать(РежимЗаписиДокумента.Проведение);

исключение
запись твоих важных данных в регистр
конецпопытки;
10 0_Serg_0
 
02.07.12
16:56
+(9) по идее к моменту "исключение" они уже собраны и их достаточно просто записать
11 kugelfangg
 
02.07.12
16:58
(9)(10) К моменту исключения они уже собраны и записаны, но как только происходит исключение, собранные данные удаляются.
12 hhhh
 
02.07.12
17:05
(11) удаляются с диска. А в оперативной памяти должны остаться.
13 kugelfangg
 
02.07.12
17:08
(12)Ок, и как их достать? =)
14 hhhh
 
02.07.12
17:10
(13) ну в переменной посмотреть, которая была "набор записей".
15 kugelfangg
 
02.07.12
17:15
(14)А если нет переменной? есть только строки регистра?
Может есть какая-нибудь настройка, "запрещать откат внесенных изменений регистре"?

Через транзакции пробовал(НачатьТранзакцию(),ЗафиксироватьТранзакцию()), не помогло...
16 qwerty09
 
02.07.12
17:36
(15) если нет, то сделай и пиши данные вне конструкции попытка-исключение

>> Через транзакции пробовал(НачатьТранзакцию(),ЗафиксироватьТранзакцию()), не помогло...
чет я не пойму как это могло помочь...попытка-исключение это уже открытие-откат транзакции.
17 Serg_1960
 
02.07.12
17:38
Вопрос можно? А почему отказ в проведении документа (обычная, штатная ситуация) порождает у автора исключение?
18 qwerty09
 
02.07.12
17:48
(17) ну всякое может быть...пока он его обрабатывать будет, кто то из юзверов его заблокирует или из-за блокировок по таймауту вывалится, или прав кому то не хватит провести...я тоже всегда в попытку-исключение оборачиваю подобную куиту.
19 Axel2009
 
02.07.12
17:59
(15) это даже не 1с придумали. а ребята, которые придумывали стандарт по целостности данных. при таком подходе хотя бы все знают, что данные не запишутся. а то после таких как ты ищи дырки.
20 Fragster
 
гуру
02.07.12
18:01
в 1с нету вложенных транзакций, так что надо порождать распределенную транзакцию, например писать РС с помощью вызова веб сервиса
21 Fragster
 
гуру
02.07.12
18:02
а вообще это всё изврат
22 kugelfangg
 
02.07.12
18:02
(19) Это мы все уже поняли. НО это спец. регистр которого этот принцип касаться не должен. И вопрос заключается в том, как это сделать с текущими условиями, а не в том хорошо это или плохо.=)
23 Axel2009
 
02.07.12
18:03
(22) пиши в журнал регистрации
24 qwerty09
 
02.07.12
18:04
(22) так что там за регистр то такой?
25 blopp
 
02.07.12
18:04
(0) Если совсем пофигу на архитектуру - вынеси запись в отдельную процедуру и вызывай ее в фоновом задании.
У него будет свой коннект к БД, к транзакции документа отношения не имеющий.
26 Serg_1960
 
02.07.12
18:11
Глянь на мой изврат, может пригодится на что нибудь :)

Процедура ПереПроведениеДокументаПоРегиструХХХ(ТекСсылка, ИмяРегистра)
   
   Попытка
       Объект = ТекСсылка.ПолучитьОбъект();
       
       НачатьТранзакцию();
       
       Объект.Записать(РежимЗаписиДокумента.Проведение,РежимПроведенияДокумента.Неоперативный);
       Объект.Движения[ИмяРегистра].Прочитать();
       ТаблицаЗаписей = Объект.Движения[ИмяРегистра].Выгрузить();
       
       ОтменитьТранзакцию();
       
       Объект.Движения[ИмяРегистра].Загрузить(ТаблицаЗаписей);
       Объект.Движения[ИмяРегистра].Записать(Истина);
       
   Исключение
       
       Если ТранзакцияАктивна() Тогда
           ОтменитьТранзакцию();
       КонецЕсли;
       
   КонецПопытки;
   
   Возврат;
   
КонецПроцедуры
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.