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

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

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

 

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

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

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

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

&НаСервере

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

//…

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

//…

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

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

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

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

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

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

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

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

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

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

 /////   ЭЛЕМЕНТЫ   //////////


// ******   Группа формы "Страницы"    ***********

НовыйЭлемент = Этаформа.Элементы.Вставить("Страницы",Тип("ГруппаФормы"),Неопределено,Неопределено);
НовыйЭлемент.Вид = ВидГруппыФормы.Страницы;
НовыйЭлемент.Заголовок = "Страницы";
НовыйЭлемент.Подсказка = "Страницы";

// ******   Группа формы "Степень"    ***********

НовыйЭлемент = Этаформа.Элементы.Вставить("Степень",Тип("ГруппаФормы"),ЭтаФорма.Элементы.Страницы,Неопределено);
НовыйЭлемент.Вид = ВидГруппыФормы.Страница;
НовыйЭлемент.Заголовок = "Степень  владения оборудованием";
НовыйЭлемент.Подсказка = "Степень";

// ******   Таблица формы "ИЦ_Оборудование"    ***********

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

// ******   Поле формы "ИЦ_ОборудованиеИЦ_СтепеньВладенияОборудованием"    ***********

НовыйЭлемент = Этаформа.Элементы.Вставить("ИЦ_ОборудованиеИЦ_СтепеньВладенияОборудованием",Тип("ПолеФормы"),ЭтаФорма.Элементы.ИЦ_Оборудование,Неопределено);
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
НовыйЭлемент.ПутьКДанным = "Сотрудник.ИЦ_Оборудование.ИЦ_СтепеньВладенияОборудованием";

// ******   Поле формы "ИЦ_ОборудованиеОсновной"    ***********

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

// ******   Поле формы "ИЦ_ОборудованиеМожетРаботатьНаСледующемОборудование"    ***********

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

// ******   Поле формы "ИЦ_ОборудованиеНомерСтроки"    ***********

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

// ******   Группа формы "Настройки"    ***********

НовыйЭлемент = Этаформа.Элементы.Вставить("Настройки",Тип("ГруппаФормы"),ЭтаФорма.Элементы.Страницы,ЭтаФорма.Элементы.Степень);
//НовыйЭлемент = Этаформа.Элементы.Вставить("Настройки",Тип("ГруппаФормы"),ЭтаФорма.Элементы.Страницы);
НовыйЭлемент.Вид = ВидГруппыФормы.Страница;
НовыйЭлемент.Заголовок = "Настройки сотрудника ИЦ";
НовыйЭлемент.Подсказка = "Настройки";

// ******   Поле формы "КодГейт"    ***********

НовыйЭлемент = Этаформа.Элементы.Вставить("КодГейт",Тип("ПолеФормы"),ЭтаФорма.Элементы.Настройки,Неопределено);
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
НовыйЭлемент.ПутьКДанным = "Сотрудник.КодГейт";

// ******   Группа формы "Группа1"    ***********

НовыйЭлемент = Этаформа.Элементы.Вставить("Группа1",Тип("ГруппаФормы"),ЭтаФорма.Элементы.Настройки,ЭтаФорма.Элементы.КодГейт);
НовыйЭлемент.Вид = ВидГруппыФормы.ОбычнаяГруппа;
НовыйЭлемент.Группировка =ГруппировкаПодчиненныхЭлементовФормы.ГоризонтальнаяЕслиВозможно ;
НовыйЭлемент.ОтображатьЗаголовок = Ложь;
НовыйЭлемент.Отображение = ОтображениеОбычнойГруппы.Нет;

// ******   Поле формы "Участок"    ***********

НовыйЭлемент = Этаформа.Элементы.Вставить("Участок",Тип("ПолеФормы"),ЭтаФорма.Элементы.Настройки,ЭтаФорма.Элементы.Группа1);
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
НовыйЭлемент.ПутьКДанным = "Сотрудник.Участок";

// ******   Поле формы "ОсновноеОборудование"    ***********

НовыйЭлемент = Этаформа.Элементы.Вставить("ОсновноеОборудование",Тип("ПолеФормы"),ЭтаФорма.Элементы.Настройки,ЭтаФорма.Элементы.Участок);
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
НовыйЭлемент.ПутьКДанным = "Сотрудник.ОсновноеОборудование";

// ******   Поле формы "Подразделение"    ***********

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

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

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

 

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


// ******   Команда формы "СделатьОсновным"    ***********

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

КнопкаФормы = ЭтаФорма.Элементы.Добавить(НоваяКоманда.Имя, Тип("КнопкаФормы"), ЭтаФорма.Элементы.ИЦ_ОборудованиеКоманднаяПанель);
КнопкаФормы.Вид = ВидКнопкиФормы.КнопкаКоманднойПанели;
КнопкаФормы.ИмяКоманды = НоваяКоманда.Имя;

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

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

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

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

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

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

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

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

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

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ИЦ_СтепеньВладенияОборудованием.Ссылка КАК Ссылка,
| ИЦ_СтепеньВладенияОборудованием.ЦветОтображения КАК ЦветОтображения
|ИЗ
| Справочник.ИЦ_СтепеньВладенияОборудованием КАК ИЦ_СтепеньВладенияОборудованием";

РезультатЗапроса = Запрос.Выполнить();

ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

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

 

 

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

.

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

8 Comments

  1. zeegin

    Советую потратить немного времени и разобраться в подсистеме ПодключаемыеКоманды БСП: https://its.1c.ru/db/bsp302doc#content:54:1:issogl2_%D1%80%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%­B8%D0%B5_%D0%B2%D0%B8%D0%B4%D0%BE%D0%B2_%D0%BF%D0%BE%D0%B4%D­0%BA%D0%BB%D1%8E%D1%87%D0%B0%D0%B5%D0%BC%D1%8B%D1%85_%D0%BA%­D0%BE%D0%BC%D0%B0%D0%BD%D0%B4

    Reply
  2. milkers

    (1) Я читал документацию по этой подсистеме. Если следовать всей процедуре то количество кода сильно увеличится, а результат будет тот же.

    Reply
  3. davdykin

    (3) Ну и зря вы.. Старт монЕ, звучит куда благородней чем старт мани ))

    Reply
  4. the1

    А почему новые реквизиты расширения без префиксов?

    Reply
  5. milkers

    (5) По-тому что поленился переименовывать. Переделываю готовое решение в расширение. Слишком много сложного кода придется переписывать.

    Reply
  6. mai_k

    А я вот столкнулся с такой бедой — Ошибки при использовании расширения

    Т.е. при добавлении какого-либо реквизита в документ в расширении и после ТиС эти документы исчезают из журналов.

    Вот такая беда.

    Reply
  7. milkers

    (7) Нет ли здесь проблемы с правами доступа на реквизит?

    Reply
  8. mai_k

    (8) Создал уже отдельную роль и изменил существующую. Так же после тестирования очищаются реквизиты. Что за беда?

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *