Этюды по программированию. Хитрости создания расширений для конфигураций на БСП. Часть 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