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