Имя: Пароль:
1C
1С v8
УТ 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.
Программист всегда исправляет последнюю ошибку.