Имя: Пароль:
1C
1С v8
Как запретить ввод некорректных данных?
0 ChAlex
 
14.02.12
14:59
Итак управляемая форма, на ней таблица. Необходимо запретить ввод некорректных данных в некую колонку. В методе ПередОкончаниемРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования, Отказ) если пользователь не отказался от ввода делаем проверку и устанавливаем Отказ=Истина и выдаем предупреждение пользователю. Естественно возвращаемся в режим редактирования. После этого нажимаем Esc и вуаля - некорректные данные успешно внесены в таблицу. Что бы избежать данной возможности нужно всегда проверять на корректность данные, независимо от того отказался пользователь в от изменений или нет.

Как-то не логично это
1 DrShad
 
14.02.12
15:07
а что за данные?
2 Mort
 
14.02.12
15:09
Не логично задра4ивать пользователя тупыми сообщениями.
3 Mort
 
14.02.12
15:14
Провел эксперимент. Всё работает нормально. Код покажи.
4 Reset
 
14.02.12
15:16
Проблема в коде (кодере)
5 Mort
 
14.02.12
15:16
Хот не вру. Если есть предупреждение, то есть косяк.
6 vinogradъ
 
14.02.12
15:16
(0) "устанавливаем Отказ=Истина и выдаем предупреждение пользователю"
очищай значение при этом
7 Mort
 
14.02.12
15:18
А вообще, не надо пользователю ничего предупреждать пока он вводит в ТЧ что-то. Это раздражает.
8 ChAlex
 
14.02.12
16:44
Можно написать разные варианты обработки. Вот первый, который вроде бы должен быть по логике вещей:

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

Немного пояснений. Параметр ОтменаРедактирования=Истина - если пользователь отказался от редактирования. Логично ничего не делать в этом случае и система должна остаться в том виде, как и до редактирования. Как раз в таком варианте и происходит обман, о котором я и писал.

Если процедуру скорректировать на

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

       .... чего-то делаем или нет
   КонецЕсли;
КонецПроцедуры

То тогда не обойдешь.

В этом как раз и нет логики. Нафиг что-либо делать, если пользователь отказался от ввода данных, но что бы не попасть на артефакт - приходится все равно обрабатывать, причем во втором случае до тех пор, пока пользователь не введет правильных данных. А если он вообще уехал и не знает что было до редактирования и что нужно бы ввести что бы было правильно - то процесс бесконечный. Куда проще (да и правильно) при отказе вернуть поле в первоначальное состояние да и все. Но нет. Тут надо поизвращаться, если захочешь это реализовать.
9 ChAlex
 
14.02.12
17:47
(7) в данном случае он редактирует - это раз, а во во-вторых если ничего не сообщать и при этом не разрешать завершение редактирования - то это сначала будет пользователя уводить в ступор и на крики типа "ничего не работает", а потом раздражать что нельзя было подсказать что делает он не так.
10 kosts
 
14.02.12
17:53
(0) При вводе некорректных данных не делать отказ и не возвращать старое значение. И даже разрешить запись. Хочет 200 пусть будет 200.
Но если это неверное значение, то подсветить его красным. И запретить проведение. В проведение и выдать сообщение о проблеме.
11 ChAlex
 
14.02.12
18:11
(10) - понимание что делать при вводе некорректных данных - у каждого разное. Если даете в руки обезьяне гранату, то позаботьтесь о том что бы чека была надежно зафиксирована, а то ведь не ровен час и вам достанется. Разрешать пользователю вводить все что ему заблагорассудится - порочная практика, ибо лень, невнимательность,халатность и просто ради понта приводят к общей раздражительности всех. я уже не говорю про последствия. Если на форме несколько сотен строк, а еще вдобавок кривые данные не видны на форме, то что можно видеть и реагировать?..
12 kosts
 
14.02.12
18:44
(11) Много надумано. Юзеры тоже люди.
Ужасно бесят модальные сообщения по каждому чиху и запрещения на ровном месте.
Получив запрет при проведении, пользователи быстро поймут значение красной ячейки. Причем если много строк, то можно вывести под таблицей строку в которой будет написано, что есть ошибки.

Если строк действительно много, ну выдай сообщение, но не запрещай ввод.
13 FIXXXL
 
14.02.12
18:54
(11) проще перед записью все ТЗ пробежаться по ТЗ и выдать одно сообщение типа "в строкеNN неверные данные"
14 FIXXXL
 
14.02.12
18:54
(13) *всеЙ ТЗ
15 Mashinist
 
14.02.12
19:16
Люди дело говорят
особенно если учесть что ТС пытается контролировать
Если Элемент.ТекущиеДанные.КОтгрузке>Элемент.ТекущиеДанные.ВРезерве Тогда

т.е. если пользователь просто хочет ввести КОтгружке больше чем с текущих данных есть ВРезерве, то пользователя уже посылают
А рано. Может о просто готовит документ
И как раз к моменту проведения условие выпониться
И главное, что при проведении все равно проверять это же условие и все равно выдавать отказ в случае чего...

не нужно так делать, ТС
16 ChAlex
 
14.02.12
20:32
(15) - Он ничего не готовит. Уже все подготовлено. Он только решает - отгрузить все или нет! Поэтому ультимативные советы на все случаи жизни -  ну наверное не уместны. Искать потом строки с ошибками и их исправлять  - двойная работа. Ибо по введенным данным в режиме онлайн принимается решение - грузит не грузить, еще что-то кому-то добавить и т.п. исходя из множества критериев (загрузки машины, суммы отгрузки, региона отгрузки и т.п.) И эти данные критичны еще до сохранения значений. (Или сохранять таблицу после ввода каждого значения - это нормальный режим работы?!!) Ну кривые у него руки и понаставлял кому нибудь хрен знает чего, забил воздухом машину, прободаля пол-дня, а потом перед сохранением узнал, что все нахрен по-новому! Так что в данном контексте все остальные советы не контролировать и не запрещать - мне не подходят. И опять же вопрос не в этом, а чисто в поведении системы. Режим проверки и запрета введения некорректных данных имеется в любой мало-мальской СУБД. Вопрос в том - что логика этого поведения в 1С мне например не нравится, можно конечно сказать что это фича - а по мне - так это баг.
17 Mort
 
14.02.12
20:48
Особенно радует когда пользователь не сразу догадывается нажать на ESC. Он долбит на энтер и в мыслях посылает разработчика куда вслух сказать трудно.
18 Mort
 
14.02.12
20:52
А устанавливать максимальное допустимое значение в ячейке ещё опасней.
19 Mort
 
14.02.12
20:53
+(18) Но в некоторых случаях так лучше.
20 kosts
 
14.02.12
21:06
(16) Как будет решена проблема. Пока один оператор вводит сотню строк товаров, полагая, что он все правильно сделал, другой в это время уже отгрузил часть...
21 Armando
 
14.02.12
22:15
1. В обработчике ПередНачаломИзменения запомнить значение реквизита.
2. В ПередОкончаниемРедактирования, при ОтменаРедактирования = Истина возвращать значение реквизита.
22 ChAlex
 
14.02.12
23:30
(21) - это уже как сделать через Ж, то что должно работать по-нормальному. Ведь начало поведения объекта - по уму. Если начать редактирование и вместо Enter жмем Esc - все работает так, как положено: ничего не вызывается, значение назад восстанавливается. И поэтому совсем непонятно почему при событии ПередОкончаниемРедактирования - не сохранить то же поведение. Ведь валидность ввода еще не прошла, и одно событие и другое равнозначно. Подозреваю по Esc работатет штатная процедура библиотеки ADO, а вот ПередОкончаниемРедактирования - это уже продукт и логика чисто 1С.

Ладно, тему можно закрыть ибо она перешла в иную плоскость: а именно по принципу это лучше не делать ибо каждый считает по-своему почему именно не надо. Вот по этой же причине и жигули ездят так как жигули, а не как ауди или мерсы (нафига там какой-то навигатор - от него только одни замороки, нафига там датчика дождя, что влом рычажок дернуть, нахрена там датчики слепых зон и парковки - на них понадеешься - хлопот не оберешься....) Вот и ездят по дорогам гибриды, на которые без слез смотреть не возможно, а другие умиляются - а ведь едут!
23 Armando
 
15.02.12
07:41
(22) Пиши в 1С
24 Humandra
 
15.02.12
08:04
(10) Да не, иногда действительно важно проверить прямо при вводе данных. Помню, работала на мясокомбинате, там заказы операторы вводили не с листа торгового агента, а по телефону непосредственно от клиента. Клиент сказал - "Докторскую 10 батонов" и пошел дальше диктовать, а потом сразу повесил трубку, и не факт что у него есть телефон, чтобы ему перезвонить и сказать, что "Докторской есть только 5 батонов, может возьмете Молочной"?