Книга знаний

1С:Предприятие / v8 / Приемы программирования / Формы

v8: Метод обработки событий изменения формы

Альтернативная схема построения обработчика событий формы.Автор статьи:
Последняя редакция №1 от 23.03.06
URL: http://kb.mista.ru/article.php?id=127

Ключевые слова: события,форма,схема


Исторически сложилось так, что обработка изменения данных, связанных с реквизитами формы обрабатывалась в обработчиках событий этих реквизитов. Так было в 77, так до сих пор пишется код типовых конфигураций. Однако в 80 появился метод ПодключитьОбработчикИзмененияДанных, с помощью которого код изменений можно писать более прозрачно.

Рассмотрим простейший пример: пусть у документа есть реквизиты "Валюта","Курс","Кратность","Контрагент","Договор","Дата".

При изменении реквизита "Валюта" нужно установить курс и кратность валюты на дату "Дата".
При изменении реквизита "Контрагент" нужно установить в реквизит "Договор" основной договор контрагента.

Классическая схема написания обработчиков событий формы будет такая:
Процедура Реквизит_Валюта_ПриИзменении()
  Курс=ПолучитьКурсПоВалюте(Валюта);
  Кратность=ПолучитьКратностьПоВалюте(Валюта);
КонецПроцедуры
Процедура Реквизит_Контрагент_ПриИзменении()
  Договор=ПолучитьОсновнойДоговорПоКонтрагенту(Контрагент);
КонецПроцедуры


Однако у приведенной схемы есть недостаток.
Допустим, пользователь создал новый документ и в него подставился контрагент по умолчанию.
По идее мы должны смоделировать в этой ситуации интерактивный выбор контрагента, чтобы проставился договор или скопировать код процедуры Реквизит_Контрагент_ПриИзменении.
Это можно сделать так:
[1с]
Выполнить(""+ПолучитьДействие(ЭлементыФормы.Контрагент,"ПриИзменении")+"(ЭлементыФормы.Контрагент)");
[/1с]
Или так:
[1с]
Реквизит_Контрагент_ПриИзменении();
[/1с]

Но хочется большей универсальности чтобы не приходилось дублировать код.
Добиться этого можно другой схемой:

[1с]
Процедура ПриОткрытии()
   …
       
   //Назначаем всем данным формы обработчик ИзменениеДанных
   Для Каждого Эл из ЭлементыФормы Цикл
       Попытка
           ПодключитьОбработчикИзмененияДанных(Эл.Данные, "ИзменениеДанных");
       Исключение
       КонецПопытки;
   КонецЦикла;

   ИзменениеДанных("*");

   …
   
КонецПроцедуры

Процедура ИзменениеДанных(Реквизит)
   Если Реквизит="Контрагент" Тогда
       Договор=ПолучитьОсновнойДоговорПоКонтрагенту(Контрагент);
   ИначеЕсли Реквизит="Валюта" Тогда
       Курс=ПолучитьКурсПоВалюте(Валюта);
       Кратность=ПолучитьКратностьПоВалюте(Валюта);
   КонецЕсли;
КонецПроцедуры
[/1с]









Описание | Рубрикатор | Поиск | ТелепатБот | Захваченные статьи | Установки | Форум
© Станислав Митичкин (Волшебник), 2005-2025 | Mista.ru

Яндекс.Метрика