gifts2017

Запись значения в поле ввода со срабатыванием события ПриИзменении

Опубликовал Сергей Старых (tormozit) в раздел Программирование - Практика программирования

Иногда, наверное, у каждого из нас возникает необходимость после записи значения в какое либо поле ввода вызвать для него обработчик события ПриИзменении, а о вызове самого события вам приходится только мечтать. В этой статье приводится программный способ вызова этого события.
Для максимальной универсальности нужно создать пустую форму, разумнее всего общую. Назовем ее "Пустышка".
// Интерактивно записывает значение в элемент управления. Интерактивность заключается в срабатывании
// события ПриИзменении у элемента управления.
//
// Параметры:
//  ЭлементУправления – ЭлементУправления – которому присваиваем значение;
//  Значение	 – Произвольный – присваиваемое значение;
//  *ФормаИнициатор - Форма, *Неопределено - которая будет использована в качестве инициатора события;
//			   если не указана, то будет создана временная форма-пустышка.
//
Процедура ЛксИнтерактивноЗаписатьВЭлементУправления(ЭлементУправления, Значение, ФормаИнициатор = Неопределено) Экспорт
	
	Перем СтарыйВладелец, СтарыйЗакрыватьПриВыборе;
	
	Если ФормаИнициатор = Неопределено Тогда
		ФормаИнициатор = ПолучитьОбщуюФорму("Пустышка", ЭлементУправления);
	Иначе
		СтарыйВладелец = ФормаИнициатор.ВладелецФормы;
		СтарыйЗакрыватьПриВыборе = ФормаИнициатор.ЗакрыватьПриВыборе;
		ФормаИнициатор.ВладелецФормы = ЭлементУправления;
		ФормаИнициатор.ЗакрыватьПриВыборе = Ложь;
	КонецЕсли;
	ФормаИнициатор.ОповеститьОВыборе(Значение); 
	Если СтарыйЗакрыватьПриВыборе <> Неопределено Тогда
		ФормаИнициатор.ВладелецФормы = СтарыйВладелец;
		ФормаИнициатор.ЗакрыватьПриВыборе = СтарыйЗакрыватьПриВыборе;
	КонецЕсли;

КонецПроцедуры // ЛксИнтерактивноЗаписатьВЭлементУправления()

// Интерактивно записывает значение в элемент управления колонки табличного поля.
// Интерактивность заключается в срабатывании события ПриИзменении у элемента управления.
// Строка табличного поля должна находиться в режиме редактирования,
// иначе никаких изменений данных не произойдет.
//
// Параметры:
//  ТабличноеПоле - ТабличноеПоле - строка которого редактируется;
//  Колонка	  – КолонкаТабличногоПоля – в элемент управления которой записываем;
//  Значение	 – Произвольный – присваиваемое значение;
//  *ФормаИнициатор - Форма, *Неопределено - которая будет использована в качестве инициатора события;
//			   если не указана, то будет создана временная форма-пустышка.
//
Процедура ЛксИнтерактивноЗаписатьВКолонкуТабличногоПоля(ТабличноеПоле, Колонка, Значение, ФормаИнициатор = Неопределено) Экспорт
	
	ТабличноеПоле.ТекущаяКолонка = Колонка;
	ЛксИнтерактивноЗаписатьВЭлементУправления(Колонка.ЭлементУправления, Значение, ФормаИнициатор);

КонецПроцедуры // ЛксИнтерактивноЗаписатьВКолонкуТабличногоПоля()


Если в контексте доступна какая то форма, то лучше ее передать в качестве параметра ФормаИнициатор, т.к. это будет быстрее, чем создавать каждый раз форму-пустышку.

Скорость изменения данных таким путем естественно будет заметно ниже, чем при прямой записи в данные, с которыми связан элемент управления, с вызовом обработчика.

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

См. также

Подписаться Добавить вознаграждение

Комментарии

1. hopter _ (hopter) 12.07.07 02:59
Отличная штука. Сильно помогает при программном создании документов, когда надо заполнить кучу зависимых реквизитов, а прописывать каждый руками утомительно.
2. Александр Окулов (PowerBoy) 30.08.07 12:50
Классно. Обязательно использую. Спасибо за подробный пример.
3. kairat primbetov (karat60) 01.10.07 12:39
4. fez (fez) 16.02.10 11:35
Супернужная возможность для автоматического тестирования. Спасибо.
5. BlackLeon (BlackLeon) 05.08.11 12:33
а что подразумевается под режимом редактирования строки?
установить текущую строку и текущую колонку и выполнить ИзменитьСтроку()?

извените. просто не смог запустить:) проблема оказалась в том что форма должна быть открыта:(
6. татьяна (Girl_Tat) 15.02.12 10:46
Большое спасибо за процедуры!!!!! Очень помогли!!!
7. Алексей Ко (Жолтокнижниг) 29.03.12 12:56
Огромный жирный плюс, а нет предложений как програмно нажимать кн. "Ок"
у меня только одна идея эмуляция ctrl+enter, но чтот не гут так извращаться
9. Евгений К (rar_xxx) 29.12.12 13:47
Жирный плюс !!! Можешь помочь с обработкой таблицы управляемой формы ?

Делаю так:
ФормаДок.Элементы.Товары.ТекущаяСтрока = 0;
Получилось в качестве колонки пока только это скормить: ФормаДок.Товары.ПодчиненныеЭлементы.ТоварыЦенаСоСкидкой Но значение на форме не появилось
10. Denny08 (denny_dv) 15.04.13 23:31
Супер крутая процедурка!!! Добавил в копилку! Префикс оставлю чтобы помнить. +
11. Дмитрий Макаров (mcarrowd) 13.04.15 13:57
В 8.3 вторая процедура не работает - надо вызывать ТаблицаФормы.ИзменитьСтроку() в процедуре или где-то ранее по коду

Процедура ЛксИнтерактивноЗаписатьВКолонкуТабличногоПоля(ТабличноеПоле, Колонка, Значение, ФормаИнициатор = Неопределено) Экспорт
	
	ТабличноеПоле.ТекущаяКолонка = Колонка;
	ТабличноеПоле.ИзменитьСтроку();
	ЛксИнтерактивноЗаписатьВЭлементУправления(Колонка.ЭлементУправления, Значение, ФормаИнициатор);

КонецПроцедуры
...Показать Скрыть
12. Сергей Старых (tormozit) 13.04.15 14:12
(11) Видимо не читал описание метода?
13. Дмитрий Макаров (mcarrowd) 14.04.15 00:48
(12) tormozit, видимо только первую строку.
14. Юрий Былинкин (ardn) 22.09.15 17:38
Спасибо,
Внес этот трюк в модуль тестирования обычных форм
15. hopter _ (hopter) 29.04.16 02:38
а на управляемых формах возможно нечто подобное соорудить?
16. Юрий Былинкин (ardn) 29.04.16 08:03
(15) hopter,
На управляемых формах логичнее использовать автоматизированное тестирование
17. Сергей Старых (tormozit) 29.04.16 08:20
На управляемых формах это тоже работает.
Кстати про тестирование форм (обычных и управляемых) рекомендую посмотреть инструмент "Тестирование метаданных" из подсистемы Инструменты разработчика, где этот прием используется.
18. hopter _ (hopter) 02.05.16 06:45
ясно, посмотрю про тестирование
19. Юрий Клевакин (uri1709) 01.08.16 11:55
Все таки не ясно, как должна выглядеть процедура 2 для УФ, там используется вместо ТабличногоПоля, ТаблицаФормы. Методы конечно похожие, но что-то до конца не получилось у меня разобраться. Проверял на УТ 11.2. Вторую процедуру сделал так:

&НаКлиенте
Процедура ЛксИнтерактивноЗаписатьВКолонкуТабличногоПоля(ТабличноеПоле, Колонка, Значение, ФормаИнициатор = Неопределено) Экспорт
	
	ТабличноеПоле.ТекущийЭлемент = Колонка;
	ЛксИнтерактивноЗаписатьВЭлементУправления(ТабличноеПоле.ТекущийЭлемент, Значение, ФормаИнициатор);

КонецПроцедуры // ЛксИнтерактивноЗаписатьВКолонкуТабличногоПоля()
...Показать Скрыть

Сделал обработку с полями Партнер, Номенклатура и командой выполнить:

&НаКлиенте
Процедура Заполнить(Команда)
    Форма = ОткрытьФорму("Документ.РеализацияТоваровУслуг.ФормаОбъекта");

	Форма.ЛксИнтерактивноЗаписатьВЭлементУправления(Форма.Элементы.Партнер, Партнер, ЭтаФорма);
	                
	                 
	Форма.Элементы.Товары.ДобавитьСтроку();                   

	Форма.ЛксИнтерактивноЗаписатьВКолонкуТабличногоПоля(Форма.Элементы.Товары, Форма.Элементы.Товары.ПодчиненныеЭлементы.ТоварыНоменклатура, Номенклатура, ЭтаФорма); //Форма.Элементы.ТоварыНоменклатура
	Форма.ЛксИнтерактивноЗаписатьВКолонкуТабличногоПоля(Форма.Элементы.Товары, Форма.Элементы.Товары.ПодчиненныеЭлементы.ТоварыЦена, 100, ЭтаФорма); //Форма.Элементы.ТоварыЦена
	Форма.ЛксИнтерактивноЗаписатьВКолонкуТабличногоПоля(Форма.Элементы.Товары, Форма.Элементы.Товары.ПодчиненныеЭлементы.ТоварыКоличествоУпаковок, 100, ЭтаФорма); 
	
КонецПроцедуры
 
...Показать Скрыть


В результате на форме заполнилось: Партнер,Контрагент
Номенклатура - пустое поле, Цена=100,Количество=100,Сумма=10 000.

Мне не понятен момент почему не заполнилась Номенклатура и не сработало событие "ПриИзменении", ведь для "Цены" и "Количества" это событие сработало.

Хотя воспроизвел, в чистой базе создал документ "РеализациятоваровУслуг" с Партнером и табличной частью Номенклатура,НоменклатураНаименование-строка, Цена, Количество, Сумма
сделал обработчики событий для Номенклатуры при изменении заполняется поле НоменклатураНаименование, для Цены и Количества обработчики при изменении расчета Суммы.

Запустил эту обработку НоменклатураНаименование заполнилось и сумма рассчиталась. Все обработчики событий сработали.
Странно, почему в УТ 11.2 не отработало
20. hopter _ (hopter) 10.08.16 01:37
(19) uri1709, аналогичная проблема
В ЗУП 3 при заполнении дополнительного отпуска в табличной части вид не проставляется, а даты нормально
пока не разобрался
21. hopter _ (hopter) 10.08.16 03:54
еще не могу понять можно ли так флажок установить
22. hopter _ (hopter) 10.08.16 04:19
флажок похоже нельзя, т.к. это не поле ввода
23. Сергей Старых (tormozit) 08.09.16 10:29
(22) Да, нельзя. В теме же написано четко "Поле ввода"
24. Иван Родионов (Toolfan) 21.10.16 22:52
По поводу отработки обработчика у Номенклатуры, та же самая проблема, решить не удается
Так и не у кого не получилось решить?
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа