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

20.11.24

Разработка - БСП (Библиотека стандартных подсистем)

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

Этюды по программированию. Хитрости создания расширений для конфигураций на БСП. Часть 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);
	НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
	НовыйЭлемент.ПутьКДанным = "Сотрудник.Участок";
	
	// ******   Поле формы "ОсновноеОборудование"    ***********
	
	НовыйЭлемент = Этаформа.Элементы.Вставить("ОсновноеОборудование",Тип("ПолеФормы"),ЭтаФорма.Элементы.Настройки,ЭтаФорма.Элементы.Участок);
	НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
	НовыйЭлемент.ПутьКДанным = "Сотрудник.ОсновноеОборудование";
	
	// ******   Поле формы "Подразделение"    ***********
	
	НовыйЭлемент = Этаформа.Элементы.Вставить("Подразделение",Тип("ПолеФормы"),ЭтаФорма.Элементы.Настройки,ЭтаФорма.Элементы.ОсновноеОборудование);
	НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
	НовыйЭлемент.Заголовок = "Подразделение (ИЦ)";
	НовыйЭлемент.ПутьКДанным = "Сотрудник.Подразделение";
	//

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

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

 

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

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

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

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

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

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

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

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

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

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

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

 

Другие разработки автора:

Подсистема штрихкодирования серий номенклатуры (УТ 11, КА, ERP)Подсистема штрихкодирования серий номенклатуры (УТ 11, КА, ERP)
Подсистема 'Входной контроль' для ERP ,КА , УТ 11
Подсистема 'Входной контроль' для ERP ,КА , УТ 11
Электронный обходной лист (расширение) для ERP, ЗУП, КА
Отправка электронных писем по задолженностям клиентов (ERP, УТ 11)Отправка электронных писем по задолженностям клиентов (ERP, УТ 11)
Excel Studio for 1CExcel Studio for 1C
Настраиваемый управленческий балансНастраиваемый управленческий баланс
Динамические отчеты СКД
Динамические отчеты СКД
Фоновая отправка уведомлений
Генератор кодаГенератор кода

 

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

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

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

См. также

Производство готовой продукции (работ, услуг) Рабочее место Пользователь Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Бухгалтерский учет Управленческий учет Платные (руб)

Расширение "Входной контроль" в 1С:ERP, КА 2.5, УТ11.5 и предназначено для удобства отражения операций входного контроля и их результатов в учетной системе, а также фотофиксации брака.

12000 руб.

02.02.2019    36759    43    22    

41

Сканер штрих-кода Пользователь Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Управленческий учет Платные (руб)

Стандартные конфигурации ERP, КА, УТ 11 позволяют работать с штрихкодированием серий. Есть только одно суровое ограничение – на упаковке должна быть этикетка для номенклатуры и отдельно для серии. Во многих случаях это критически неудобно.

12000 руб.

19.04.2021    22810    64    44    

57

Учет доходов и расходов Бизнес-аналитик Руководитель проекта Платформа 1С v8.3 Управляемые формы Система компоновки данных Конфигурации 1cv8 1С:ERP Управление предприятием 2 Управленческий учет Платные (руб)

Настраиваемый управленческий баланс в 1С предназначен для всех конфигураций, тестирован на: “Управление торговлей”, “Управление производственным предприятием”, “Комплексная автоматизация”, "ERP","УТ11". Содержит конструкторские средства для изменения состава статей баланса и их иерархии, формирования запросов для получения данных по статьям, изменения настроек отчетов для удобного формирования отчетов расшифровки по каждой из статей. Предусмотрено ручное введение данных по статьям баланса в виде ведомостей по датам.

12000 руб.

22.05.2011    98301    115    108    

188

БСП (Библиотека стандартных подсистем) Программист Платформа 1С v8.3 Бесплатно (free)

В статье описан алгоритм для включения документа или справочника в систему БСП. Будет полезно программистам 1С, начинающим работать с БСП.

24.10.2024    1083    PROSTO-1C    0    

12

БСП (Библиотека стандартных подсистем) Работа с интерфейсом Программист Платформа 1С v8.3 Бесплатно (free)

В материале описан универсальный механизм работы с добавленными элементами на общую форму «ФормаОтчета». Думаю, облегчит работу многим разработчикам.

08.10.2024    977    PROSTO-1C    4    

10

БСП (Библиотека стандартных подсистем) Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

04.10.2024    1829    MadRave    11    

24

БСП (Библиотека стандартных подсистем) Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

10.09.2024    1816    MadRave    1    

17

БСП (Библиотека стандартных подсистем) Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

А что, если долгожданная реализация Паузы в 1С смутно напоминает старую, проверенную? А?!

06.09.2024    1253    n_mezentsev    10    

8
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. zeegin 117 16.04.19 15:15 Сейчас в теме
2. milkers 2918 16.04.19 15:42 Сейчас в теме
(1) Я читал документацию по этой подсистеме. Если следовать всей процедуре то количество кода сильно увеличится, а результат будет тот же.
3. пользователь 16.04.19 17:59
Сообщение было скрыто модератором.
...
4. davdykin 25 17.04.19 04:59 Сейчас в теме
(3) Ну и зря вы.. Старт монЕ, звучит куда благородней чем старт мани ))
5. ixijixi 1913 17.04.19 09:07 Сейчас в теме
А почему новые реквизиты расширения без префиксов?
6. milkers 2918 17.04.19 09:16 Сейчас в теме
(5) По-тому что поленился переименовывать. Переделываю готовое решение в расширение. Слишком много сложного кода придется переписывать.
7. mai_k 18.04.19 08:43 Сейчас в теме
А я вот столкнулся с такой бедой - Ошибки при использовании расширения
Т.е. при добавлении какого-либо реквизита в документ в расширении и после ТиС эти документы исчезают из журналов.
Вот такая беда.
8. milkers 2918 23.04.19 14:01 Сейчас в теме
(7) Нет ли здесь проблемы с правами доступа на реквизит?
9. mai_k 23.07.19 11:02 Сейчас в теме
(8) Создал уже отдельную роль и изменил существующую. Так же после тестирования очищаются реквизиты. Что за беда?
10. tirli41 3 01.08.20 10:04 Сейчас в теме
Приветствую, конфа на БСП, как в расширении свой созданный документ прикрутить к СтруктуреПодчиненности основной конфигурации для отображения? В расширении док "Расш1_Заявка" на его основании успешно создается и заполняется типовой "ПоступлениеТМЗ", так как нет возможности расширить тип реквизита ДокументОснование для "ПоступлениеТМЗ", в расширении создал свой реквизит ДокументОснованиеЗаявка, на форме заполняется, работать с ним можно. Осталось при нажатии кнопки "Иерархический просмотр структуры подчиненности" отобразить документ из расширения.
Прикрепленные файлы:
Оставьте свое сообщение