![]() |
![]() |
![]() |
|
УТ 11. Как программно отследить первое проведение? | ☑ | ||
---|---|---|---|---|
0
SeiOkami
01.03.13
✎
23:12
|
Задачка простая. При первом проведении заказа нужно ставить напоминание на N количество дней. Но только при первом.
Первая мысль: в подписке на событие перед записью (такая просто уже есть) сделать проверку: (на вскидку) Если Режим = Проведение тогда Если не источник.ссылка.проведен тогда УстановитьНапоминалку(); КонецЕсли; КонецЕсли; Но ведь он будет ловить каждое проведение не проведенного документа. А как поймать ПЕРВОЕ проведение? |
|||
1
Фокусник
01.03.13
✎
23:14
|
(0) новый реквизит или новый регистр сведений. Фиксировать там
|
|||
2
SeiOkami
01.03.13
✎
23:16
|
(1) иначе ни как ?
|
|||
3
Очкарик
01.03.13
✎
23:16
|
(0) в чем проблема, не пойму?
Записал в регистр один раз и не очищай его, если не отмена проведения. |
|||
4
SeiOkami
01.03.13
✎
23:16
|
(1), ради такой мелочи не охото...
|
|||
5
Очкарик
01.03.13
✎
23:18
|
Если документ имеет признак "Проведен" и проводится опять, то это значит, что он проводится уже не первый раз :)
|
|||
6
SeiOkami
01.03.13
✎
23:21
|
(5), и?
|
|||
7
Очкарик
01.03.13
✎
23:23
|
(6) ну, подумай
|
|||
8
Очкарик
01.03.13
✎
23:26
|
(6) Если у тебя документ проводится и у него признак "Проведен" - значит напоминалку устанавливать уже не нужно.
Так понятно? |
|||
9
Очкарик
01.03.13
✎
23:32
|
(0) > Но ведь он будет ловить каждое проведение не проведенного документа. А как поймать ПЕРВОЕ проведение?
Заключи УстановитьНапоминалку() в конец транзакции проведения и в конце транзакции проверяй: Если НЕ Отказ и НЕ Проведен Тогда УстановитьНапоминалку() КонецЕсли; |
|||
10
SeiOkami
01.03.13
✎
23:32
|
(8), почитай пост номер (0)
|
|||
11
Очкарик
01.03.13
✎
23:33
|
(10) почитай пост номер (9)
|
|||
12
SeiOkami
01.03.13
✎
23:33
|
(9)
как думаешь, что будет, если мы проведем, отменим проведение и снова проведем? Напоминалка установится дважды |
|||
13
Очкарик
01.03.13
✎
23:35
|
(12) > отменим проведение и снова проведем
Это разве не равносильно первому проведению? > Напоминалка установится дважды Если НЕ Отказ и НЕ Проведен И НЕ ЕстьУжеНапоминалка() Тогда УстановитьНапоминалку() КонецЕсли; |
|||
14
Очкарик
01.03.13
✎
23:38
|
(12) Ты загоняешься. Если ты еще хочешь учитывать отмену проведения и повторное проведение, то достаточно так:
Если НЕ ЕстьУжеНапоминалка() Тогда УстановитьНапоминалку() КонецЕсли; |
|||
15
SeiOkami
01.03.13
✎
23:38
|
(13), "Это разве не равносильно первому проведению? "
конечно, нет! "НЕ ЕстьУжеНапоминалка()" Напоминалку могут поставить свою да и удалить, в конце концов. Это не надежно |
|||
16
Очкарик
01.03.13
✎
23:39
|
(15) > Напоминалку могут поставить свою да и удалить, в конце концов. Это не надежно
Напоминалка является документом строгого регламентного учета или чисто эмпирическое напоминание пользователю о каких-то событиях? |
|||
17
SeiOkami
01.03.13
✎
23:41
|
(16), не стоит в дебри заходить...
Т.е. нет типового способа для определения первого проведения? На подобии ЭтоНовый(). |
|||
18
Очкарик
01.03.13
✎
23:42
|
(17) я тебе их выше все описал. Они есть.
|
|||
19
Очкарик
01.03.13
✎
23:44
|
(17) Сделай так
Если НЕ ЕстьУжеНапоминалкаКотораяАвтоматическиСозданаПриПервомПроведении() Тогда УстановитьНапоминалку() КонецЕсли; |
|||
20
Очкарик
01.03.13
✎
23:45
|
+(19) Или сейчас начнешь грузить тем, что можно поставить пометку удаления на напоминалку и вычистить её из базы, а она когда-то была?
|
|||
21
SeiOkami
01.03.13
✎
23:50
|
(20), это РС. Напоминалка удаляется простым нажатием кнопки "Прекратить"... насколько я понял
|
|||
22
Очкарик
01.03.13
✎
23:52
|
(21) Добавь в РС свой реквизит типа "ФлагАвтосозданияНапоминалки".
А модуле менеджера РС обрабатывай событие: Если ФлагФлагАвтосозданияНапоминалки Тогда НельзяУдалитьЮзеруЭтуЗапись(); КонецЕсли; |
|||
23
SeiOkami
01.03.13
✎
23:53
|
(22), вот я о чем и говорю. Заходишь в дебри...
|
|||
24
Кокос
01.03.13
✎
23:53
|
делай реквизит или регистр сведений. по другому никак.
|
|||
25
Очкарик
01.03.13
✎
23:54
|
(23) да ты сам загоняешься какой-то надуманной проблемой :)
|
|||
26
SeiOkami
01.03.13
✎
23:57
|
(25), ну не знаю. По моему проблема вполне реальная. Нужно все предусмотреть
|
|||
27
Злопчинский
02.03.13
✎
01:26
|
нафиг реквизит сведений?
делать как обычно с древних времен, точно так же как фиксируется пробитие чека пр проведении дока. взводим реквизит типа "чек пробит" и все. |
|||
28
MrStomak
02.03.13
✎
10:56
|
Через дополнительные свойства. Подписка "ПередзЗаписью" ставит "Если Объект.Ссылка=блаблабла.ПустаяСсылка() Тогда ДополнительныеСвойства.Вставить("НужнаНапоминалка",Истина").
Потом подписка при проведении читает это допсвойство. Работать будет только если док сразу проводится, а не сначала записывается, а потом проводится. Система никак не фиксирует отдельно факт первого проведения, для того, чтобы работало даже с последовательной записью-проведением нужен доп.реквизит, регистр сведений или чето-такое. |
|||
29
SeiOkami
02.03.13
✎
11:12
|
(27), а при копировании документа реквизит не скопируется?
(28), хорошая идея. Только нужно тогда в режиме предприятия создать доп реквизит? |
|||
30
Reset
02.03.13
✎
11:15
|
(29) Скопируется, разумеется. Но ты же программист, и знаешь про обработчик ПриКопировании
|
|||
31
Reset
02.03.13
✎
11:17
|
Чем, кстати, для твого "первого" проведения отличается скопированный документ и уже ранее проводимый, но который сняли с проведения и изменили перед "повторным" проведением все ключевые реквизиты? :)
|
|||
32
Reset
02.03.13
✎
11:19
|
Имхо, понятие "первое" проведение как-то туманно
|
|||
33
GANR
02.03.13
✎
11:20
|
(0) Регистр сведений "Проведенные документы", например, НЕ подчиненный регистратору. При первом проведении добавлять запись, а потом смотреть - был проведен документ ранее или нет.
|
|||
34
Asmody
02.03.13
✎
11:22
|
(27) при проведении менять реквизиты документа не айс.
|
|||
35
GANR
02.03.13
✎
11:23
|
Если запрос к регистру (33) с отбором по Документу вернет пустой результат - значит первое проведение.
|
|||
36
GANR
02.03.13
✎
11:24
|
(34) +1
|
|||
37
Reset
02.03.13
✎
11:30
|
(34) Почему? в ПередЗаписью() имхо нормально
|
|||
38
Reset
02.03.13
✎
11:37
|
Имхо РС удобней (если, конечно, (14) недостаточно) - т.к. при тщательном продумывании моментов типа (31) и тп, выяснится что просто булева "первый" недостаточно и потребуются несколько реквизитов, которые, фактически, с документом не связаны и их лучше вытащить в отдельную сущность
|
|||
39
SeiOkami
02.03.13
✎
11:38
|
(31), (32).
Это тоже самое, что сказать, что стандартный метод ЭтоНовый() какие туманные результаты выдает ;) Так а чем РС лучше реквизита? |
|||
40
Reset
02.03.13
✎
11:40
|
(39) ЭтоНовый() дает совершенно конкретный результат
|
|||
41
SeiOkami
02.03.13
✎
11:41
|
(40), а если мы скопируем документ. проведенный ранее, то ЭтоНовый() не запутается... потому что это новый и все. Это я к (31)
|
|||
42
GANR
02.03.13
✎
11:52
|
(40)(41) ЭтоНовый() = Истина не значит, что он будет проведен, он может быть просто записан. Проведение у документа можно в принципе запретить. Лично я склоняюсь к регистру сведений.
А вообще можно голосовалку сделать: 1. Регистр сведений. 2. Реквизит. 3. ЭтоНовый() 4. Другое. |
|||
43
GANR
02.03.13
✎
11:55
|
+(42) ЭтоНовый() = Ложь также не значит, что документ НЕ проводится в первый раз.
|
|||
44
DexterMorgan
02.03.13
✎
12:05
|
ЭтоНовый() + анализировать проведение?
|
|||
45
Reset
02.03.13
✎
12:05
|
(42) "ЭтоНовый() = Истина не значит, что он будет проведен"
Ты полагаешь, что я считаю наоборот и хочешь меня разубедить? :) Это автор путается в новых, проведенных и своем прикладном смысле, которой приписывает этим событиям, не я) (42) 4.Другое (определиться чего хотим), потом, скорее всего 1. Регистр сведений |
|||
46
GANR
02.03.13
✎
12:10
|
(44) Это допустимо тогда и только тогда, когда имеет место проведение п е р м а н е н т н о е записи. А такое бывает далекоооо не всегда.
(45) Впрочем, если подступиться к решению проблемы м е т о д и ч е с к и - надобность ловить первое проведение попросту может отпасть. |
|||
47
Reset
02.03.13
✎
12:11
|
(46) Согласен)
|
|||
48
SeiOkami
02.03.13
✎
12:30
|
(46), а как тогда?
(45), повторю, что про ЭтоНовый() я тебе сказал в ответ на (31) (44), не вариант, можно ведь сначала просто записать |
|||
49
hhhh
02.03.13
✎
12:32
|
(48) ну в (0) тоже не то
источник.ссылка.проведен при первом проведении уже истина. Сначала ставится признак, что проведен, а потом уже начнает проводиться. |
|||
50
SeiOkami
02.03.13
✎
12:34
|
(49) ПередЗаписью()
|
|||
51
GANR
02.03.13
✎
12:56
|
(48) >а как тогда?
Регистр сведений, либо, на худой конец, реквизит. |
|||
52
GANR
02.03.13
✎
12:56
|
+(51) подробности - выше
|
|||
53
МегаБум
02.03.13
✎
13:10
|
Процедура ПриПроведении()
Если Проведен()=1 тогда сообщить("Первое проведение"); КонецЕсли; КонецПроцедуры |
|||
54
МегаБум
02.03.13
✎
13:10
|
т.фу,
Процедура ПриПроведении() Если Проведен()=0 тогда сообщить("Первое проведение"); КонецЕсли; КонецПроцедуры |
|||
55
МегаБум
02.03.13
✎
13:12
|
(0) "Но ведь он будет ловить каждое проведение не проведенного документа" - а иначе - неверная постановка задачи
|
|||
56
SeiOkami
02.03.13
✎
13:14
|
(55), где неверная постановка задачи?
|
|||
57
SeiOkami
02.03.13
✎
13:15
|
(54), а что за Проведен() ?
|
|||
58
hhhh
02.03.13
✎
13:16
|
(54) это не 7.7, тут не прокатит. При первом проведении Проведен = 1
|
|||
59
Кокос
02.03.13
✎
14:19
|
(58) не поверишь. и в 7рке тоже не прокатит :))
|
|||
60
MrStomak
02.03.13
✎
15:25
|
Предложу ради прикола еще один самый медленный, ненадежный, работающий по-разному на разных копиях баз и вообще бесполезный вариант: при проведении программно читать журнал регистрации с отбором по ссылке на прводимый документ и событие проведения!
|
|||
61
SeiOkami
02.03.13
✎
15:32
|
(60), да такая мысль тоже возникала xD
И еще. Если включено версионирование объектов, то можно проверять каждую версию начиная с первой, пока не найдется проведенная =) Это из жанра "я оуенный хацкер-программист!" =] В результате сделал как советовали изначально. РС. Всем спасибо за обсуждение =) |
|||
62
GANR
02.03.13
✎
16:01
|
(60) А по проблеме v8: Красный цвет в остатках см. сообщение №8.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |