В предыдущей публикации перечислены основные возможности Фреймворка, есть подробная инструкция по установке и пример создания расширения. Здесь будет раскрыта только одна тема:
Управление обработкой событий
-
Программные подписки - для обработки любого события Конфигурации в Расширениях можно программно подключить один или несколько обработчиков и пост-обработчиков события.
-
Без заимствований - для обработки событий Конфигурации в Расширениях не требуется заимствовать формы, модули и объекты из Конфигурации.
-
Любые события и команды - в подключаемых обработчиках событий в Расширениях могут быть обработаны все события Конфигурации: события модулей и менеджеров объектов, события форм и элементов, а также общие команды, команды форм и объектов.
-
Универсальные обработчики - обработчик события в Расширении может обрабатывать событие от одного, нескольких или всех источников события Конфигурации.
-
Собственные события - предоставляется возможность в Расширении добавлять собственные события и обрабатывать их в этом же или других Расширениях.
Как обрабатываются события
Каждое событие Конфигурации перехватывается служебным Расширением "Подписки". После чего, информация о событии рассылается всем "подписчикам" - объектам Расширений, подписавшимся на данное событие.
Служебное Расширение Подписки
Расширение ЕХТ_Подписки
автоматически добавляется в информационную базу при активации лицензии и автоматически обновляется при обновлениях или изменениях Конфигурации.
Обработка событий в Расширениях
Добавление подписки на событие
В модуле менеджера объекта или общем модуле Расширения, в функцию Сведения()
, необходимо добавить строку Сведения.Подписки = Истина
и добавить экспортную функцию Подписки()
как на картинке ниже:
Параметры подписки
-
Событие: Тип: Строка
. Обязательный параметр. Имя события, для которого устанавливается обработчик, например, ПриСозданииНаСервере
. Если обработчик должен быть вызван после обработчиков Конфигурации, то имя события указывается с префиксом После
, например, ПослеПриСозданииНаСервере
.
-
Директива: Тип: Строка
. Необязательный параметр. Возможные значения: НаКлиенте
или НаСервере
. Используется для уточнения контекста выполнения обработчика события для одноименных событий Платформы. Например, для обработки "события приложения"ПриНачалеРаботыСистемы
нужно указать НаКлиенте
, а для обработки "события внешнего соединения"ПриНачалеРаботыСистемы
нужно указать НаСервере
.
-
Издатель: Тип: Строка
или Массив
. Обязательный параметр для событий элементов формы, для остальных событий - необязательный. Имя объекта метаданных Конфигурации, событие которого нужно обработать, например, Справочник.Номенклатура
или Документ.ПоступлениеТоваров.Форма.ФормаСписка
.
-
Элемент: Тип: Строка
или Массив
. Обязательный параметр для событий элементов формы, для остальных событий не используется. Имя элемента формы, для которого устанавливается обработчик. Для события ОбработкаКомандыФормы
указывается имя команды формы.
-
Подписчик: Тип: Строка
. Необязательный параметр. Имя модуля, в котором располагается обработчик события.
-
Обработчик: Тип: Строка
. Необязательный параметр. Имя обработчика события.
-
КоличествоПараметров: Тип: Число
. Необязательный параметр. Количество параметров функции-обработчика события. Используется, если в обработчике события в Конфигурации указано нестандартное количество параметров. Также используется для одноименных событий с разным количеством параметров. Например: при событии Выбор
у ТаблицыФормы в обработчик события передаются 3 параметра, а у поля формы Табличный документ - 2.
-
Описание: Тип: Строка
. Обязательный параметр. Здесь указывается назначение обработчика события.
Обработчики событий
Обработчики событий это экспортные функции, расположенные в модулях объекта, добавившего подписку. Обработчики событий НаКлиенте
располагаются в модуле формы Подписки
, а обработчики событий на НаСервере
- в модуле менеджера объекта.
Имя функции-обработчика события состоит из префикса "ЕХТ_" и имени события, например, ЕХТ_ПриСозданииНаСервере
или ЕХТ_ПослеПриСозданииНаСервере
.
Состав параметров обработчика события совпадает с описанием параметров события в Синтакс-Помощнике, плюс, в каждый обработчик события передается дополнительный параметр - СвойстваСобытия
.
Через параметр СвойстваСобытия
в обработчик передается дополнительная информация о событии, в том числе "Объект" - источник события.
Новые события
Для увеличения гибкости разработки, во Фреймворке были добавлены несколько новых событий, например:
-
ОбработкаКомандыФормы
: событие используется для обработки команд формы;
-
ОбработкаРегламентногоЗадания
: событие возникает в обработчиках всех регламентных заданий Конфигурации;
-
ОбработкаПодпискиНаСобытие
: событие возникает в обработчиках всех объектов Подписка из метаданных Конфигурации;
-
УдалениеУстаревшихДанных
: служебное событие, запускаемое по заданному расписанию.
Собственные события
С помощью Фреймворка разработчики могут добавлять собственные события, подписываться на них и обрабатывать в любых Расширениях по тем же принципам, что описаны выше. Одним из назначений использования собственных событий является генерация и обработка оповещений на сервере, аналогично оповещениям на клиенте.
Список примеров
В этом разделе можно ознакомиться с несколькими простыми примерами обработки событий. К файлам публикации прикреплена демонстрационная база с несколькими справочниками и документами. Каждый пример располагается в отдельном Расширении.
Пример 1: Привет, Мир!
Пример обработки события ПриНачалеРаботыСистемы
Расширение просто выводит сообщение при запуске программы.
Объекты и модули Расширения
Объекты
Модуль менеджера обработки
#Область СлужебныйПрограммныйИнтерфейс
#Область ЕХТ
Функция ПолноеИмя() Экспорт
Возврат Создать().Метаданные().ПолноеИмя();
КонецФункции
Функция Идентификатор() Экспорт
Возврат "9cc871ae-7fd6-49cb-8d82-20bcbaf5ae7e";
КонецФункции
Функция Сведения(Сведения) Экспорт
Сведения.Версия = "17.09.09.1";
Сведения.Подписки = Истина;
Возврат Истина;
КонецФункции
Функция ОбработкаОбновления(ТекущаяВерсия, НоваяВерсия, НастройкиОбъекта) Экспорт
Возврат Истина;
КонецФункции
#КонецОбласти
Функция Подписки(Подписки) Экспорт
Подписка = Подписки.Добавить();
Подписка.Событие = "ПриНачалеРаботыСистемы";
Подписка.Описание = "Выводит предупреждение ""Привет, Мир!""";
Возврат Истина;
КонецФункции
#КонецОбласти
Модуль формы Подписки
&НаКлиенте
Функция ЕХТ_ПриНачалеРаботыСистемы(СвойстваСобытия) Экспорт
ПоказатьПредупреждение(, "Привет, Мир!");
КонецФункции
Пример 2: Перерасчет суммы в табличной части
Пример обработки события ПриИзменении
Расширение исправляет ошибку Конфигурации в документе "Поступление товаров", где в табличной части не пересчитывается сумма при изменении цены или количества. Форма документа не заимствуется.
Объекты и модули Расширения
Объекты
Модуль менеджера обработки
#Область СлужебныйПрограммныйИнтерфейс
#Область ЕХТ
Функция ПолноеИмя() Экспорт
Возврат Создать().Метаданные().ПолноеИмя();
КонецФункции
Функция Идентификатор() Экспорт
Возврат "9bea308a-4581-4767-99ed-92e99416d8ba";
КонецФункции
Функция Сведения(Сведения) Экспорт
Сведения.Версия = "17.09.09.1";
Сведения.Подписки = Истина;
Возврат Истина;
КонецФункции
Функция ОбработкаОбновления(ТекущаяВерсия, НоваяВерсия, НастройкиОбъекта) Экспорт
Возврат Истина;
КонецФункции
#КонецОбласти
Функция Подписки(Подписки) Экспорт
Подписка = Подписки.Добавить();
Подписка.Событие = "ПослеПриИзменении";
Подписка.Издатель = "Документ.ПоступлениеТоваров.Форма.ФормаДокумента";
// Обработка событий двух элементов.
Подписка.Элемент = "ТоварыЦена, ТоварыКоличество";
// Вместо стандартного обработчика ЕХТ_ПослеПриИзменении() вызывается ПерерасчетСуммы().
Подписка.Обработчик = "ПерерасчетСуммы";
Подписка.Описание = "Перерасчет суммы при изменении цены или количества.";
Возврат Истина;
КонецФункции
#КонецОбласти
Модуль формы Подписки
&НаКлиенте
Функция ПерерасчетСуммы(Элемент, СвойстваСобытия) Экспорт
ТекущаяСтрока = Элемент.Родитель.ТекущиеДанные;
ТекущаяСтрока.Сумма = Окр(ТекущаяСтрока.Цена * ТекущаяСтрока.Количество, 2, 1);
КонецФункции
Пример 3: Добавление ссылки в форму списка
Пример обработки события ПриСозданииНаСервере
В Конфигурации, в списке документов "Поступление товаров" не выведены колонки "Поставщик" и "Склад" и нет поля "Ссылка", чтобы добавить нужные колонки через "Еще - Изменить форму". Расширение добавляет поле "Ссылка".
Объекты и модули Расширения
Объекты
Модуль менеджера обработки
#Область СлужебныйПрограммныйИнтерфейс
#Область ЕХТ
Функция ПолноеИмя() Экспорт
Возврат Создать().Метаданные().ПолноеИмя();
КонецФункции
Функция Идентификатор() Экспорт
Возврат "B450E253-AA40-4311-8F79-34DFE071C616";
КонецФункции
Функция Сведения(Сведения) Экспорт
Сведения.Версия = "22.10.08.1";
Сведения.Подписки = Истина;
Возврат Истина;
КонецФункции
Функция ОбработкаОбновления(ТекущаяВерсия, НоваяВерсия, НастройкиОбъекта) Экспорт
Возврат Истина;
КонецФункции
#КонецОбласти
Функция Подписки(Подписки) Экспорт
Издатели = Новый Массив;
Издатели.Добавить("Документ.ПоступлениеТоваров.Форма.ФормаСписка");
Издатели.Добавить("Документ.ПоступлениеТоваров.Форма.ФормаВыбора");
Подписка = Подписки.Добавить();
Подписка.Событие = "ПослеПриСозданииНаСервере";
// Обрабатывается событие двух форм.
Подписка.Издатель = Издатели;
Подписка.Описание = "Настройка формы:
|Добавление поля Ссылка в формы списка документа ПоступлениеТоваров";
Возврат Истина;
КонецФункции
Функция ЕХТ_ПослеПриСозданииНаСервере(Отказ, СтандартнаяОбработка, СвойстваСобытия) Экспорт
НастройкаФормы(СвойстваСобытия.Объект);
Возврат Истина;
КонецФункции
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Процедура НастройкаФормы(Форма)
ЕХТ_Форма.ДобавитьПолеВвода(Форма, "Список.Ссылка", "Список");
КонецПроцедуры
#КонецОбласти
Пример 4: Обработка команд
Пример обработки событий ОбработкаКоманды
и ОбработкаКомандыФормы
Пример обработки в Расширении команд из Конфигурации: общей команды, команды объекта и команды формы. Все три типа команд выведены на форму элемента справочника Номенклатура. Пример обработки события ОбработкаКомандыФормы
, которое добавлено во Фреймворке и отсутствует в Платформе.
Объекты и модули Расширения
Объекты
Модуль менеджера обработки
#Область СлужебныйПрограммныйИнтерфейс
#Область ЕХТ
Функция ПолноеИмя() Экспорт
Возврат Создать().Метаданные().ПолноеИмя();
КонецФункции
Функция Идентификатор() Экспорт
Возврат "1bc7a309-2f07-4798-a62b-80b57bb40701";
КонецФункции
Функция Сведения(Сведения) Экспорт
Сведения.Версия = "17.09.09.1";
Сведения.Подписки = Истина;
Возврат Истина;
КонецФункции
Функция ОбработкаОбновления(ТекущаяВерсия, НоваяВерсия, НастройкиОбъекта) Экспорт
Возврат Истина;
КонецФункции
#КонецОбласти
Функция Подписки(Подписки) Экспорт
Подписка = Подписки.Добавить();
// Это событие фреймворка, в платформе такого нет.
Подписка.Событие = "ОбработкаКомандыФормы";
Подписка.Издатель = "Справочник.Номенклатура.Форма.ФормаЭлемента";
// Здесь нужно указывать имя команды, а не элемента.
Подписка.Элемент = "КомандаФормы";
// Обработчик переопределен.
Подписка.Обработчик = "КомандаФормы";
Подписка.Описание = "Выводит сообщение о событии";
Подписка = Подписки.Добавить();
Подписка.Событие = "ОбработкаКоманды";
Подписка.Издатель = "Справочник.Номенклатура.Команда.КомандаОбъекта1";
// Обработчик переопределен.
Подписка.Обработчик = "КомандаОбъекта";
Подписка.Описание = "Выводит сообщение о событии";
Подписка = Подписки.Добавить();
Подписка.Событие = "ОбработкаКоманды";
Подписка.Издатель = "ОбщаяКоманда.ОбщаяКоманда1";
// Обработчик переопределен.
Подписка.Обработчик = "ОбщаяКоманда";
Подписка.Описание = "Выводит сообщение о событии";
Возврат Истина;
КонецФункции
#КонецОбласти
Модуль формы Подписки
&НаКлиенте
Функция КомандаФормы(Команда, СвойстваСобытия) Экспорт
ПоказатьПредупреждение(, "Обработка КОМАНДЫ ФОРМЫ конфигурации ...");
Возврат Истина;
КонецФункции
&НаКлиенте
Функция КомандаОбъекта(ПараметрКоманды, ПараметрыВыполненияКоманды, СвойстваСобытия) Экспорт
ПоказатьПредупреждение(, "Обработка КОМАНДЫ ОБЪЕКТА конфигурации ...");
Возврат Истина;
КонецФункции
&НаКлиенте
Функция ОбщаяКоманда(ПараметрКоманды, ПараметрыВыполненияКоманды, СвойстваСобытия) Экспорт
ПоказатьПредупреждение(, "Обработка ОБЩЕЙ КОМАНДЫ конфигурации ...");
Возврат Истина;
КонецФункции
Пример 5: Добавление подбора в документ
Пример обработки событий ПриСозданииНаСервере
, ОбработкаКомандыФормы
и ОбработкаВыбора
В Конфигурации, в документе "Реализация товаров" отсутствует возможность подбора товаров. Расширение, без заимствования формы документа, добавляет кнопку Подбор, добавляет выбранные товары в табличную часть и пересчитывает суммы.
Объекты и модули Расширения
Объекты
Модуль менеджера обработки
#Область СлужебныйПрограммныйИнтерфейс
#Область ЕХТ
Функция ПолноеИмя() Экспорт
Возврат Создать().Метаданные().ПолноеИмя();
КонецФункции
Функция Идентификатор() Экспорт
Возврат "4E85D010-FA2C-45A6-88B4-88E01AC8226F";
КонецФункции
Функция Сведения(Сведения) Экспорт
Сведения.Версия = "22.10.08.1";
Сведения.Подписки = Истина;
Возврат Истина;
КонецФункции
Функция ОбработкаОбновления(ТекущаяВерсия, НоваяВерсия, НастройкиОбъекта) Экспорт
Возврат Истина;
КонецФункции
#КонецОбласти
Функция Подписки(Подписки) Экспорт
Издатель = "Документ.РеализацияТоваров.Форма.ФормаДокумента";
Подписка = Подписки.Добавить();
Подписка.Издатель = Издатель;
Подписка.Событие = "ПослеПриСозданииНаСервере";
Подписка.Описание = "Настройка формы: Добавление кнопки Подбор.";
Подписка = Подписки.Добавить();
Подписка.Издатель = Издатель;
Подписка.Событие = "ОбработкаКомандыФормы";
Подписка.Элемент = ОписаниеКоманды().Имя;
Подписка.Описание = "Открытие формы подбора.";
Подписка = Подписки.Добавить();
Подписка.Издатель = Издатель;
Подписка.Событие = "ОбработкаВыбора";
Подписка.Описание = "Добавление выбранной номенклатуры.";
Возврат Истина;
КонецФункции
Функция ЕХТ_ПослеПриСозданииНаСервере(Отказ, СтандартнаяОбработка, СвойстваСобытия) Экспорт
НастройкаФормы(СвойстваСобытия.Объект);
Возврат Истина;
КонецФункции
Функция ОписаниеКоманды() Экспорт
ОписаниеКоманды = Новый Структура("Имя, Заголовок");
ОписаниеКоманды.Имя = СтрРазделить(ПолноеИмя(), ".")[1];
ОписаниеКоманды.Заголовок = НСтр("ru = 'Подбор'");
Возврат ОписаниеКоманды;
КонецФункции
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Процедура НастройкаФормы(Форма)
ЕХТ_Форма.ДобавитьКомандуИКнопку(Форма, ОписаниеКоманды(), "ТоварыКоманднаяПанель");
КонецПроцедуры
#КонецОбласти
Модуль формы Подписки
&НаКлиенте
Функция ЕХТ_ОбработкаКомандыФормы(Команда, СвойстваСобытия) Экспорт
Если Команда.Имя = Имя() Тогда
ОткрытьФормуПодбора(СвойстваСобытия.Объект);
КонецЕсли;
Возврат Истина;
КонецФункции
&НаКлиенте
Процедура ОткрытьФормуПодбора(Знач ФормаДокумента)
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("РежимВыбора", Истина);
ПараметрыФормы.Вставить("ЗакрыватьПриВыборе", Ложь);
ОткрытьФорму(ПолноеИмяФормыПодбораНоменклатуры(), ПараметрыФормы, ФормаДокумента);
КонецПроцедуры
&НаКлиенте
Функция ПолноеИмяФормыПодбораНоменклатуры()
Возврат "Справочник.Номенклатура.Форма.ФормаВыбора";
КонецФункции
&НаКлиенте
Функция ЕХТ_ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора, СвойстваСобытия) Экспорт
Если ИсточникВыбора.ИмяФормы = ПолноеИмяФормыПодбораНоменклатуры() Тогда
ДобавитьНоменклатуру(ВыбранноеЗначение, СвойстваСобытия.Объект);
КонецЕсли;
Возврат Истина;
КонецФункции
&НаКлиенте
Процедура ДобавитьНоменклатуру(Знач Номенклатура, ФормаДокумента)
НоваяСтрока = ФормаДокумента.Объект.Товары.Добавить();
НоваяСтрока.Номенклатура = Номенклатура;
НоваяСтрока.Количество = 1;
НоваяСтрока.Цена = ЕХТ_Ссылка.ЗначениеРеквизита(Номенклатура, "Цена");
// Перед пересчетом нужно активизировать добавленную строку.
ФормаДокумента.Элементы.Товары.ТекущаяСтрока = НоваяСтрока.ПолучитьИдентификатор();
// Вызов неэкспортной процедуры формы документа.
ФормаДокумента.ЕХТ_ВыполнитьНаКлиенте("ТоварыЦенаПриИзменении(ЭтотОбъект.Элементы.ТоварыЦена)");
КонецПроцедуры
&НаКлиенте
Функция Имя()
Возврат СтрРазделить(ЭтотОбъект.ИмяФормы, ".")[1];
КонецФункции
Выводы
Не надо заимствовать формы
Посмотрите ещё раз на список примеров. Во всех (кроме "Привет, Мир!", конечно) нужно было доработать формы. Но, в итоге, "ни одна форма не пострадала". Как и не потребовались общие модули СобытияФорм.
Для каждой задачи - свое Расширение
Каждое решение находится в своем собственном, независимом Расширении. Если, например, разработчики Конфигурации исправят пересчет сумм, то Расширение с исправлением можно просто отключить одной галкой или удалить. Всё остальное продолжит работать по прежнему.
И главное
Не о такой ли простоте мы мечтали все долгие годы разработки? )
Готовое решение сейчас перед вами.
Попробуйте ещё свои кейсы на демобазе и приходите за покупкой!
Как установить демобазу с примерами
- Скачать из файлов публикации архив с файлом 1cv8.1CD .
- Распаковать этот архив в новую папку на компьютере.
- Добавить путь к этой папке в программе запуска 1С.
- Поехали!