Имя: Пароль:
1C
1С v8
Вопрос на засыпку: Может ли документ быть не записанным в обработке проведения
,
0 mzelensky
 
26.03.14
13:06
Доброго всем. Вопрос. как и сказано в теме, на засыпку...хоть на собеседованиях задавай..

Итак, ковыряюсь в УТ 10.3 (естественно модифицированной) и вижу в ОБРАБОТКЕ ПРОВЕДЕНИЯ документе РТиУ следующий код:


Если ЭтоНовый() Тогда //Объект еще ни разу не проводился

                
                ...БЛА-БЛА-БЛА
            
                Иначе //Если Реализация или Поступление уже созданы Тогда

                    Если Не Отказ Тогда
                        НовыйОбъект = Ложь;
                        ЭтотОбъект.Записать();
                    КонецЕсли;
                КонецЕсли;
Иначе

...БЛА-БЛА-БЛА

КонецЕсли;



А теперь внимание вопрос - Может ли документ быть НОВЫМ (т.е. НЕ ЗАПИСАННЫМ) в ОБРАБОТКЕ ПРОВЕДЕНИЯ ???
1 H A D G E H O G s
 
26.03.14
13:08
(0) Взять и проверить.
2 mzelensky
 
26.03.14
13:09
(1) Я проверял - у меня не получается, чтобы он был новым.
Может как-то не так проверяю?
3 H A D G E H O G s
 
26.03.14
13:09
НОВЫМ (ЭтоНовый()) и (НЕ ЗАПИСАННЫЙ) - это могут быть разные сущности.
Ты должен это проверить.
4 Господин ПЖ
 
26.03.14
13:10
ЭтоНовый() разве ловится ниже ПередЗаписью() ?

упоротые...
5 Maxus43
 
26.03.14
13:10
а теперь внимание ответ!
Не может он быть не записанным в обработке проведения
6 Maxus43
 
26.03.14
13:11
вопрос со смыслом темы не связан вобще
7 PuhUfa
 
26.03.14
13:13
ДокументОбъект.<Имя документа> (DocumentObject.<Имя документа>)
ОбработкаПроведения (Posting)

Описание:

Возникает при проведении документа. Основное назначение процедуры-обработчика данного события - генерация движений по документу. Выполняется в транзакции записи.
8 GROOVY
 
26.03.14
13:13
Чисто теоретически в обработке проведения документ может быть не записан, если обработку проведения вызвали программно, а не событийно. Но это изврат.

Если нужно в обработке проведения проверить проводится ли документ или перепроводится, то подобную штуку можно провернуть с помощью "ДополнительныеСвойства" в которые перед записью помещать признак проведенности (или нового) документа, а в обработке проведения уже проверять что там.
9 DexterMorgan
 
26.03.14
13:15
(8) Опередил) конечно доп свойства
10 mzelensky
 
26.03.14
13:15
(3) меня конкретно вот это интересует:

Если ЭтоНовый() Тогда
11 mzelensky
 
26.03.14
13:16
(4) Самы ты упоротый. Открой отладчик и проверь!
12 vmv
 
26.03.14
13:16
а если новому документу ссылка назначена посредством ПолучитьСсылкуНового(), то он ведь может быть и не записан, но уже "иметь" ссылку.

может в этом сакральный смысл (0)
13 DexterMorgan
 
26.03.14
13:17
(12) Все гораздо банальнее)
14 mzelensky
 
26.03.14
13:18
(8) Т.е., теоретически, если я программно создаю документ, а потом аишу

Док.Записать(РежимЗаписиДокумента.Проведение);

то обработка проведения вызовится без записи?
15 mzelensky
 
26.03.14
13:19
(12) Ссылка тут не причем.
Меня интересует свойство

ДокументОбъект.<Имя документа> (DocumentObject.<Имя документа>)
ЭтоНовый (IsNew)
Синтаксис:

ЭтоНовый()
Возвращаемое значение:

Тип: Булево.
Истина - изменяется еще ни разу не записанный документ; Ложь - документ уже записан.
Описание:

Определяет, записан ли документ в базу данных.



И может ли оно отрабатывать в ЛОЖЬ в обработке проведения.
16 PuhUfa
 
26.03.14
13:20
(14) и тогда ты должен будешь получить проведенный документ которого нет в базе -)) Прям как с сусликом -)
17 Maxus43
 
26.03.14
13:21
>>И может ли оно отрабатывать в ЛОЖЬ в обработке проведения
не должен, это просто проверить
18 mzelensky
 
26.03.14
13:21
(16) Чет мне кажется бред.
19 vmv
 
26.03.14
13:22
(15) если найдеться мозг, который напомнит мне ЧТО влияет на результат ЭтоНовый(), то буду благодарен
20 GROOVY
 
26.03.14
13:24
(14) Нет. Это вызовет событие записи и проведения.
(15) Может, я писал выше.
21 Defender aka LINN
 
26.03.14
13:24
(19) Записан ли документ в базу
22 GROOVY
 
26.03.14
13:24
(19) ДокументОбъект.<Имя документа>.ЭтоНовый (DocumentObject.<Имя документа>.IsNew)
ДокументОбъект.<Имя документа> (DocumentObject.<Имя документа>)
ЭтоНовый (IsNew)
Синтаксис:

ЭтоНовый()
Возвращаемое значение:

Тип: Булево.
Истина - изменяется еще ни разу не записанный документ; Ложь - документ уже записан.
Описание:

Определяет, записан ли документ в базу данных.

Доступность:

Сервер, толстый клиент, внешнее соединение, мобильное приложение(сервер).
Пример:

Если РасходнаяНакладная.ЭтоНовый() Тогда
    РасходнаяНакладная.Записать();
КонецЕсли;
23 mzelensky
 
26.03.14
13:26
(20) Т.е. это возможно если:

Создать документ, а потом просто вызвать процедуру "ОбработкаПроведения()" (предварительно сделав ее Экспортной) ? так?
24 Maxus43
 
26.03.14
13:26
(22) если следовать букве СП - в обработке проведения документ записан, отсюда и ЭтоНовый() должен быть Ложь.
Хотя показывает видимо Истина (что правильно, неправильно что в СП написано) :)
25 StanleyMarsh
 
26.03.14
13:27
(0) Вирусный вопрос))
26 mzelensky
 
26.03.14
13:28
(21)(22) я думаю он имел ввиду как система определяет записан объект в базу или нет.

Например создан новый объект и ему нахрапом присвоена ссылка какого-то объекта (ну допустим).

Тогда получается, что ссылка у объекта есть, но в базу он фактически еще не записан.
27 Maxus43
 
26.03.14
13:29
(26) платформа не создаёт ссылку новому документу, это можно сделать только программно
28 GROOVY
 
26.03.14
13:29
(23) Да, а если вызывать ее из модуля объекта, то и экспортной делать не надо.
29 mzelensky
 
26.03.14
13:30
(27) Что значит не создает? А Гуид кто формирует?
30 Maxus43
 
26.03.14
13:34
(29) он при записи формируется, а не при создании документа
31 StanleyMarsh
 
26.03.14
13:34
Если интересно ответ такой: запись и проведение происходят в рамках 1 транзакции. ЭтоНовый() даст ложь (для нового документа),но если в обработке проведения стоит отказ, то транзакция отменится и как бы записанный документ перестанет быть записанным))
32 GROOVY
 
26.03.14
13:34
(26) Это возможно, особенно при переносе данных, к примеру КД или РБД.
33 GROOVY
 
26.03.14
13:35
(31) В том случае если транзакция проведения вложена в транзакцию записи.
34 StanleyMarsh
 
26.03.14
13:37
(33) очевидно, что если документ был записан то ЭтоНовый() всегда даст ложь. В вопросе (0) этот случай (33) только и подразумевается.
35 mzelensky
 
26.03.14
13:38
(30)ну так в том и фишка. Что платформа сама еще ГУИД не сфоррмировала, а ты его уже присвоил объекту (сам).

Вот в этом случае, пока ты еше не записал этот объект, платформа будет думатЬ .что объект новый или уже нет (т.к. гуид по факту ей присвоен)
36 MaxS
 
26.03.14
13:40
Если РежимЗаписиДокумента.Проведение, то логично предположить, что документ может быть новым в момент проведения. И если при проведении произойдёт отказ, то произойдёт откат транзакции записи.
37 Maxus43
 
26.03.14
13:40
(35) Новый - Не новый от гуида не зависит... Корое первый раз записываешь = ЭтоНовый() Иначе ЛОЖЬ
38 vmv
 
26.03.14
13:49
тут нужно мнение создателя метода "это новый" с описанием внутренней условной логики - все остальное только фантазии.

А само описание метода в СП ущербно, конеш, и аппелирует опять же к фантазиям в расчете на то, что "тупым и жадным" достаточно отписки.
39 Defender aka LINN
 
26.03.14
20:18
рукалицо...
40 Леша1с
 
27.03.14
09:06
что за беспредел....
если ОбработкаПроведения "попала" как-либо программно, а не через ок-провести, то ЭтоНовый может быть Истина (не записан объект).
И какое отношение получение ссылки (выдача каких-либо ссылок из пула) имеет к тождествености к записи объекта?
Основная теорема систематики: Новые системы плодят новые проблемы.