IE2017

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

Программирование - Практика программирования

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

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

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

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


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

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

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

См. также

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

извените. просто не смог запустить:) проблема оказалась в том что форма должна быть открыта:(
6. татьяна (Girl_Tat) 15.02.12 10:46 Сейчас в теме
Большое спасибо за процедуры!!!!! Очень помогли!!!
7. Алексей Ко (Жолтокнижниг) 237 29.03.12 12:56 Сейчас в теме
Огромный жирный плюс, а нет предложений как програмно нажимать кн. "Ок"
у меня только одна идея эмуляция ctrl+enter, но чтот не гут так извращаться
8. Олег (agressor) 117 21.12.12 11:39 Сейчас в теме
9. Евгений К (rar_xxx) 21 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) 4314 13.04.15 14:12 Сейчас в теме
(11) Видимо не читал описание метода?
13. Дмитрий Макаров (mcarrowd) 14.04.15 00:48 Сейчас в теме
(12) tormozit, видимо только первую строку.
14. Юрий Былинкин (ardn) 75 22.09.15 17:38 Сейчас в теме
Спасибо,
Внес этот трюк в модуль тестирования обычных форм
15. hopter _ (hopter) 34 29.04.16 02:38 Сейчас в теме
а на управляемых формах возможно нечто подобное соорудить?
16. Юрий Былинкин (ardn) 75 29.04.16 08:03 Сейчас в теме
(15) hopter,
На управляемых формах логичнее использовать автоматизированное тестирование
17. Сергей Старых (tormozit) 4314 29.04.16 08:20 Сейчас в теме
На управляемых формах это тоже работает.
Кстати про тестирование форм (обычных и управляемых) рекомендую посмотреть инструмент "Тестирование метаданных" из подсистемы Инструменты разработчика, где этот прием используется.
18. hopter _ (hopter) 34 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) 34 10.08.16 01:37 Сейчас в теме
(19) uri1709, аналогичная проблема
В ЗУП 3 при заполнении дополнительного отпуска в табличной части вид не проставляется, а даты нормально
пока не разобрался
21. hopter _ (hopter) 34 10.08.16 03:54 Сейчас в теме
еще не могу понять можно ли так флажок установить
22. hopter _ (hopter) 34 10.08.16 04:19 Сейчас в теме
флажок похоже нельзя, т.к. это не поле ввода
23. Сергей Старых (tormozit) 4314 08.09.16 10:29 Сейчас в теме
(22) Да, нельзя. В теме же написано четко "Поле ввода"
24. Иван Родионов (Toolfan) 21.10.16 22:52 Сейчас в теме
По поводу отработки обработчика у Номенклатуры, та же самая проблема, решить не удается
Так и не у кого не получилось решить?
Оставьте свое сообщение