|   |   | 
| 
 | Время жизни переменной модуля набора записей | ☑ | ||
|---|---|---|---|---|
| 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 | 
        и вообще, екатеринбуржцам уже пора спать )))     | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |