Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Последовательность вызова событий ТП и формы (число прочтений - 4854 )
karek
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 22
Зарегистрирован: 08. Сентября 2006
Последовательность вызова событий ТП и формы
08. Декабря 2009 :: 09:48
Печать  
Всем добрый день.

Возникла следующая проблема.

Все дело происходит в форме справочника. Есть табличное поле. В обработчике тПоле_ПриРедактированииЗначения() выполняется куча действий по пересчету разных реквизитов и тп.
Так вот, некоторые пользователи после ввода значения в ячейку ТП не жмут Enter или Таb, а сразу мышкой жмут кнопку Записать. При этом наткнулся на два возможных варианта поведения системы:
1) тПоле_ПриРедактированииЗначения() не отрабатывает, а сразу вызывается обработчик кнопки Записать (#Записать?).  После того как он отработал, вызывается тПоле_ПриРедактированииЗначения(), но в моем случае вываливается с ошибкой, поскольку тек. строка в ТП уже съехала.
2) вызывается тПоле_ПриРедактированииЗначения(), но не вызывается обработчик кнопки Записать, то есть такое пустое нажатие кнопки.

Понятно что оба варианта не устраивают, и если во втором случае пользователь получает просто неприятный эффект, то в первом нарушается логика работы всей формы.

От чего зависит по какому варианту будут развиваться события я не смог выяснить.

Кто-нибудь сталкивался с этим, можно это как-то побороть? Или только изменением логики + объяснять пользователям как правильно вводить данные в ТП?
По форуму поискал, но ничего подобного не нашел.

Спасибо
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Последовательность вызова событий ТП и формы
Ответ #1 - 08. Декабря 2009 :: 10:55
Печать  
1. Версия icpp?
2. Тест можешь сделать?
  

De quelle planète es-tu?
Наверх
 
IP записан
 
karek
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 22
Зарегистрирован: 08. Сентября 2006
Re: Последовательность вызова событий ТП и формы
Ответ #2 - 08. Декабря 2009 :: 13:14
Печать  
Смотрел и на 22 и на 23-й версии icpp.

Вобщем-то пример приложил (нужен соотв-но 1cpp и formex).

Как тестировал.
Создаем новый элемент справочника.
- меняем сумму в таблице - меняется общая сумма (реквизит справочника);
- затем меняем сумму, и не выходя из ячейки жмем Записать. При этом общая сумма не меняется (в обработчик ячейки специально вставил задержку 0.6 секунд).
- ставим галочку "без задержки" (при этом задержки в обработке поля "сумма" не будет) и повторяем предыдущую послед-ть действий. Видим, что прежде чем выскакивает вопрос "Записать?" общая сумма меняется.

Вобщем-то мои изыскания показали что последовательность вызовов правильная - сначала вызывается обработчик ячейки ТП, а затем обработчик кнопки, и все отрабатывается.
НО в обработчике ячейки после всех расчетов вызывается Форма.Обновить(). Это нужно чтобы реквизит справочника Сумма на форме обновился.
Так вот, если обработчик ячейки работает долго, то форма не успевает обновиться до вызова обработчика кнопки Записать, и изменения общей суммы не сохраняются в справочнике.
Если же обработчик ячейки отработал быстро и форма обновилась перед вызовом обработчика кнопки, то все ок.

Надеюсь понятно объяснил Улыбка
  

test_012.zip ( 10 KB | Загрузки )
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Последовательность вызова событий ТП и формы
Ответ #3 - 08. Декабря 2009 :: 17:19
Печать  
karek писал(а) 08. Декабря 2009 :: 13:14:
Надеюсь понятно объяснил Улыбка

Вполне Улыбка

Ну что же, отлично.
На основании этой информации, я бы сформулировал правила пользования EV следующим образом:

Цитата:
В событии ПриРедактированииЗначения модификация реквизитов формы недопустима.


1С не просто не успевает обновить форму, она еще продолжает использовать старые значения реквизитов в событии "ПриЗаписи".
Это хорошо видно, если добавить отладочную печать.

Поскольку причины такого поведения находятся глубоко в недрах внутренних механизмов 1С, похоже, без подобного ограничения не обойтись.
Пойдет такая формулировка или будут лучшие предложения? Подмигивание
  

test_012a.rar ( 7 KB | Загрузки )

De quelle planète es-tu?
Наверх
 
IP записан
 
karek
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 22
Зарегистрирован: 08. Сентября 2006
Re: Последовательность вызова событий ТП и формы
Ответ #4 - 08. Декабря 2009 :: 19:22
Печать  
Ну, я б сказал, допустима, но с определенными ограничениями Улыбка

я в своем случае обошел эту ситуацию на уровне бизнес-логики, в лоб, дополнительно добавив пересчет реквизитов справочника в проц. ПриЗаписи().

Но вобще странно, что реквизиты справочника обновляются только с обновлением формы, вроде ж как элемент справочника первичен, форма - вторична Улыбка
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Последовательность вызова событий ТП и формы
Ответ #5 - 09. Декабря 2009 :: 12:18
Печать  
Ну, здесь моя задача - сформулировать общие ограничения.
А что с ними делать дальше - можно уже решать в каждом конкретном случае.

В итоге, отражено в местной документации.
Полезная получилась тема.
  

De quelle planète es-tu?
Наверх
 
IP записан
 
karek
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 22
Зарегистрирован: 08. Сентября 2006
Re: Последовательность вызова событий ТП и формы
Ответ #6 - 09. Декабря 2009 :: 13:58
Печать  
Кстати, я еще немного поковырялся, и вот что заметил.

Описанный выше негативный эффект срабатывает только в том случае, если устанавливаемый реквизит есть на форме.

То есть в моем случае на форме есть реквизит справочника Сумма. Если мы его удалим с формы, а для отображения суммы вставим, например, элемент диалога Текст, то все работает как надо независимо от задержек обработчика ячейки ТП.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать