Этюды по программированию. Хитрости создания расширений для конфигураций на БСП. Часть 2.
Первая часть статьи здесь: //infostart.ru/public/996052/
Третья часть статьи здесь: //infostart.ru/1c/articles/2240529/
Рассмотрим модификацию справочника основной конфигурации и формы элемента, без затягивания формы в расширение на примере модификации справочника сотрудника в конфигурации ЗУП 3.1.
В первую очередь затянем в расширение сам справочник и добавим ему необходимые реквизиты и табличные части:

После этого проанализируем модуль формы:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
//…
СотрудникиФормы.СотрудникиПриСозданииНаСервере(ЭтотОбъект, Отказ, СтандартнаяОбработка);
//…
КонецПроцедуры
В процедуре “ПриСозданииНаСервере” есть подходящий нам вызов общего модуля, в который передается ЭтотОбъект.
Затянем модуль “ СотрудникиФормы ” его в раcширение и модифицируем процедуру “ СотрудникиПриСозданииНаСервере” таким образом, чтоб после выполнения стандартной функции вызывался наш код создания элементов на форме:
&После("СотрудникиПриСозданииНаСервере")
Процедура ИЦ_СотрудникиПриСозданииНаСервере(Форма, Отказ, СтандартнаяОбработка) Экспорт
//… наш код создания реквизитов на форме
КонецПроцедуры
Осталось прописать код создания элементов. Вручную делать это долго и нудно, нам для этого подойдет замечательная бесплатная обработка для генерации кода элементов по форме образцу:
Декомпиляция управляемых форм (3.0.1) //infostart.ru/public/304736/ от Евгении Карук (Не забудьте поставить ей плюс).
Новая, более продвинутая версия декомпиляции от Сергея Муравьева //infostart.ru/1c/tools/2235081/
Код формирования элементов из обработки:
	/////   ЭЛЕМЕНТЫ   //////////
	
	
	// ******   Группа формы "Страницы"    ***********
	
	НовыйЭлемент = Этаформа.Элементы.Вставить("Страницы",Тип("ГруппаФормы"),Неопределено,Неопределено);
	НовыйЭлемент.Вид = ВидГруппыФормы.Страницы;
	НовыйЭлемент.Заголовок = "Страницы";
	НовыйЭлемент.Подсказка = "Страницы";
	
	// ******   Группа формы "Степень"    ***********
	
	НовыйЭлемент = Этаформа.Элементы.Вставить("Степень",Тип("ГруппаФормы"),ЭтаФорма.Элементы.Страницы,Неопределено);
	НовыйЭлемент.Вид = ВидГруппыФормы.Страница;
	НовыйЭлемент.Заголовок = "Степень  владения оборудованием";
	НовыйЭлемент.Подсказка = "Степень";
	
	// ******   Таблица формы "ИЦ_Оборудование"    ***********
	
	НовыйЭлемент = Этаформа.Элементы.Вставить("ИЦ_Оборудование",Тип("ТаблицаФормы"),ЭтаФорма.Элементы.Степень,Неопределено);
	НовыйЭлемент.ПутьКДанным = "Сотрудник.ИЦ_Оборудование";
	НовыйЭлемент.АвтоВводНовойСтроки = Истина;
	НовыйЭлемент.Отображение = ОтображениеТаблицы.ИерархическийСписок;
	НовыйЭлемент.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет;
	НовыйЭлемент.РежимВыделения = РежимВыделенияТаблицы.Множественный;
	НовыйЭлемент.АвтоМаксимальнаяШирина=Ложь;
	
	// ******   Поле формы "ИЦ_ОборудованиеИЦ_СтепеньВладенияОборудованием"    ***********
	
	НовыйЭлемент = Этаформа.Элементы.Вставить("ИЦ_ОборудованиеИЦ_СтепеньВладенияОборудованием",Тип("ПолеФормы"),ЭтаФорма.Элементы.ИЦ_Оборудование,Неопределено);
	НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
	НовыйЭлемент.ПутьКДанным = "Сотрудник.ИЦ_Оборудование.ИЦ_СтепеньВладенияОборудованием";
	
	// ******   Поле формы "ИЦ_ОборудованиеОсновной"    ***********
	
	НовыйЭлемент = Этаформа.Элементы.Вставить("ИЦ_ОборудованиеОсновной",Тип("ПолеФормы"),ЭтаФорма.Элементы.ИЦ_Оборудование,ЭтаФорма.Элементы.ИЦ_ОборудованиеИЦ_СтепеньВладенияОборудованием);
	НовыйЭлемент.Вид = ВидПоляФормы.ПолеФлажка;
	НовыйЭлемент.ПутьКДанным = "Сотрудник.ИЦ_Оборудование.Основной";
	НовыйЭлемент.Видимость=Ложь;
	
	// ******   Поле формы "ИЦ_ОборудованиеМожетРаботатьНаСледующемОборудование"    ***********
	
	НовыйЭлемент = Этаформа.Элементы.Вставить("ИЦ_ОборудованиеМожетРаботатьНаСледующемОборудование",Тип("ПолеФормы"),ЭтаФорма.Элементы.ИЦ_Оборудование,ЭтаФорма.Элементы.ИЦ_ОборудованиеОсновной);
	НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
	НовыйЭлемент.ПутьКДанным = "Сотрудник.ИЦ_Оборудование.МожетРаботатьНаСледующемОборудование";
	
	// ******   Поле формы "ИЦ_ОборудованиеНомерСтроки"    ***********
	
	НовыйЭлемент = Этаформа.Элементы.Вставить("ИЦ_ОборудованиеНомерСтроки",Тип("ПолеФормы"),ЭтаФорма.Элементы.ИЦ_Оборудование,ЭтаФорма.Элементы.ИЦ_ОборудованиеМожетРаботатьНаСледующемОборудование);
	НовыйЭлемент.Вид = ВидПоляФормы.ПолеНадписи;
	НовыйЭлемент.ПутьКДанным = "Сотрудник.ИЦ_Оборудование.НомерСтроки";
	
	// ******   Группа формы "Настройки"    ***********
	
	НовыйЭлемент = Этаформа.Элементы.Вставить("Настройки",Тип("ГруппаФормы"),ЭтаФорма.Элементы.Страницы,ЭтаФорма.Элементы.Степень);
	//НовыйЭлемент = Этаформа.Элементы.Вставить("Настройки",Тип("ГруппаФормы"),ЭтаФорма.Элементы.Страницы);
	НовыйЭлемент.Вид = ВидГруппыФормы.Страница;
	НовыйЭлемент.Заголовок = "Настройки сотрудника ИЦ";
	НовыйЭлемент.Подсказка = "Настройки";
	
	// ******   Поле формы "КодГейт"    ***********
	
	НовыйЭлемент = Этаформа.Элементы.Вставить("КодГейт",Тип("ПолеФормы"),ЭтаФорма.Элементы.Настройки,Неопределено);
	НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
	НовыйЭлемент.ПутьКДанным = "Сотрудник.КодГейт";
	
	// ******   Группа формы "Группа1"    ***********
	
	НовыйЭлемент = Этаформа.Элементы.Вставить("Группа1",Тип("ГруппаФормы"),ЭтаФорма.Элементы.Настройки,ЭтаФорма.Элементы.КодГейт);
	НовыйЭлемент.Вид = ВидГруппыФормы.ОбычнаяГруппа;
	НовыйЭлемент.Группировка =ГруппировкаПодчиненныхЭлементовФормы.ГоризонтальнаяЕслиВозможно ;
	НовыйЭлемент.ОтображатьЗаголовок = Ложь;
	НовыйЭлемент.Отображение = ОтображениеОбычнойГруппы.Нет;
	
	// ******   Поле формы "Участок"    ***********
	
	НовыйЭлемент = Этаформа.Элементы.Вставить("Участок",Тип("ПолеФормы"),ЭтаФорма.Элементы.Настройки,ЭтаФорма.Элементы.Группа1);
	НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
	НовыйЭлемент.ПутьКДанным = "Сотрудник.Участок";
	
	// ******   Поле формы "ОсновноеОборудование"    ***********
	
	НовыйЭлемент = Этаформа.Элементы.Вставить("ОсновноеОборудование",Тип("ПолеФормы"),ЭтаФорма.Элементы.Настройки,ЭтаФорма.Элементы.Участок);
	НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
	НовыйЭлемент.ПутьКДанным = "Сотрудник.ОсновноеОборудование";
	
	// ******   Поле формы "Подразделение"    ***********
	
	НовыйЭлемент = Этаформа.Элементы.Вставить("Подразделение",Тип("ПолеФормы"),ЭтаФорма.Элементы.Настройки,ЭтаФорма.Элементы.ОсновноеОборудование);
	НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
	НовыйЭлемент.Заголовок = "Подразделение (ИЦ)";
	НовыйЭлемент.ПутьКДанным = "Сотрудник.Подразделение";
	//
В итоге у нас получилось следующая картинка внизу формы сотрудника:

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

Для этого нам на форме нужна команда “Сделать основным”, делающая основной выбранную табличную строку ТЧ “ИЦ_Оборудование”
	
	// ******   Команда формы "СделатьОсновным"    ***********
	
	НоваяКоманда = ЭтаФорма.Команды.Добавить("СделатьОсновным");
	НоваяКоманда.Действие = "Подключаемый_ВыполнитьКоманду";
	НоваяКоманда.Заголовок = "Сделать основным";
	НоваяКоманда.ИзменяетСохраняемыеДанные = Ложь;
	НоваяКоманда.Отображение = ОтображениеКнопки.Авто;
	НоваяКоманда.Подсказка = "Сделать основным";
	
	КнопкаФормы = ЭтаФорма.Элементы.Добавить(НоваяКоманда.Имя, Тип("КнопкаФормы"), ЭтаФорма.Элементы.ИЦ_ОборудованиеКоманднаяПанель);
	КнопкаФормы.Вид = ВидКнопкиФормы.КнопкаКоманднойПанели;
	КнопкаФормы.ИмяКоманды = НоваяКоманда.Имя;
	
Обратите внимание на строку:
НоваяКоманда.Действие = "Подключаемый_ВыполнитьКоманду";
В качестве команды мы выбрали процедуру обработчик “Подключаемый_ВыполнитьКоманду” которая уже есть в модуле формы и служит для подключения динамических команд, таких как команды печати, которые определяются в модуле формы.
Мы сделаем проще: затянем в расширение модуль ”ПодключаемыеКомандыКлиент” и модифицируем процедуру “ВыполнитьКоманду” таким образом, чтоб вместо выполнения стандартной функции вызывался наш код, но только для нашей команды. Если команда не наша, то работает основной механизм.
&Вместо("ВыполнитьКоманду")
Процедура ИЦ_ВыполнитьКоманду(Форма, Команда, Источник) Экспорт
	Если Форма.ИмяФормы="Справочник.Сотрудники.Форма.ФормаЭлемента" И Команда.Имя= "СделатьОсновным" Тогда
		ТекОборуд = Форма.Элементы.ИЦ_Оборудование.ТекущиеДанные.МожетРаботатьНаСледующемОборудование;
		Сотрудник= Источник;
		ИЦ_Сервер.НазначитьОсновнымНаСервере(Сотрудник,ТекОборуд);
		КопироватьДанныеФормы(Сотрудник, Источник);
	Иначе
		ПродолжитьВызов(Форма, Команда, Источник);
	КонецЕсли;
КонецПроцедуры
//... в модуле ИЦ_Сервер:
&НаСервере
Процедура НазначитьОсновнымНаСервере(Объект,ТекОборуд) Экспорт
	Объект.ОсновноеОборудование = ТекОборуд;
	Для Каждого СтрОборуд из Объект.ИЦ_Оборудование Цикл
		Если СтрОборуд.МожетРаботатьНаСледующемОборудование <> ТекОборуд Тогда
			СтрОборуд.Основной = Ложь;
		Иначе
			СтрОборуд.Основной = Истина;
		КонецЕсли;
	КонецЦикла;	
КонецПроцедуры
Осталось дописать код условного оформления для формы.
	// ******  УсловноеОформление   ***********
	ТекущийШрифт = ЭтаФорма.Элементы["ИЦ_Оборудование"].Шрифт;
	ЖирныйШрифт = Новый Шрифт(ТекущийШрифт, , , Истина);
	ЭлементУсловногоОформления=ЭтаФорма.УсловноеОформление.Элементы.Добавить();
	ФильтрЭлемента=ЭлементУсловногоОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ФильтрЭлемента.ЛевоеЗначение=Новый ПолеКомпоновкиДанных("Сотрудник.ИЦ_Оборудование.Основной");
	ФильтрЭлемента.ВидСравнения=ВидСравненияКомпоновкиДанных.Равно;
	ФильтрЭлемента.ПравоеЗначение=Истина;
	ФильтрЭлемента.Использование=Истина;
	ОформляемыеПоля=ЭлементУсловногоОформления.Поля.Элементы.Добавить();
	ОформляемыеПоля.Использование=Истина;
	ОформляемыеПоля.Поле=Новый ПолеКомпоновкиДанных("ИЦ_ОборудованиеМожетРаботатьНаСледующемОборудование");
	ОформляемыеПоля=ЭлементУсловногоОформления.Поля.Элементы.Добавить();
	ОформляемыеПоля.Использование=Истина;
	ОформляемыеПоля.Поле=Новый ПолеКомпоновкиДанных("ИЦ_ОборудованиеИЦ_СтепеньВладенияОборудованием");
	ЭлементУсловногоОформления.Оформление.УстановитьЗначениеПараметра("Шрифт", ЖирныйШрифт);
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	ИЦ_СтепеньВладенияОборудованием.Ссылка КАК Ссылка,
	|	ИЦ_СтепеньВладенияОборудованием.ЦветОтображения КАК ЦветОтображения
	|ИЗ
	|	Справочник.ИЦ_СтепеньВладенияОборудованием КАК ИЦ_СтепеньВладенияОборудованием";
	
	РезультатЗапроса = Запрос.Выполнить();
	
	ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	
	Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
		ЭлементУсловногоОформления=ЭтаФорма.УсловноеОформление.Элементы.Добавить();
		ФильтрЭлемента=ЭлементУсловногоОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
		ФильтрЭлемента.ЛевоеЗначение=Новый ПолеКомпоновкиДанных("Сотрудник.ИЦ_Оборудование.ИЦ_СтепеньВладенияОборудованием");
		ФильтрЭлемента.ВидСравнения=ВидСравненияКомпоновкиДанных.Равно;
		ФильтрЭлемента.ПравоеЗначение=ВыборкаДетальныеЗаписи.Ссылка;
		ФильтрЭлемента.Использование=Истина;
		ОформляемыеПоля=ЭлементУсловногоОформления.Поля.Элементы.Добавить();
		ОформляемыеПоля.Использование=Истина;
		ОформляемыеПоля.Поле=Новый ПолеКомпоновкиДанных("ИЦ_ОборудованиеИЦ_СтепеньВладенияОборудованием");
		ЭлементУсловногоОформления.Оформление.УстановитьЗначениеПараметра("ЦветФона", ВыборкаДетальныеЗаписи.ЦветОтображения.Получить());
	КонецЦикла;
Другие разработки автора:
Акция! Вы можете скачать архив всех моих разработок, которые я предлагаю за StartMone, по Специальной цене: //infostart.ru/public/960899/#archive
Молочников Олег Spb. 2024
Вступайте в нашу телеграмм-группу Инфостарт
 
                                    








 
                                     
                                    