Анимация УФ 1с8

1. SantiouS 20.07.20 11:37 Сейчас в теме
Есть простая форма с полем ввода и кнопкой. При нажатии на кнопку запускается обработчик ожидания и с периодичностью в 1 секунду изменяется цвет рамки формы, а так же свойство растягивания по горизонтали.
Для этого прописываю, допустим, вот такой простой код:
&НаКлиенте
Процедура ВключитьАнимацию(Команда)
	ПодключитьОбработчикОжидания("ВыполнитьАнимацию",1);
КонецПроцедуры

&НаКлиенте
Процедура ВыполнитьАнимацию() Экспорт
	Если Элементы.ВключитьАнимацию.ЦветРамки=Новый Цвет(255,0,0) Тогда
		Элементы.ВключитьАнимацию.ЦветРамки=Новый Цвет(255,255,255);
		Элементы.ВключитьАнимацию.РастягиватьПоГоризонтали=Истина;
	Иначе	
		Элементы.ВключитьАнимацию.ЦветРамки=Новый Цвет(255,0,0);
		Элементы.ВключитьАнимацию.РастягиватьПоГоризонтали=Ложь;
	КонецЕсли; 
КонецПроцедуры
Показать


Все работает, но возникает проблема - если написать какой то текст в поле ввода над кнопкой и после этого выполняется "анимация", то текст пропадает, то есть значение свойства "ТекстРедактирования" у элемента поля формы очищается. Придумал 2 варианта:
1) сразу при вводе значения в текст редактирования запихивать данных текст в реквизит формы;
2) перед выполнением в обработчике анимации перетянуть текст редактирования в значение реквизита формы.

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

&НаКлиенте
Процедура ВключитьАнимацию(Команда)
	ПодключитьОбработчикОжидания("ВыполнитьАнимацию",1);
КонецПроцедуры

&НаКлиенте
Процедура ВыполнитьАнимацию() Экспорт
	СоотвецтвиеНазанияЗначению=ПолучитьЭлементПамяти(); 
	Для каждого ЭлементФормы Из ЭтаФорма.Элементы Цикл
		//здесь для каждого "ЭлементФормы" необходимо было бы найти "Путь к данным" в котором хранится реквизит формы в который нужно было бы записать значение текста редактирования, который хранится в "СоотвецтвиеНазанияЗначению", но "Путь к данным" доступен только на сервере!!!
	КонецЦикла;
	
	Если Элементы.ВключитьАнимацию.ЦветРамки=Новый Цвет(255,0,0) Тогда
		Элементы.ВключитьАнимацию.ЦветРамки=Новый Цвет(255,255,255);
		Элементы.ВключитьАнимацию.РастягиватьПоГоризонтали=Истина;
	Иначе	
		Элементы.ВключитьАнимацию.ЦветРамки=Новый Цвет(255,0,0);
		Элементы.ВключитьАнимацию.РастягиватьПоГоризонтали=Ложь;
	КонецЕсли; 
	
	//ВосстановитьПамятьФормы(СоотвецтвиеНазанияЗначению);
КонецПроцедуры

&НаКлиенте
Функция ПолучитьЭлементПамяти()
	СоотвецтвиеНазанияЗначению=Новый Соответствие;
	Для каждого ЭлементФормы Из ЭтаФорма.Элементы Цикл
		Попытка
			Текст=ЭлементФормы.ТекстРедактирования;
			СоотвецтвиеНазанияЗначению.Вставить(ЭлементФормы.Имя,Текст);	
		Исключение
			Продолжить;
		КонецПопытки; 
	КонецЦикла; 
	Возврат СоотвецтвиеНазанияЗначению; 
КонецФункции
Показать


Проблема (комментарий в коде): для получения данных о пути к данным нужно выполнить серверную контекстную процедуру, после форма обновиться. Естественно я ее смогу заполнить из "СоотвецтвиеНазанияЗначению", но если пользователь не только вводил текст в поля, а еще и прокрутил форму чуть выше, то форму дернет до самого верха в начальное положение, то есть серверные контекстные вызовы нужно исключить.
Как тогда можно в обработчике ожидания без серверных контекстных вызовов "перегрузить" данные с текста редактирования в реквизит формы что бы все тексты редактирования и положение в окне формы не изменилось?
Прикрепленные файлы:
По теме из базы знаний
Найденные решения
3. coollerinc 195 20.07.20 12:18 Сейчас в теме
Напишу на всякий случай: Изменение свойства "РастягиватьПоГоризонтали" на клиенте требует обращения к серверу

Попробуйте изменить свойство Обновление текста редактирования у поля ввода, должно помочь
SantiouS; +1 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. @Fancy 20.07.20 12:16 Сейчас в теме
Кажется, здесь была похожая проблема [Механизм интерфейса] Часы
SantiouS; +1 Ответить
5. SantiouS 22.07.20 14:17 Сейчас в теме
(2) Отличная статья, точнее закреплённый комментарий, а про ХТМЛ знал:) Спасибо за помощь!
3. coollerinc 195 20.07.20 12:18 Сейчас в теме
Напишу на всякий случай: Изменение свойства "РастягиватьПоГоризонтали" на клиенте требует обращения к серверу

Попробуйте изменить свойство Обновление текста редактирования у поля ввода, должно помочь
SantiouS; +1 Ответить
4. SantiouS 22.07.20 14:03 Сейчас в теме
(3)
Обновление текста редактирования


Спасибо. Нашел. То что нужно, не знал!
ОбновлениеТекстаРедактирования (EditTextUpdate)
Использование:
Чтение и запись.
Описание:
Тип: ОбновлениеТекстаРедактирования.
Управляет режимом обновления текста.
Значение по умолчанию Авто.
Доступность:
Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, мобильное приложение(клиент), мобильное приложение(сервер).
Примечание:
В режиме совместимости конфигурации Версия8_2_13 не влияет на поведение поля ввода управляемой формы.
В остальных случаях влияет на то, в каких ситуациях будет обновляться текст в поле ввода при установке значения.


При выполнении такого кода и установке свойства "Обновление текста редактирования" в положение "При изменении значения" проблема исчезает. Текст можно продолжать набирать и он никуда не исчезает. Круто!)
&НаКлиенте
Процедура ВключитьАнимацию(Команда)
	ПодключитьОбработчикОжидания("ВыполнитьАнимацию",1);
КонецПроцедуры

&НаКлиенте
Процедура ВыполнитьАнимацию() Экспорт
	Если Элементы.ВключитьАнимацию.ЦветРамки=Новый Цвет(255,0,0) Тогда
		Элементы.ВключитьАнимацию.ЦветРамки=Новый Цвет(255,255,255);
		Элементы.ВключитьАнимацию.РастягиватьПоГоризонтали=Истина;
	Иначе	
		Элементы.ВключитьАнимацию.ЦветРамки=Новый Цвет(255,0,0);
		Элементы.ВключитьАнимацию.РастягиватьПоГоризонтали=Ложь;
	КонецЕсли; 
КонецПроцедуры
Показать


П.С. (как писали выше): РастягиватьПоГоризонтали делает Серверный вызов;
Прикрепленные файлы:
Оставьте свое сообщение

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