Имя: Пароль:
1C
1С v8
Почему может быть при Отказ = Истина ЭтоНовый() = Ложь?
0 Fragster
 
гуру
13.11.12
13:58
В одной "интересной" конфе вылез странный глюк - в ОбработкаПроведения не проходят проверки, выставляется Отказ = Истина; после чего в форме документа состояние ЭтоНовый() не восстанавливается.

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

Запустил "замер производительности", нажал на "Ок", в начале ЭтоНовый() = Истина, транзакция откатилась, в конце ЭтоНовый() = Ложь. Выключил замер производительности, что искать в нем? Записать() есть только для подчиненного набора записей регистров, какие еще слова искать?
1 mikecool
 
13.11.12
14:01
а почему отказ в проведении должен откатить запись документа?
2 NcSteel
 
13.11.12
14:02
"в конце ЭтоНовый() = Ложь". В конце это где?
3 Fragster
 
гуру
13.11.12
14:02
(1) Ну если РежимЗаписиДокумента = Проведение, разве нет?
4 Fragster
 
гуру
13.11.12
14:02
(2) после того, как он сказал "Не удалось провести ..." в обновлении отображения
5 Песец
 
13.11.12
14:05
(4) Для того, чтобы проводить т. е. записывать в регистры, нужна ссылка на регистратор, т. е. док должен быть записан.
6 NcSteel
 
13.11.12
14:06
Тоесть порядок такой:

1. Создаем новый документ.
2. Наполняем реквизиты данными.
3. Нажимаем кнопку "Ок"
4. В обработке проведения устанавливаем флаг "Отказ" в значение истина.
5. На форме в событии ОбновлениеОтображения метод "ЭтоНовый", расширения контекста объекта, возращается значение Истина?
7 Fragster
 
гуру
13.11.12
14:06
просто после этого повторная попытка проведения дает "Операция не может быть выполнена из-за несоответствия версии или отсутствия записи азы данных (возможно, запись была изменена или удалена)".
8 mikecool
 
13.11.12
14:06
(3) вот тут - как бы да, тогда не понимаю, как сабж-а добиваешься )
9 NcSteel
 
13.11.12
14:06
(6) к (4) с вопросом.
10 NcSteel
 
13.11.12
14:07
(7) Релиз платформы.
11 Fragster
 
гуру
13.11.12
14:07
(10) 8.2.16.368
12 Fragster
 
гуру
13.11.12
14:08
на той же платформе создал в метаданных новый документ, там поведение нормельное, т.е. после "Не удалось провести ..." в обновлении отображения ЭтоНовый() = Истина.

В сабже - после "не удалось провести" ЭтоНовый() = Ложь. и после этого - (7), т.е. не поправить даже ничего, чтобы провести измененный документ.
13 NcSteel
 
13.11.12
14:09
(11) Может это глюк платформы?

Рационального объяснения не могу придумать.
14 Fragster
 
гуру
13.11.12
14:09
вот и спрашиваю - замером получил все выполняемые строки обработки от нажатия на кнопку "ОК" до обновления отображения, что кроме "Записать" там искать, что может сбросить ЭтоНовый() флаг
15 Fragster
 
гуру
13.11.12
14:09
(13) ну так на новом документе все работает
16 NcSteel
 
13.11.12
14:10
а если сравнить версии. Они одинаковые?
17 NcSteel
 
13.11.12
14:10
(16) + тоесть
Объект.ВерсияДанных и Ссылка.ВерсияДанных.
18 Песец
 
13.11.12
14:11
(5+) Возможно, где-то прописана принудительная запись в отдельной транзакции
19 Fragster
 
гуру
13.11.12
14:11
ВерсияДанных? там пишет "{(1)}: Ошибка при получении значения атрибута контекста (ВерсияДанных)"

А Ссылка пустая после отказа.
20 NcSteel
 
13.11.12
14:11
(15) Ну это не показатель. Может ты наткнулся на трудно воспроизводимую ошибку платформы.
21 НЕА123
 
13.11.12
14:11
(14)
а ссылка пустая?
22 Reset
 
13.11.12
14:11
(17) Из (7) можно предположить, что разные
23 NcSteel
 
13.11.12
14:11
(19) Упр формы?
24 NcSteel
 
13.11.12
14:12
(22) Не факт.
25 Fragster
 
гуру
13.11.12
14:12
(23) нет
(22) ->(19)
26 Fragster
 
гуру
13.11.12
14:13
режим совместимости с 8.1, но все равно, (15) же
27 Reset
 
13.11.12
14:13
Глюк (с) какой-то. Как такое программно воспроизвести, не представляю
28 Shurjk
 
13.11.12
14:13
(0) Объект этоНовый только в событиях передзаписью,  при записи так же как и при провдеении он в принципе уже не может быть новым. Ибо ссылка по сути уже есть.
29 eklmn
 
гуру
13.11.12
14:14
это 1С и этим все сказано
30 NcSteel
 
13.11.12
14:14
(26) Пакуй базу и в 1С.
31 Reset
 
13.11.12
14:14
(28) У него он Не новый уже после окончания (отмены) транзакции
32 NcSteel
 
13.11.12
14:14
(28) При откате транзакции теряем и ссылку, тоесть запись.
33 Fragster
 
гуру
13.11.12
14:15
НачатьТранзакцию не нашел в замере
34 Shurjk
 
13.11.12
14:15
(31) Ну да все правильно транзакцию откатили, и в этот момент ничего уже не делается, начнем снова писать он передзаписью опять новы будет, а в при записи уже нет.
35 NcSteel
 
13.11.12
14:16
(34) А после отката транзакции на стороне клиента он какой?
36 Shurjk
 
13.11.12
14:16
(32) Ну да, но в каком месте вы хотите увидеть что объект не новый?
37 Shurjk
 
13.11.12
14:16
(35) Новый, он всегда новый до начала транзакции, при выполнении уже нет.
38 Reset
 
13.11.12
14:17
(36) -> (6) на шаге 5
39 NcSteel
 
13.11.12
14:17
(37) У ТС не так. В форме он наблюдает обратную реакцию.
40 Fragster
 
гуру
13.11.12
14:17
(36) я хочу узнать, почему он после отката транзакции не новый
41 Shurjk
 
13.11.12
14:19
(36) Потому что транзакция уже началась, пока полностью все операции по записи не прекратились, он уже не новый.
42 Shurjk
 
13.11.12
14:20
(38) Шага 5 выполняется уже после окончания транзакции.
43 Reset
 
13.11.12
14:20
(42) Именно
44 NcSteel
 
13.11.12
14:20
(41) Мля , транзакция уже откатилась. и при попытке изменения объекта появляются ошибки. Ты видимо писатель , а не читатель.
45 Shurjk
 
13.11.12
14:21
(43) Ну все логично. Трназакция отменилась объект вновь стал новый.
46 Fragster
 
гуру
13.11.12
14:21
(45) в (0) он таки не стал обратно новый
47 Shurjk
 
13.11.12
14:21
(44) Какие ошибки? В каком событии?
48 vmv
 
13.11.12
14:22
наркоманская ветка
49 Fragster
 
гуру
13.11.12
14:22
(47) после этого при любых попытках действий с объектом (записать, провести и т.п.) выдается (7)
50 Fragster
 
гуру
13.11.12
14:23
(48) это нормально
51 НЕА123
 
13.11.12
14:23
(47)
см (7)
52 Reset
 
13.11.12
14:23
А если отказ давать перед записью, а не при проведении, воспроизводится? Хотя я не знаю, что это даст
53 Shurjk
 
13.11.12
14:23
Дык естественно у него там корявка Записать() в регистре явно указано, оно и пишет ссылку в базу.
54 Reset
 
13.11.12
14:24
(53) Отмена транзакции должна отменять также и все корявки, по идее
55 Shurjk
 
13.11.12
14:24
+(53) А кстати в каком месте оно указано?
56 Fragster
 
гуру
13.11.12
14:25
(55) в ПриЗаписи - идет запись версионирования
57 Shurjk
 
13.11.12
14:25
(54) По идее да, но может она проходит до отказ = истина, либо отказ устанавлвается в истина не непосредственно в обработке проведения, а там это потом не обрабатывается.
58 Shurjk
 
13.11.12
14:25
(56) Все понятно.
59 Песец
 
13.11.12
14:26
Записывается док после ПередЗаписью но до ПриЗаписи модуля объекта... может в подписках на события до ПередЗаписью или в модуле регистра есть что-то вроде
Если Регистратор.ЭтоНовый() тогда
НачатьТранзакцию();
 Регистратор.Записать();
ЗафиксироватьТранзакцию();
КонецЕсли;
60 Fragster
 
гуру
13.11.12
14:27
(59) "Начать" в замере нету
61 Shurjk
 
13.11.12
14:28
(59) Там все прикольней, записывается набор записей подчиненный регистратору.
62 Reset
 
13.11.12
14:29
(60) А записать() есть? Может заменить на УстановитьСсылкуНового
63 NcSteel
 
13.11.12
14:31
(61) Все наборы записей в РН подчинены регистратору и не вызывают данный батхед.
64 Песец
 
13.11.12
14:31
(59+) а, нет, регистр записывается внутри транзакции... может подписка?
65 Fragster
 
гуру
13.11.12
14:32
(64) подписки не видны в замере?
66 Shurjk
 
13.11.12
14:33
(63) Если их явно не писать, до окончания записи регистратора то не вызывает иначе запросто.
67 NcSteel
 
13.11.12
14:34
(66) Посмотри как пишутся партии в типовой конфе. они пишутся явно
68 Shurjk
 
13.11.12
14:36
(67) Посмотри как вызывается это запись - везде стоит - Если не Отказ тогда и после всех проверок, а тут прям перед записью у него все это безобразие выполняется.
69 Shurjk
 
13.11.12
14:37
+(68) То есть призаписи, а там объект уже всегда не новый.
70 Fragster
 
гуру
13.11.12
14:39
пока ищу методом половинного деления выставляя
   Отказ = Истина; Возврат;
в разные места
71 Fragster
 
гуру
13.11.12
14:39
пока дошел до того, что если в середине обработки проведения поставить отказ - то все работает как надо
72 Shurjk
 
13.11.12
14:40
(70) Попробуй убрать версионирование, посмотришь что будет.
73 Fragster
 
гуру
13.11.12
14:41
(72) оно в ПриЗаписи - сейчас уже вставляю в разные места обработки проведения, пока все работает, т.е. после отката ЭтоНовый() = Истина
74 Shurjk
 
13.11.12
14:43
(73) А ошибка все равно возникает.
75 Fragster
 
гуру
13.11.12
14:45
(74) нет, все нормально
76 Песец
 
13.11.12
14:50
Создал новый документ.
В модуле формы


Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
   Если ЭтоНовый() Тогда
       Записать();
   КонецЕсли;
КонецПроцедуры

Процедура ПослеЗаписи()
   Сообщить(ЭтоНовый());
КонецПроцедуры

в модуле объекта


Процедура ОбработкаПроведения(Отказ, РежимПроведения)
   Отказ=Истина;
КонецПроцедуры

ввожу новый, жмакаю провести, месаджбокс неудача, до ПослеЗаписи не доходит, документ остается записанным в журнале.
77 Fragster
 
гуру
13.11.12
14:52
(76) да, но у тебя не наблюдается (7), наверное.
78 hhhh
 
13.11.12
14:54
может после Отказ=Истина где-то есть Записать() ?
79 Shurjk
 
13.11.12
14:55
(78) Оно есть до этого места.
80 Reset
 
13.11.12
14:55
(76) ПередЗаписью формы, если мне не изменяет память, выполняется до начала транзакции, так что поведение нормально
81 Fragster
 
гуру
13.11.12
14:59
(78) после Отказ = Истина идет Возврат;
82 Aprobator
 
13.11.12
15:07
В обработке проведения документ уже не новый.
83 Песец
 
13.11.12
15:08
(80) Это я к тому, что чудес не бывает, надо искать где док записывается до начала транзакции. Может справочник или регистр сведений записывается, а в его событиях регистратор.записать()
84 Песец
 
13.11.12
15:09
(83+) Тупо зпкоментить половину всего, что до ОбработкаПроведения, потом вторую половину...
85 Fragster
 
гуру
13.11.12
15:09
только что в начало обработки проведения включил Отказ = Истина; Возврат; - ошибки нет
86 ixijixi
 
13.11.12
15:11
А нету у тебя часом в модуле "Прочитать()"? Если есть - ставь перед ним "Записать()".
87 Песец
 
13.11.12
15:12
(85) а ЭтоНовый() какое?
88 Fragster
 
гуру
13.11.12
15:12
(87) в обработке проведения - ложь, после отката - истина
89 Shurjk
 
13.11.12
15:18
(83) Бесполезно я уже давно пытаюсь эту мысль донести, но почему то все упорно хотят верить в чудо.
90 Reset
 
13.11.12
15:26
(83) (89) Если бы док записывался до начала транзакции, это бы не приводило к (7).
Разве если где-то вредительский код типа ЭтотОбъект.Ссылка.ПолучитьОбъект().Записать()
(да и то, док то новый, получитьОбъект не удастся)
91 Shurjk
 
13.11.12
15:29
(90) Там записываются записи подчиненного регистра.
92 Fragster
 
гуру
13.11.12
15:30
(91) и чо?
93 Shurjk
 
13.11.12
15:31
(92) В этом причина
94 Fragster
 
гуру
13.11.12
15:33
(93) сфига?
95 Bober
 
13.11.12
19:49
в коде идет получение/создание объекта и его запись в базу. Поэтому в форме остается экземпляр с признаком этоновый. Но в базе уже есть этот объект. При записи система отваливается с ошибкой.
PS Из этого следует, что форма открывается с установленной ссылкой нового.
96 Bober
 
13.11.12
19:51
(96) где-то идет запись вне транзакции(причем не через этот экземпляр объекта) и только потом проведение
97 Fragster
 
гуру
14.11.12
10:57
короче, подергал я вызываемые модули, потом вернул все назад... и ошибка ушла. вероятно косяк конвертации.
98 Песец
 
15.11.12
07:25
Хмм... значит все-таки глюк платформы :(
99 Тоненький Клиент
 
15.11.12
08:12
нуф-
100 Тоненький Клиент
 
15.11.12
08:12
нуф