Имя: Пароль:
1C
1С v8
Время жизни переменной модуля набора записей
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
и вообще, екатеринбуржцам уже пора спать )))