новое событие
Информационный поток
Задания вакансии материалы разработки сообщения форума

Подписка на событие "ОбработкаПолученияФормы" для обычных форм

  • Добавить свою публикацию
  • для этого требуется регистрация

Предисловие

Для чего может понадобиться отлавливать событие получения формы? Все просто. При изменении типовых конфигураций очень важным является сохранение возможности последующего обновления из пакетов поставщика. В случаях, когда разработчик меняет типовую форму объектов в конструкторе, при последующем обновление механизм сравнения/объединения не сможет подробно отобразить какие элементы и их свойства были изменены на форме. Поэтому велика вероятность, что обновление конфигурации может пройти некорректно. 

Немного теории

 Для упрощения процесса последующих обновлений типовой конфигурации рекомендуется изменять типовые формы объектов программным образом. Например, если нам нужно добавить на форму поле ввода, то в обработчике формы "ПередОткрытием" (для обычных форм) необходимо добавить соответствующий программный код. Для управляемых форм платформа поддерживает создания подписки на событие "ОбработкаПолученияФормы", которое позволяет вмешиваться в процесс создания формы на сервере. Эта возможность намного упрощает изменение форм. Фактически, в некоторых ситуациях разработчик может вообще не трогать типовую форму, а изменять ее программно в процедуре-обработчике подсписки на событие.

 

Непонятно почему, но платформа 1С:Предприятие 8.2 не поддерживает создание подписок на получение формы объекта для обычных форм. Но есть нестандартный способ, который позволяет отловить событие получения обычной формы и в дальнейшем влиять на ее свойства и состав. Именно о нем и пойдет речь далее.

Реализация

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

 Изображение

В параметрах конфигурации не забудьте поставить режим редактирования в "Управляемое приложение и обычное приложение".

Изображение

Теперь мы можем создать подписку на событие и связанный с ней обработчик, в котором будем изменять получаемую форму. Для этого добавим общий серверный модуль с возможностью вызова экспортных процедур со стороны клиента. Назовем его "DEV_ИзмененеиеФорм".

Изображение

 И сразу добавим экспортную процедуру-обработчик для подписки на событие "DEV_ИзменениеФормы" (подписка на событие и общий модуль имеют одинаковое наименования для удобства разработки). 

// Процедура обработчик подписки на событие "DEV_ИзмененениеФормы"
// Параметры:
// 1. Источник - объект, для которого открывается форма
// 2. ВидФормы - вид открываемой формы (например, "ФормаОбъекта")
// 3. Параметры - структура переданных параметров в управляемую форму
// 4. ВыбраннаяФорма - содержит формы, выбранную в обработчике
// 5. ДополнительнаяИнформация - структура дополнительной информации
// 6. СтандартнаяОбработка - булев флаг выполнения стандартной обработки
// 
Процедура DEV_ИзменениеФормы(Источник, ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка) Экспорт
	// Програмный код модификации формы 
КонецПроцедуры

 

Теперь мы можем создать необходимую подписку на событие и привязать к созданной выше процедуре. Сразу отмечу, что в текущем примере мы будем изменять обычную форму элемента справочника "Банки", поэтому в источнике подписки на событие установим значение "СправочникМенеджер.Банки".

Изображение

Подписка на событие создана, процедура-обработчик определена, теперь осталось самое интересное - нужно привязать подписку на событие к обычной форме элемента справочника "Банки". Для этого создадим новую управляемую форму элемента справочника и сделаем ее основной (в настройка заменим обычную форму на управляемую). После этого в событии формы "ПриОткрытии" добавим слеюущий программный код:

 &НаКлиенте
Процедура ПриОткрытии(Отказ)
	
	Закрыть();
	
КонецПроцедуры

О его назначении будет понятно чуть позже. Теперь справочник "Банки" выглядит следующим образом:

 Изображение

Обратите внимание, что созданная нами управляемая форма элемента не содержит элементов на форме, поскольку они в данном случае не нужны. При получении этой формы вызывается обработчик получения формы "DEV_ИзменениеФормы", в котором мы можем получить обычную форму и произвести все необходимые программные действия. Далее представлен программный код обработчика для изменения обычной формы элемента справочника "Банки".

Процедура DEV_ИзменениеФормы(Источник, ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка) Экспорт
	
	// Определяем для какого объекта было отловлено событие "ОбработчикПолученияФормы"
	Если ТипЗнч(Источник) =   Тип("СправочникМенеджер.Банки") Тогда
		// Если открываемая форма - форма объекта
		Если ВидФормы = "ФормаОбъекта" Тогда  		
			// Получаем форму открываемомго объекта
			Если Параметры.Ключ.Пустая() Тогда
				ЭлементОбъект = Справочники.Банки.СоздатьЭлемент();	
			Иначе
				ЭлементОбъект = Параметры.Ключ.ПолучитьОбъект();
			КонецЕсли;
			ФормаЭлемента = ЭлементОбъект.ПолучитьФорму("ФормаЭлемента"); 			
			// Изменям форму программно
			ФормаЭлемента.ЭлементыФормы.Наименование.ЦветФонаПоля = WebЦвета.Лосось;
			ФормаЭлемента.ЭлементыФормы.Код.Шрифт = ШрифтыСтиля.ШрифтРаздела;			
			// Открываем измененную форму
			ФормаЭлемента.Открыть();					
		КонецЕсли;
	КонецЕсли;
	
КонецПроцедуры

 

Полагаю, что рассказывать о приведенном выше программном коде не имеет смысла, в общих чертах ход действий описан соответствующими комментариями.

 

Нужно сказать, что метод "Закрыть()" в обработчике "ПриОткрытии" используется, чтобы управляемая форма не появлялась на экране пользователя. Если бы мы поставили флаг "Отказ" в обработчике "ПриСозданииНаСервере" или установили флаг "СтандартнаяОбработка" в ЛОЖЬ в обработчике подписки на событие, то возникла бы ошибка с идентификатором формы или невозможности работы с неоткрытой формой. В данный момент другого способа скрыть от пользователя "промежуточную" форму не нашел. 

Что на практике

 Запустив режим "предприятия" мы увидим следующие изменения формы элемента справочника "Банки".

Изображение

При этом для справочника "Банки" в конфигурации мы изменили настройку поддержки только для непосредственно самого объекта в режим "Редактируется с сохранением поддержки".

Изображение

Проделав вышеописанные действия, мы сохранили максимальную совместимость с конфигурацией поставщика.

Что в итоге

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

 

У данного подхода есть большой минус - для создания "промежуточной" управляемой формы будет выполнен лишний вызов сервера, не говоря уже о том, что на создание формы будут затрачены ресурсы сервера 1С:Предприятия, хоть и незначительные. 

 
0
Читайте также
(V 7.7) Справка по работе с метаданными (с примерами)
Получение метаданных в программе 1С 7.7 происходит через объект "Метаданные"
Работа с хранилищем конфигурации
Хранилище конфигурации в 1С8
Разработки
Договор поставки и сублицензионный договор
Обработки для 1С франчайзи формируют документы в Word
Формирование бланка заказа в 1с 8 (УТ 10.3, УПП, БП 2.0, КА, УТП) v.3
"Обработка формирует бланк заказа на товар в 1С8"
драйвер и обработка для подключения ЧПМ Меркурий 130 к 1С:Розница 8.2
Обработка для подключения ЧПМ к 1С Розница 8.2
Еще от автора
≡ к списку статей