ОкончаниеВводаТекста - странности.

1. Serega-artem 16 12.12.15 18:57 Сейчас в теме
Добрый вечер!

Столкнулся со странной ситуацией, гугл не помог!

Управляемая форма, поле ввода, источник данных реквизит типа "строка". Задача простая - нужно проверять введенное в строку, и если данные проверку не проходят, то восстанавливать прежние данные. Сделал обработку события "ОкончаниеВводаТекста". Столкнулся с непонятным (для меня) поведением платформы.

&НаКлиенте
Процедура МобильныйТелефонОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь; 
КонецПроцедуры


Вместо очистки строки выводится непонятное сообщение (см. картинку). Но самое смешное, та же конфигурация, другой справочник, тоже поле ввода, тоже "строка", обработка того же события - РАБОТАЕТ!
Прикрепленные файлы:
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Serega-artem 16 13.12.15 10:15 Сейчас в теме
Ни у кого нет идей? Или просто выходные?) Понятно, что проблему можно обойти разными способами, просто интересно что делаю не так.
3. dj_serega 392 13.12.15 11:55 Сейчас в теме
А как строку очищаете?
4. Serega-artem 16 13.12.15 14:18 Сейчас в теме
(3) dj_serega, Так как раз эта конструкция и должна очищать строку. Вернее, не очищать, а возвращать прежнее значение. Я специально оставил до предела простой код, чтобы не грешить на то, что я там при проверке что-то не так сделал. И, повторюсь, этот код работает в другом справочнике этой-же конфигурации. Пытался сравнивать в чем различия - вроде всё одно и то же: поле ввода, источник данных реквизит с типом "строка", и там и там строка имеет ограничение по символам... Что платформе не нравится? Сейчас попробовал создать с одним реквизитом типа "строка", ограничением в 10 символов. Вывел на форму, как поле ввода, подцепил обработку этого-же события. Так же ошибка... В крайнем замешательстве ушел "копать" дальше...
5. Serega-artem 16 13.12.15 15:16 Сейчас в теме
Мистика какая-то.... Одна конфигурация, два справочника в первом:

&НаКлиенте
Процедура ИННОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, СтандартнаяОбработка)
Если ПроверкаНаДобавленноеСТакимИНН (Текст) тогда 
		СтандартнаяОбработка = Ложь;
КонецЕсли; 	
КонецПроцедуры


Функция ПроверкаНаДобавленноеСТакимИНН (ИНН)
Отказ = Ложь; 
Если НЕ ПустаяСтрока(ИНН) тогда
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
               |	ЮридическиеЛица.Ссылка
               |ИЗ
               |	Справочник.ЮридическиеЛица КАК ЮридическиеЛица
               |ГДЕ
               |	ЮридическиеЛица.ИНН = &ИНН
               |	И ЮридическиеЛица.Ссылка <> &Ссылка"; 
Запрос.УстановитьПараметр("ИНН",ИНН);
Запрос.УстановитьПараметр("Ссылка",Объект.Ссылка); 
Рез = Запрос.Выполнить(); 
Если НЕ Рез.Пустой() тогда
	Отказ = Истина;
	Сообщить("Уже есть юр. лицо с таким ИНН!");
КонецЕсли; 	
КонецЕсли; 

Возврат Отказ; 
КонецФункции 
Показать



Отлично работает. Если функция проверки возвращает истину, то поле очищается (восстанавливается старое значение.

Другой справочник:

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


Функция ПроверкаНаСозданногоСТакимТелефоном (Тел)
	Отказ = Ложь; 
	Если Не ПустаяСтрока(Тел) тогда 
		Запрос = Новый Запрос;
		Запрос.Текст = "ВЫБРАТЬ
		               |	Благополучатели.Ссылка
		               |ИЗ
		               |	Справочник.Благополучатели КАК Благополучатели
		               |ГДЕ
		               |	Благополучатели.МобильныйТелефон = &МобильныйТелефон
		               |	И Благополучатели.Ссылка <> &Ссылка";
					   
		Запрос.УстановитьПараметр("МобильныйТелефон",Тел); 
		Запрос.УстановитьПараметр("Ссылка",Объект.Ссылка);
		Рез = Запрос.Выполнить();
		Если  Не Рез.Пустой() тогда 
			Отказ = истина; 
			Сообщить("Уже есть благополучатель с такими данными!"); 
		КонецЕсли; 	
	КонецЕсли; 
	Возврат Отказ;
КонецФункции
Показать



Если функция проверки возвращает истину, ошибка по типу той, что на скрине в первом посте.

Создал обработку из одного реквизита "ИНН", строка, длина 12 (как в первом справочнике)

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


Функция ПроверитьВведенныйТекст (ИНН)
	Отказ = Ложь; 
	Если НЕ ПустаяСтрока(ИНН) тогда
	Если ИНН = "123" тогда
		Отказ = Истина;
		Сообщить("Текст не прошел проверу!");
	КонецЕсли; 
	КонецЕсли; 
	Возврат Отказ; 
КонецФункции
Показать


НЕ работает (та же ошибка про "не найдено").... Уже не знаю куда думать.

Можно конечно запоминать старое значение, очищать поле, вставлять старое значение. Но это уже костыли. Хочется понять, почему в первом случаи всё идеально отрабатывает, в остальных валится в ошибку.
6. Messenger Unchained 13.12.15 15:38 Сейчас в теме
Гугл ему не помог...

ИсторияВыбораПриВводе

И в том же синтакс-помощнике, куда ты полезешь читать, что это такое, обрати внимание на описание ОкончаниеВводаТекста:
...
Примечание:
В обработчике данного события нельзя использовать серверные методы формы с директивой компиляции &НаСервере.
7. Serega-artem 16 13.12.15 16:00 Сейчас в теме
(6) Messenger Unchained,

ИсторияВыбораПриВводе


Это вообще к чему, о чем и для чего? Вопрос совершенно о другом!

И в том же синтакс-помощнике, куда ты полезешь читать, что это такое, обрати внимание на описание ОкончаниеВводаТекста:
...
Примечание:
В обработчике данного события нельзя использовать серверные методы формы с директивой компиляции &НаСервере.


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

&НаКлиенте
Функция ПроверитьВведенныйТекст (ИНН)
	Отказ = Ложь; 
	Если НЕ ПустаяСтрока(ИНН) тогда
	Если ИНН = "123" тогда
		Отказ = Истина;
		Сообщить("Текст не прошел проверу!");
	КонецЕсли; 
	КонецЕсли; 
	Возврат Отказ; 
КонецФункции	
Показать


Тоже самое.

Делаем вот так, убираем вообще все внешние функции.

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


Та же проблема. Кстати, если прочитать тему полностью станет ясно, что:

1. Ошибка появляется даже есть убрать проверки, а просто указать

СтандартнаяОбработка = Ложь;


2. В определенном случае работает прекрасно, не смотря на обращение к процедуре на сервере.
8. sfihks 43 09.09.19 14:20 Сейчас в теме
Аналогичная проблема.
Удалось решить?
9. dhurricane 09.09.19 14:28 Сейчас в теме
(8) Кажется, что событие "ОкончаниеВводаТекста" не совсем подходящее событие для решения озвученной проблемы. Но если очень хочется, то попробуйте для восстановления значения заполнить данные выбора текущим значением:
Процедура Реквизит1ОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, СтандартнаяОбработка)

   Если Не ПроверкаТекстаПройдена(Текст) Тогда
      СтандартнаяОбработка = Ложь;
      
      ДанныеВыбора = Новый СписокЗначений;
      ДанныеВыбора.Добавить(Реквизит1);
   КонецЕсли;

КонецПроцедуры
Показать
10. mirco 74 24.01.20 11:59 Сейчас в теме
У меня тип поля строка,
ОбновлениеТекстаРедактирования = При изменении значения


Процедура НомерЛицевогоСчетаАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка)

//СтандартнаяОбработка = Ложь; - вот так не выводит "не найдено"

Если Не ПустаяСтрока(Текст) И СтрДлина(Текст) > 5 Тогда


ПараметрыПоиска = Новый Структура;
ПараметрыПоиска.Вставить("НомерЛицевогоСчета",Текст);

ОбновитьСписокЛС(ПараметрыПоиска);

КонецЕсли;

КонецПроцедуры
11. shved 29.06.22 15:02 Сейчас в теме
Други! я тоже впал в цикл
ОкончаниеВводаТекста при СтандартнаяОбработка = Ложь входит в бесконечный цикл "бла-бла-бла" не найдено.
Кто как победил ?
(10) не помогло
12. shved 29.06.22 16:24 Сейчас в теме
Победил через событие ПриИзменении и запоминания предыдущего значения
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот