Этюды по программированию. Хитрости создания расширений для конфигураций на БСП. Часть 2

Публикация № 1044424

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

Расширение БСП

42
Некоторые нюансы, если вы захотите создавать свои расширения. Продолжение первой части.

Этюды по программированию. Хитрости создания расширений для конфигураций на БСП. Часть 2.

 

Первая часть статьи  здесь: //catalog.mista.ru/public/996052/

Рассмотрим модификацию справочника основной конфигурации и формы элемента, без затягивания формы в расширение на примере модификации справочника сотрудника в конфигурации ЗУП 3.1.

В  первую очередь затянем в расширение сам справочник и добавим ему необходимые реквизиты и табличные части:

После этого проанализируем модуль формы:

&НаСервере

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

//…

СотрудникиФормы.СотрудникиПриСозданииНаСервере(ЭтотОбъект, Отказ, СтандартнаяОбработка);

//…

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

В процедуре “ПриСозданииНаСервере” есть подходящий нам вызов общего модуля, в который передается ЭтотОбъект.

Затянем модуль “ СотрудникиФормы ” его в раcширение и модифицируем процедуру “ СотрудникиПриСозданииНаСервере” таким образом, чтоб после выполнения стандартной функции вызывался наш код создания элементов на форме:

&После("СотрудникиПриСозданииНаСервере")

Процедура ИЦ_СотрудникиПриСозданииНаСервере(Форма, Отказ, СтандартнаяОбработка) Экспорт

//… наш код создания реквизитов на форме

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

Осталось прописать код создания элементов. Вручную делать это долго и нудно, нам для этого подойдет замечательная бесплатная  обработка для генерации кода элементов по форме образцу:

Декомпиляция управляемых форм (3.0.1)  //catalog.mista.ru/public/304736/  от Евгении Карук (Не забудьте поставить ей плюс).

Код формирования элементов из обработки:

	/////   ЭЛЕМЕНТЫ   //////////
	
	
	// ******   Группа формы "Страницы"    ***********
	
	НовыйЭлемент = Этаформа.Элементы.Вставить("Страницы",Тип("ГруппаФормы"),Неопределено,Неопределено);
	НовыйЭлемент.Вид = ВидГруппыФормы.Страницы;
	НовыйЭлемент.Заголовок = "Страницы";
	НовыйЭлемент.Подсказка = "Страницы";
	
	// ******   Группа формы "Степень"    ***********
	
	НовыйЭлемент = Этаформа.Элементы.Вставить("Степень",Тип("ГруппаФормы"),ЭтаФорма.Элементы.Страницы,Неопределено);
	НовыйЭлемент.Вид = ВидГруппыФормы.Страница;
	НовыйЭлемент.Заголовок = "Степень  владения оборудованием";
	НовыйЭлемент.Подсказка = "Степень";
	
	// ******   Таблица формы "ИЦ_Оборудование"    ***********
	
	НовыйЭлемент = Этаформа.Элементы.Вставить("ИЦ_Оборудование",Тип("ТаблицаФормы"),ЭтаФорма.Элементы.Степень,Неопределено);
	НовыйЭлемент.ПутьКДанным = "Сотрудник.ИЦ_Оборудование";
	НовыйЭлемент.АвтоВводНовойСтроки = Истина;
	НовыйЭлемент.Отображение = ОтображениеТаблицы.ИерархическийСписок;
	НовыйЭлемент.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет;
	НовыйЭлемент.РежимВыделения = РежимВыделенияТаблицы.Множественный;
	НовыйЭлемент.АвтоМаксимальнаяШирина=Ложь;
	
	// ******   Поле формы "ИЦ_ОборудованиеИЦ_СтепеньВладенияОборудованием"    ***********
	
	НовыйЭлемент = Этаформа.Элементы.Вставить("ИЦ_ОборудованиеИЦ_СтепеньВладенияОборудованием",Тип("ПолеФормы"),ЭтаФорма.Элементы.ИЦ_Оборудование,Неопределено);
	НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
	НовыйЭлемент.ПутьКДанным = "Сотрудник.ИЦ_Оборудование.ИЦ_СтепеньВладенияОборудованием";
	
	// ******   Поле формы "ИЦ_ОборудованиеОсновной"    ***********
	
	НовыйЭлемент = Этаформа.Элементы.Вставить("ИЦ_ОборудованиеОсновной",Тип("ПолеФормы"),ЭтаФорма.Элементы.ИЦ_Оборудование,ЭтаФорма.Элементы.ИЦ_ОборудованиеИЦ_СтепеньВладенияОборудованием);
	НовыйЭлемент.Вид = ВидПоляФормы.ПолеФлажка;
	НовыйЭлемент.ПутьКДанным = "Сотрудник.ИЦ_Оборудование.Основной";
	НовыйЭлемент.Видимость=Ложь;
	
	// ******   Поле формы "ИЦ_ОборудованиеМожетРаботатьНаСледующемОборудование"    ***********
	
	НовыйЭлемент = Этаформа.Элементы.Вставить("ИЦ_ОборудованиеМожетРаботатьНаСледующемОборудование",Тип("ПолеФормы"),ЭтаФорма.Элементы.ИЦ_Оборудование,ЭтаФорма.Элементы.ИЦ_ОборудованиеОсновной);
	НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
	НовыйЭлемент.ПутьКДанным = "Сотрудник.ИЦ_Оборудование.МожетРаботатьНаСледующемОборудование";
	
	// ******   Поле формы "ИЦ_ОборудованиеНомерСтроки"    ***********
	
	НовыйЭлемент = Этаформа.Элементы.Вставить("ИЦ_ОборудованиеНомерСтроки",Тип("ПолеФормы"),ЭтаФорма.Элементы.ИЦ_Оборудование,ЭтаФорма.Элементы.ИЦ_ОборудованиеМожетРаботатьНаСледующемОборудование);
	НовыйЭлемент.Вид = ВидПоляФормы.ПолеНадписи;
	НовыйЭлемент.ПутьКДанным = "Сотрудник.ИЦ_Оборудование.НомерСтроки";
	
	// ******   Группа формы "Настройки"    ***********
	
	НовыйЭлемент = Этаформа.Элементы.Вставить("Настройки",Тип("ГруппаФормы"),ЭтаФорма.Элементы.Страницы,ЭтаФорма.Элементы.Степень);
	//НовыйЭлемент = Этаформа.Элементы.Вставить("Настройки",Тип("ГруппаФормы"),ЭтаФорма.Элементы.Страницы);
	НовыйЭлемент.Вид = ВидГруппыФормы.Страница;
	НовыйЭлемент.Заголовок = "Настройки сотрудника ИЦ";
	НовыйЭлемент.Подсказка = "Настройки";
	
	// ******   Поле формы "КодГейт"    ***********
	
	НовыйЭлемент = Этаформа.Элементы.Вставить("КодГейт",Тип("ПолеФормы"),ЭтаФорма.Элементы.Настройки,Неопределено);
	НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
	НовыйЭлемент.ПутьКДанным = "Сотрудник.КодГейт";
	
	// ******   Группа формы "Группа1"    ***********
	
	НовыйЭлемент = Этаформа.Элементы.Вставить("Группа1",Тип("ГруппаФормы"),ЭтаФорма.Элементы.Настройки,ЭтаФорма.Элементы.КодГейт);
	НовыйЭлемент.Вид = ВидГруппыФормы.ОбычнаяГруппа;
	НовыйЭлемент.Группировка =ГруппировкаПодчиненныхЭлементовФормы.ГоризонтальнаяЕслиВозможно ;
	НовыйЭлемент.ОтображатьЗаголовок = Ложь;
	НовыйЭлемент.Отображение = ОтображениеОбычнойГруппы.Нет;
	
	// ******   Поле формы "Участок"    ***********
	
	НовыйЭлемент = Этаформа.Элементы.Вставить("Участок",Тип("ПолеФормы"),ЭтаФорма.Элементы.Настройки,ЭтаФорма.Элементы.Группа1);
	НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
	НовыйЭлемент.ПутьКДанным = "Сотрудник.Участок";
	
	// ******   Поле формы "ОсновноеОборудование"    ***********
	
	НовыйЭлемент = Этаформа.Элементы.Вставить("ОсновноеОборудование",Тип("ПолеФормы"),ЭтаФорма.Элементы.Настройки,ЭтаФорма.Элементы.Участок);
	НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
	НовыйЭлемент.ПутьКДанным = "Сотрудник.ОсновноеОборудование";
	
	// ******   Поле формы "Подразделение"    ***********
	
	НовыйЭлемент = Этаформа.Элементы.Вставить("Подразделение",Тип("ПолеФормы"),ЭтаФорма.Элементы.Настройки,ЭтаФорма.Элементы.ОсновноеОборудование);
	НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
	НовыйЭлемент.Заголовок = "Подразделение (ИЦ)";
	НовыйЭлемент.ПутьКДанным = "Сотрудник.Подразделение";
	//

В итоге у нас получилось следующая картинка внизу формы сотрудника:

На второй закладке необходимо получить:

 

Для этого нам на форме нужна команда “Сделать основным”, делающая основной выбранную табличную строку ТЧ “ИЦ_Оборудование”

	
	// ******   Команда формы "СделатьОсновным"    ***********
	
	НоваяКоманда = ЭтаФорма.Команды.Добавить("СделатьОсновным");
	НоваяКоманда.Действие = "Подключаемый_ВыполнитьКоманду";
	НоваяКоманда.Заголовок = "Сделать основным";
	НоваяКоманда.ИзменяетСохраняемыеДанные = Ложь;
	НоваяКоманда.Отображение = ОтображениеКнопки.Авто;
	НоваяКоманда.Подсказка = "Сделать основным";
	
	КнопкаФормы = ЭтаФорма.Элементы.Добавить(НоваяКоманда.Имя, Тип("КнопкаФормы"), ЭтаФорма.Элементы.ИЦ_ОборудованиеКоманднаяПанель);
	КнопкаФормы.Вид = ВидКнопкиФормы.КнопкаКоманднойПанели;
	КнопкаФормы.ИмяКоманды = НоваяКоманда.Имя;
	

Обратите внимание на строку:

НоваяКоманда.Действие = "Подключаемый_ВыполнитьКоманду";

В качестве команды мы выбрали процедуру обработчик “Подключаемый_ВыполнитьКоманду” которая уже есть в модуле формы и служит для подключения динамических команд, таких как команды печати, которые определяются в модуле формы.

Мы сделаем проще: затянем в расширение модуль ”ПодключаемыеКомандыКлиент” и модифицируем процедуру “ВыполнитьКоманду” таким образом, чтоб вместо выполнения стандартной функции вызывался наш код, но только для нашей команды. Если команда не наша, то работает основной механизм.

&Вместо("ВыполнитьКоманду")
Процедура ИЦ_ВыполнитьКоманду(Форма, Команда, Источник) Экспорт
	Если Форма.ИмяФормы="Справочник.Сотрудники.Форма.ФормаЭлемента" И Команда.Имя= "СделатьОсновным" Тогда
		ТекОборуд = Форма.Элементы.ИЦ_Оборудование.ТекущиеДанные.МожетРаботатьНаСледующемОборудование;
		Сотрудник= Источник;
		ИЦ_Сервер.НазначитьОсновнымНаСервере(Сотрудник,ТекОборуд);
		КопироватьДанныеФормы(Сотрудник, Источник);
	Иначе
		ПродолжитьВызов(Форма, Команда, Источник);
	КонецЕсли;
КонецПроцедуры

//... в модуле ИЦ_Сервер:

&НаСервере
Процедура НазначитьОсновнымНаСервере(Объект,ТекОборуд) Экспорт
	Объект.ОсновноеОборудование = ТекОборуд;
	Для Каждого СтрОборуд из Объект.ИЦ_Оборудование Цикл
		Если СтрОборуд.МожетРаботатьНаСледующемОборудование <> ТекОборуд Тогда
			СтрОборуд.Основной = Ложь;
		Иначе
			СтрОборуд.Основной = Истина;
		КонецЕсли;
	КонецЦикла;	
КонецПроцедуры

Осталось дописать код условного оформления для формы.

	// ******  УсловноеОформление   ***********
	ТекущийШрифт = ЭтаФорма.Элементы["ИЦ_Оборудование"].Шрифт;
	ЖирныйШрифт = Новый Шрифт(ТекущийШрифт, , , Истина);
	ЭлементУсловногоОформления=ЭтаФорма.УсловноеОформление.Элементы.Добавить();
	ФильтрЭлемента=ЭлементУсловногоОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ФильтрЭлемента.ЛевоеЗначение=Новый ПолеКомпоновкиДанных("Сотрудник.ИЦ_Оборудование.Основной");
	ФильтрЭлемента.ВидСравнения=ВидСравненияКомпоновкиДанных.Равно;
	ФильтрЭлемента.ПравоеЗначение=Истина;
	ФильтрЭлемента.Использование=Истина;
	ОформляемыеПоля=ЭлементУсловногоОформления.Поля.Элементы.Добавить();
	ОформляемыеПоля.Использование=Истина;
	ОформляемыеПоля.Поле=Новый ПолеКомпоновкиДанных("ИЦ_ОборудованиеМожетРаботатьНаСледующемОборудование");
	ОформляемыеПоля=ЭлементУсловногоОформления.Поля.Элементы.Добавить();
	ОформляемыеПоля.Использование=Истина;
	ОформляемыеПоля.Поле=Новый ПолеКомпоновкиДанных("ИЦ_ОборудованиеИЦ_СтепеньВладенияОборудованием");
	ЭлементУсловногоОформления.Оформление.УстановитьЗначениеПараметра("Шрифт", ЖирныйШрифт);
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	ИЦ_СтепеньВладенияОборудованием.Ссылка КАК Ссылка,
	|	ИЦ_СтепеньВладенияОборудованием.ЦветОтображения КАК ЦветОтображения
	|ИЗ
	|	Справочник.ИЦ_СтепеньВладенияОборудованием КАК ИЦ_СтепеньВладенияОборудованием";
	
	РезультатЗапроса = Запрос.Выполнить();
	
	ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	
	Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
		ЭлементУсловногоОформления=ЭтаФорма.УсловноеОформление.Элементы.Добавить();
		ФильтрЭлемента=ЭлементУсловногоОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
		ФильтрЭлемента.ЛевоеЗначение=Новый ПолеКомпоновкиДанных("Сотрудник.ИЦ_Оборудование.ИЦ_СтепеньВладенияОборудованием");
		ФильтрЭлемента.ВидСравнения=ВидСравненияКомпоновкиДанных.Равно;
		ФильтрЭлемента.ПравоеЗначение=ВыборкаДетальныеЗаписи.Ссылка;
		ФильтрЭлемента.Использование=Истина;
		ОформляемыеПоля=ЭлементУсловногоОформления.Поля.Элементы.Добавить();
		ОформляемыеПоля.Использование=Истина;
		ОформляемыеПоля.Поле=Новый ПолеКомпоновкиДанных("ИЦ_ОборудованиеИЦ_СтепеньВладенияОборудованием");
		ЭлементУсловногоОформления.Оформление.УстановитьЗначениеПараметра("ЦветФона", ВыборкаДетальныеЗаписи.ЦветОтображения.Получить());
	КонецЦикла;

 

 

Акция! Вы можете  скачать архив всех моих разработок, которые я предлагаю за StartMone, по Специальной  цене:  //infostart.ru/public/960899/#archive

.

Молочников Олег Spb. 2019.

42

См. также

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо
2. milkers 2336 16.04.19 15:42 Сейчас в теме
(1) Я читал документацию по этой подсистеме. Если следовать всей процедуре то количество кода сильно увеличится, а результат будет тот же.
3. echo77 1082 16.04.19 17:59 Сейчас в теме
4. davdykin 17 17.04.19 04:59 Сейчас в теме
(3) Ну и зря вы.. Старт монЕ, звучит куда благородней чем старт мани ))
5. the1 363 17.04.19 09:07 Сейчас в теме
А почему новые реквизиты расширения без префиксов?
6. milkers 2336 17.04.19 09:16 Сейчас в теме
(5) По-тому что поленился переименовывать. Переделываю готовое решение в расширение. Слишком много сложного кода придется переписывать.
7. mai@kopak.ru 18.04.19 08:43 Сейчас в теме
А я вот столкнулся с такой бедой - Ошибки при использовании расширения
Т.е. при добавлении какого-либо реквизита в документ в расширении и после ТиС эти документы исчезают из журналов.
Вот такая беда.
8. milkers 2336 23.04.19 14:01 Сейчас в теме
(7) Нет ли здесь проблемы с правами доступа на реквизит?
9. mai@kopak.ru 23.07.19 11:02 Сейчас в теме
(8) Создал уже отдельную роль и изменил существующую. Так же после тестирования очищаются реквизиты. Что за беда?
Оставьте свое сообщение