|
Время жизни переменной модуля набора записей | ☑ | ||
---|---|---|---|---|
0
Humandra
12.03.12
✎
13:17
|
А что, переменные модуля набора записей долго не живут? Как бы им жизнь продлить на время жизни объекта (не сессии!).
Проблема такая: Есть модуль набора записей. В нем есть два события ОбработкаПроверкиЗаполнения и ПередЗаписью Как мне в ПередЗаписью узнать, что для этого объекта=этого набора записей уже выполнялась ОбработкаПроверкиЗаполнения? Это надо для того, чтобы в ПередЗаписью вызвать проверку заполнения, но только в том случае, если она уже не была ранее интерактивно вызвана. Думала завести переменную ВыполненаПроверка. Но если ее не инициализировать, то присвоение ей значения вызывает ошибку типов. А если инициализировать, то она, похоже, повторно инициализируется на каждом событии. По крайней мере если: 1) В модуле инициализировать ВыполненаПроверка = Ложь; 2) в ОбработкаПроверкиЗаполнения сделать ВыполненаПроверка = Истина; То в ПередЗаписью она все равно ложь, даже если ОбработкаПроверкиЗаполнения вызывалась (проверено, что вызывалась) |
|||
1
Kashemir
12.03.12
✎
13:19
|
Копай в сторону ДополнительныеСвойства
|
|||
2
Humandra
12.03.12
✎
13:23
|
(1) Сенкс, кажется подойдет.
|
|||
3
vmv
12.03.12
✎
13:29
|
кройте тему, а то я опять начну проявлять сомнения, хотя (1) прав абсалютна
|
|||
4
vmv
12.03.12
✎
13:31
|
ДополнительныеСвойства.Добавить("МойФлагПроверки")
это строка должна быть "при рождении" объекта или набора записей, чтобы в обработчиках событий модификации этот флаг уже был доступен для анализа/установки |
|||
5
Humandra
12.03.12
✎
13:33
|
(4) Ага, сенкс, уже сделала, вроде работает.
|
|||
6
Humandra
12.03.12
✎
13:37
|
(4) Только немного не так, это Структура, так что:
ДополнительныеСвойства.Вставить("ПроверкаЗаполненияВыполнена", Ложь); |
|||
7
Humandra
12.03.12
✎
13:44
|
А нет, ни фига. Не работает. Ошибок не выдает, но все равно не сохраняет значение между методами. Или это я косячу?
Делаю: в модуле ДополнительныеСвойства.Вставить("ПроверкаЗаполненияВыполнена", Ложь); в методе ОбработкаПроверкиЗаполнения пробовала ДополнительныеСвойства.Вставить("ПроверкаЗаполненияВыполнена", Истина); и ДополнительныеСвойства.ПроверкаЗаполненияВыполнена = Истина; в методе ПередЗаписью все равно Ложь, хотя ОбработкаПроверкиЗаполнения вызывается. Также пробовала везде писать ЭтотОбъект.ДополнительныеСвойства. |
|||
8
Maxus43
12.03.12
✎
13:47
|
>>ОбработкаПроверкиЗаполнения
там же параметры есть у процедуры, там список проверяемых полей, оттуда удалить - не будет проверяться. "ПроверяемыеРеквизиты" параметр. Или я не понял что прверяем |
|||
9
Feanor
12.03.12
✎
13:49
|
(7) по-моему есть один момент с набором записей, вроде сначала пишется пустой набор записей с отбором, потом пишется уже нужный, если я ничего не путаю.
|
|||
10
Maxus43
12.03.12
✎
13:50
|
(9) в типовых в толстых клиентах так было, тут я точно незнаю
|
|||
11
H A D G E H O G s
12.03.12
✎
13:53
|
Поди управляемое приложение
|
|||
12
vmv
12.03.12
✎
13:54
|
(7) а что выполняется первым, какое событие
ПередЗаписью() Или ОбработкаПроверкиЗаполнения() я бы сначала это выяснил, потом пенял на зеркало) |
|||
13
Humandra
12.03.12
✎
13:55
|
Вписала в модуль перед инициализацией ДопСвойств
Сообщить("УстановленОбъект"); результат: вызывается дважды :( Естественно, перетирает сохраненное значение. Нда. (8) Не, у меня другой случай, возможно извращенный, но не тот :) Хочу, чтобы на ПередЗаписью был код проверки допустимости реквизитов (на случай, если в регистр будут писать программно и забудут вызвать метод ПроверитьЗаполнение). Но если код проверки писать только на ПередЗаписью, в случае ошибки вылезет системное сообщение. А если его вызвать и в ОбработкаПроверкиЗаполнения, то при Отказ = Истина в этом событии не лезет системное сообщение, и до ПередЗаписью не дойдет. Но, если проверка пройдена, тогда дойдет до ПередЗаписью. И вот в этом случае я не хочу дважды проверять. (12) Первым выполняется ОбработкаПроверкиЗаполнения(), это точно. (9) О! Возможно в этом собака покопалась... |
|||
14
vmv
12.03.12
✎
13:55
|
(11) решите задачу, как избавить юзеров от сообщений системы при неудачной попытке записи, например, когда не все данные заполнены.
Психика у юзеров тонкая, нельзя выводить ругательства системы) |
|||
15
Humandra
12.03.12
✎
13:56
|
(11) Ага, оно. УФ.
|
|||
16
Feanor
12.03.12
✎
13:56
|
(14) перехватывай сообщения и передавай в вежливой форме )
|
|||
17
vmv
12.03.12
✎
13:57
|
(13) правильно, метод ПроверкаЗаполнения() вызывает 2-й раз, по мотивам первой ветки.
мож лучше пением займетесь) |
|||
18
Feanor
12.03.12
✎
13:58
|
про фотку уже было, кстати? :)
|
|||
19
Humandra
12.03.12
✎
14:01
|
(17) Нету у меня никакого ПроверкиЗаполнения пока. Есть только события, две штуки. И тестирую на форме регистра. Пою я тоже, в караоке, вас не приглашаю, вы грубый :)
(16) Неудобно перехватывать. В ПередЗаписью - не перехватишь. Значит, надо перехватывать в каждой форме, да еще и анализировать на предмет вида и источника ошибки (нельзя заменять текст ошибки с СУБД на текст ошибки с неправильными реквизитами, например) |
|||
20
Feanor
12.03.12
✎
14:03
|
(19) а миня пригласите ? )))
|
|||
21
Humandra
12.03.12
✎
14:04
|
(20) Пригласила бы, но города не совпадают :))) Вы вроде пока джентльмен, не обижаете :)
|
|||
22
vmv
12.03.12
✎
14:04
|
(20) если ты решишь задачу, думаю даже на танец, поднажми.
я не буду подсказывать) |
|||
23
Humandra
12.03.12
✎
14:07
|
Решила сама :)
Вообще не надо инициализировать в модуле. Тогда значение сохраняется, а иначе - при вызове события повторно переинициализируется. |
|||
24
Humandra
12.03.12
✎
14:08
|
(23) Не пойму только, можно ли на такое поведения рассчитывать...
|
|||
25
Kashemir
12.03.12
✎
14:18
|
(24) На дополнительные свойства можно рассчитывать на время жизни конкретного экземпляра объекта
|
|||
26
Feanor
12.03.12
✎
14:33
|
(23) ничего не понял, какое значение и где сохраняется?
|
|||
27
Humandra
12.03.12
✎
14:39
|
(26) Значение, хранимое в ДополнительныхСвойствах. ДополнительныеСвойства.ПроверкаЗаполненияВыполнена.
Если в модуле набора записей писать так: Процедура ОбработкаПроверкиЗаполнения() ДополнительныеСвойства.Вставить("ПроверкаЗаполненияВыполнена", Истина); КонецПроцедуры Процедура ПередЗаписью() Если ДополнительныеСвойства.ПроверкаЗаполненияВыполнена Тогда ОбработкаПроверкиЗаполнения(); КонецЕсли КонецПроцедуры ДополнительныеСвойства.Вставить("ПроверкаЗаполненияВыполнена", Ложь); то в модуле ПередЗаписью значение ПроверкаЗаполненияВыполнена = Ложь, несмотря на то, что ОбработкаПроверкиЗаполнения() была вызвана. Видимо потому, что код тела модуля вызывается каждый раз перед каждым событием. А если закомментировать: //ДополнительныеСвойства.Вставить("ПроверкаЗаполненияВыполнена", Ложь); то все работает, значение сохраняется. |
|||
28
Kashemir
12.03.12
✎
14:43
|
(27) Можно сделать проще, без проверки значения - просто проверять на существование свойства(задача вроде это позволяет).
Если ДополнительныеСвойства.Свойство("ПроверкаЗаполненияВыполнена") Тогда |
|||
29
Kashemir
12.03.12
✎
14:44
|
+(28)
Процедура ОбработкаПроверкиЗаполнения() ДополнительныеСвойства.Вставить("ПроверкаЗаполненияВыполнена", Истина); КонецПроцедуры Процедура ПередЗаписью() Если ДополнительныеСвойства.Свойство("ПроверкаЗаполненияВыполнена") Тогда ОбработкаПроверкиЗаполнения(); КонецЕсли КонецПроцедуры |
|||
30
Kashemir
12.03.12
✎
14:45
|
(29) Т.е. в данном случае НЕ ДополнительныеСвойства.Свойство("ПроверкаЗаполненияВыполнена")
|
|||
31
Humandra
12.03.12
✎
14:47
|
(30) Да, конечно НЕ. Опечатка на форуме, сенкс (в коде было правильно).
|
|||
32
Feanor
12.03.12
✎
15:22
|
(31) и всё же, "Россия" - как то не информативно, м.б. на самом деле в одном городе живём))
|
|||
33
vmv
12.03.12
✎
15:25
|
(32) Она в Магадане, тебе всего три дня на оленях - снег то еще крепок, я бы смотался, но у меня лошади и саней нету(
|
|||
34
Feanor
12.03.12
✎
15:25
|
(33) инфа 100%? )
|
|||
35
Feanor
12.03.12
✎
15:26
|
+(34) про Магадан
З.Ы. срочно возьму в аренду ищу лошадей и саней |
|||
36
vmv
12.03.12
✎
15:26
|
34. не веришь, спроси у Фито - это мой брательник)
|
|||
37
Feanor
12.03.12
✎
15:28
|
(36) ху из Фито? О.о
|
|||
38
Humandra
12.03.12
✎
16:18
|
Вы таки будете смеяться, но оно все равно не пашет :( Это я уже сгоряча в (27) ляпнула, что оно работает. На самом деле то, что оно работало, было багом :)
Не работает, теряет значение. Что за нафик :( |
|||
39
Humandra
12.03.12
✎
16:18
|
(38) Может кто не поленится, и проверит у себя на тестовом примере? Именно на регистре сведений? А то я уже себе не верю.
|
|||
40
Feanor
12.03.12
✎
16:23
|
(39) если записывать из формы записи регистра сведений, то у меня тоже не работает.
|
|||
41
Kashemir
12.03.12
✎
16:25
|
(38) Значит объект набор сведений первый <> объект набор сведений второй.
|
|||
42
Feanor
12.03.12
✎
16:27
|
+(40) РегистрСведенийМенеджерЗаписи:
Описание: Позволяет читать, записывать и удалять отдельную запись регистра сведений. Используется только для регистров сведений, неизменяемых регистраторами, т.е. для которых в конфигураторе установлен режим записи "Независимый". Предназначен для интерактивной работы с записью регистра сведений. Доступ (чтение и запись) к записям регистра сведений производится объектом РегистрСведенийНаборЗаписей.<Имя регистра сведений> на системном уровне. При этом, в общем случае, используются два набора записей: один предназначен для удаления "старой" записи, другой - для записи данных, определенных менеджером записи. Это проявляется, например, в том, что при выполнении записи могут дважды вызываться события ПередЗаписью и ПриЗаписи объекта РегистрСведенийНаборЗаписей.<Имя регистра сведений>, сначала для пустого набора записей удаляющего "старую" запись, а затем для набора записей с новыми данными. |
|||
43
vmv
12.03.12
✎
16:30
|
(39) релиз платформы и тип формы требуется, че так пробовать, ну и гарантии исполнения арии Татьяны из оперы "Е. Онегин")
|
|||
44
vmv
12.03.12
✎
16:32
|
1. релиз платформы = ? например 8.8.999
2. тип формы редактирования записи = ? например обычная - форма записи варианты, мол, я вот окрываю одну форму, а в ней яйцо, а в яйце регистра, а в регистра канистра - не рассматриваються как заведомо ущербные) |
|||
45
Feanor
12.03.12
✎
16:35
|
Вопрос со способом передачи пения под караоке остается открытым ))
|
|||
46
Humandra
12.03.12
✎
18:53
|
(44) Платформа 1С:Предприятие 8.2 (8.2.15.289), форма управляемая, тест на умолчательной форме записи регистра сведений (т.е. форма вручную не добавлялась, генерируется автоматом), на данном тесте код только в модуле набора записей.
(41), (42) Но все равно непонятно, почему так. Допустим даже есть два набора записей, и первый - пустой. Но тогда, при интерактивном добавлении, мы бы имели просто две пары событий ОбработкаПроверкиЗаполнения() и ПередЗаписью(), так? Ну, или как вариант - не было бы события ОбработкаПроверкиЗаполнения для пустого набора. А тут, судя по тексту Сообщить() в обоих событиях, сами события таки вызываются 1 (один!) раз. НО! Сообщить() в тексте тела модуля вызывается аж 3 раза. Один раз до ОбработкаПроверкиЗаполнения и 2 раза после ОбработкаПроверкиЗаполнения но до ПередЗаписью. (45) Да... с караоке проблема... "Будете у нас в Магадане?" Или лучше к вам? :))) ЗЫ: Урал у нас, Урал, так что немного ошиблись :) |
|||
47
Humandra
12.03.12
✎
18:58
|
Дополнение к (46): насчет Сообщить() в теле модуля - при этом в тексте событий вроде ничего подозрительного, могущего вызвать создание объекта, нет.
Вообще вот полный текст модуля: Процедура ПроверитьПравильностьЗаполнения(Отказ, ПроверяемыеРеквизиты, ИсточникСобытия) ДополнительныеСвойства.Вставить("ПроверкаЗаполненияВыполнена", Истина); Сообщить("Проверка из " + ИсточникСобытия); КонецПроцедуры Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты) Сообщить("Вызов ОбработкаПроверкиЗаполнения"); ПроверитьПравильностьЗаполнения(Отказ, ПроверяемыеРеквизиты, "ОбработкаПроверкиЗаполнения"); КонецПроцедуры Процедура ПередЗаписью(Отказ, Замещение) Сообщить("Вызов перед записью"); ПроверкаЗаполненияВыполнена = ЭтотОбъект.ДополнительныеСвойства.Свойство("ПроверкаЗаполненияВыполнена") = Истина; // На случай, если тут вдруг Неопределено или какая другая бяка, смотрим что получили Сообщить(ПроверкаЗаполненияВыполнена); Если ПроверкаЗаполненияВыполнена Тогда ПроверитьПравильностьЗаполнения(Отказ, , "ПередЗаписью"); КонецЕсли; Отказ = Истина; // прерываем запись, чтобы успеть увидеть сообщения КонецПроцедуры Сообщить("Вызов объекта"); |
|||
48
Humandra
12.03.12
✎
19:24
|
Up, плиз... Есть идеи, как решить проблему? Не обязательно через ДополнительныеСвойства... Мне в голову что-то ничего разумного не лезет.
|
|||
49
Feanor
12.03.12
✎
20:10
|
(46) Ну почему не понятно. Платформа создает два совершенно разных набора записей. Первый, кстати, должен быть пустым, можно из этого исходить при проверке.
(47) >ЭтотОбъект.ДополнительныеСвойства.Свойство("ПроверкаЗаполненияВыполнена") = Истина; // На случай, если тут вдруг Неопределено или какая другая бяка, смотрим что получили метод "Свойство" у структуры немного не так работает ) (48) как вариант - из формы записи перед записью на сервере записи делать отказ записи, создавать набор записей ручками, заполнять из записи и записывать его. |
|||
50
Feanor
12.03.12
✎
20:12
|
+(49) согласен на прослушивание караоке по скайпу )))
|
|||
51
Feanor
12.03.12
✎
20:14
|
+(49) в 8.2 вместо "Сообщить" кошернее использовать объект "СообщениеПользователю"
|
|||
52
Humandra
12.03.12
✎
20:17
|
(49) А!!! Я буквально только что поняла, почему у меня перестало все нафиг работать, а до этого работало!!! Я идиотка. :))))
Вся проблема у меня была из-за чисто отладочном Отказ = Истина; в ПередЗаписью! :))) Все верно, вы все правильно говорили, проблема из-за 2 наборов записей. Но! Интерактивно вызывался первый обработчик: ОбработкаПроверкиЗаполнения(). И он в себе содержат ЭтотОбъект с непустым набором записей. А УЖЕ ПОСЛЕ вызывались ДВА события ПередЗаписью! Первый - с пустым набором, второй - с тем же самым непустым! Но до второго события не доходило дело, так как я прерывала запись! :)))) Если убрать такое прерывание, то надо просто добавить проверку на непустой набор, и все работает. Но блин, каких мучений это мне стоило. Вот оно, казалось бы - безобидный отладочный код. |
|||
53
Humandra
12.03.12
✎
20:20
|
(51) Ага, спасибо, я для пользователей его и использую, это чисто 7-чная привычка для быстрой отладки. Она меня и погубила - юзала бы отладчик сразу, быстрее бы поняла в чем дело :(
|
|||
54
Feanor
12.03.12
✎
20:21
|
(52) ну и славненько)
если проверять набор записей на количество записей, то нет никакого смысла использовать доп. свойство "ПроверкаЗаполненияВыполнена" |
|||
55
Humandra
12.03.12
✎
20:22
|
(54) Не, там по условию задачи по сути надо проверять в ПередЗаписью если раньше интерактивно не проверили. Т.е. это дополнительное условие, которое не зависит от пустого или не пустого набора.
|
|||
56
Humandra
12.03.12
✎
20:25
|
Всем спасибо за помощь, сама бы я дольше тупила с этими двумя вызовами :)
Караоке за мной :) |
|||
57
Feanor
12.03.12
✎
20:26
|
(56) ок, спрашивай есливчо) про караоке записал в тетрадку )))
|
|||
58
Humandra
12.03.12
✎
20:30
|
Кстати, а так и без ДополнительныхСвойств работает! С переменной модуля. Главное, не инициализировать ее в теле модуля. Она, кстати, тоже изменяется с объектом: для пустого набора записей - Неопределено, для непустого - равна той, что в присвоении. Интересно, насколько это надежно...
|
|||
59
Feanor
12.03.12
✎
20:46
|
и вообще, екатеринбуржцам уже пора спать )))
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |