User Rating: 0 / 5

Star InactiveStar InactiveStar InactiveStar InactiveStar Inactive
 

Привет

Недавно обнаружил интересную особенность работы обработчика события у поля ввода при условии, что тип не четкий (составной или любая ссылка), т.е. когда сначала выбираем тип данных, а потом сами данные. Т.к. платформа уходит от модальности то поведение поля ввода немного меняется. Раньше событие "ПриИзменении" возникало, когда пользователь закончил выбор данных. Сейчас же событие отрабатывает два раза: когда выбрали тип, когда выбрали данные. Хотя выбор по сути пользователь сделал единожды, но события разошлись и теперь это может привести к серьезным кривостям.

 



На обычных формах событие тоже срабатывало два раза, но там это и для пользователя выглядело очевидным. В обычных формах вместо трех точек была буква "Т" и сначала мы выбирали тип и появлялись три точки, а потом выбирали данные. Если тип уже был выбран, то повторно тип нас не просили выбирать, пока мы не очистим поле крестиком. Т.е. событи отрабатывало столько же раз, но это было очивидным. Мы каждый раз возвращались в форму к нашему полю ввода и видели результат своих действий.

В УФ тип выбирается каждый раз, когда мы нажимаем три точки. В момент выбора типа поле очищается и возникает событие, но мы этого не видим, нам открывают форму выбора данных.

А теперь представьте, что при изменении в поле, Вам надо выполнить некий пересчет и, самое главное, выполнить его по вопросу. Т.к. вопросы теперь здаются пользователю не методом "Вопрос", а "ПоказатьВопрос", то вопрос вылазиет не модально, а на заднем фоне при выборе типа и потом второй раз при выборе данных.

Приведем простой пример:

Форма с реквизитом "Документ" с типом "ДокументСсылка", т.е. любой документ. И пишем следующий код в обработчике события при измеении:

 

&НаКлиенте
Процедура ОбработатьОтветНаВопросОСохранении(РезультатВопросаОСохранении, ДополнительныеПараметры) Экспорт
Если РезультатВопросаОСохранении = КодВозвратаДиалога.Да Тогда
Сообщить("сохранил");
Модифицированность = Ложь;
КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ДокументПриИзменении(Элемент)
Если Модифицированность Тогда
ОбработчикОтветаНаВопрос = Новый ОписаниеОповещения("ОбработатьОтветНаВопросОСохранении", ЭтаФорма);
ПоказатьВопрос(ОбработчикОтветаНаВопрос, "Сохранить изменения?", РежимДиалогаВопрос.ДаНет,,,"Сохранить изменения",);
КонецЕсли;
КонецПроцедуры

 

Вот как это выглядит на экране, после того, как я выбрал документ:

Активный диалог вопроса я сдвинул, чтобы Вы увидели, что за ним спрятан второй. Когда меня программа два раза спрашивает одно и тоже я считаю кривостью.

Если бы в моем примере не было бы вопроса, а просто какая-то обработка, то пользователь ничего бы и не заметил, а обработчик просто выполнился бы два раза. Но выполнять обработку два раза - тоже не есть гуд.

Еще одна паршивость, что если Вы выбрали другой тип, а в форму выбора данных закрыли не выбрав ничего, то поле ввода очиститься, а не сохранит ранее выбранное значение. Вроде и раньше так было, но нет. раньше пользователь четко понимал, что сейчас происходит. Для вызова выбора списка типов, надо было очистить поле, и логично, что после нажатия крестика поле станет пустым.

Как с этим теперь жить?

 



Собственно нынешний подход (в статье описано поведение платформы 8.3.7.1860) работы с полем ввода составного типа очень не красивый. Я лично считаю, что у таких полей ввода надо однозначно снимать галку "Выбирать тип". Рисовать поле выбора типа и либо с помощью связи по типу, либо кодом устанавливать тип в поле выбора данных. Это позволит Вам отдельно обрабатывать выбор типа и выбор данных, ведь обработки могут выполняться по разному. например при изменении типа мы только очищаем поле ввода и нам часть действий алгоритма, возможно, не понадобится. Второй бонус такого подхода, пользователь знает, что он сменил тип и это приведет к очистке. Третий бонус, если тип менять не надо, то пользователь может его и не выбирать, мы сэкономим один диалог выбора.

 

 

Вложения
Download this file (PoleVvoda.epf)Поле ввода[ ]6 kB

Авторизуйтесь пожалуйста