Пример владельца в метаданных справочника "районы" |
Реализация: для элемента "Район" добавлен связанный Регион-владелец |
Задача
- На форму программно добавляется реквизит и связанное с ним ПолеВвода
- Тип значения добавляемого может быть подчиненный справочник
- Для удобства ввода для таких реквизитов необходимо добавить на форму связанное ПолеВвода "Владелец".
- У "Владельца" в свою очередь может быть так же владелец, и тд.
Пара замечаний (оговорок)
- Заголовок для ПоляВвода "Владелец" берётся из его метаданных для первого заполненного из: РасширенноеПредставлениеОбъекта, ПредставлениеОбъекта, Имя.
- Если у справочника (тип значения целевого элемента) несколько типов владельцев - будет использоваться первый.
- Владелец размещается перед целевым элементов в том же (его же) элементе размещения (форма или группа).
// Будет добавлено на форму ,
// связанное с переданным , ПолеВвода Владелец (первый владелец из возможных).
// Будет размещён в
// - будут найдены Владелец Владельца и тд.
Процедура ДобавитьСвязанныйЭлементВладельцаНаФорму(Форма, Элемент, НайтиВсехВладельцев = Истина, МассивПодчиненных = Неопределено) Экспорт
ЗначениеРеквизита = Неопределено;
Выполнить("ЗначениеРеквизита = Форма." + Элемент.ПутьКДанным);
Если Справочники.ТипВсеСсылки().СодержитТип(ТипЗнч(ЗначениеРеквизита)) Тогда
// Размещение элемента
Родитель = Элемент.Родитель;
Для Каждого Владелец Из ЗначениеРеквизита.Метаданные().Владельцы Цикл
ЗаголовокВладельца = Владелец.РасширенноеПредставлениеОбъекта;
ЗаголовокВладельца = ?(ПустаяСтрока(ЗаголовокВладельца), Владелец.ПредставлениеОбъекта, ЗаголовокВладельца);
ЗаголовокВладельца = ?(ПустаяСтрока(ЗаголовокВладельца), Владелец.Имя, ЗаголовокВладельца);
ПреффиксТипаСсылки = ?(Метаданные.Справочники.Содержит(Владелец), "СправочникСсылка.", "ПланВидовХарактеристикСсылка.");
ОписаниеТипаВладельца = Новый ОписаниеТипов(ПреффиксТипаСсылки + Владелец.Имя);
ИмяРеквизитаВладельца = Элемент.Имя + "__Владелец";
// добавим реквизит формы и связанный с ним элемент
РеквизитВладельца = ДобавитьВРеквизитыФормы(Форма,ИмяРеквизитаВладельца,ОписаниеТипаВладельца,,ЗаголовокВладельца,Истина);
ЭлементВладельца = ДобавитьЭлементНаФорму (Форма,ИмяРеквизитаВладельца,Тип("ПолеФормы"),Родитель, ИмяРеквизитаВладельца);
// значение нового реквизита
Форма[РеквизитВладельца.Имя] = ЗначениеРеквизита.Владелец;
// переместим "вперёд" элемент владельца
Форма.Элементы.Переместить(ЭлементВладельца, Родитель, Элемент);
// установим связь с
ЗадатьСвязьЭлементаФормы(Элемент, "Отбор.Владелец", РеквизитВладельца.Имя);
Если ТипЗнч(МассивПодчиненных) <> Тип("Массив") Тогда МассивПодчиненных = Новый Массив КонецЕсли;
Для Каждого ЗаписьМассива Из МассивПодчиненных Цикл
ЗадатьСвязьЭлементаФормы(Форма.Элементы[ЗаписьМассива], РеквизитВладельца.Имя, РеквизитВладельца.Имя);
КонецЦикла;
МассивПодчиненных.Добавить(Элемент.Имя);
Если НайтиВсехВладельцев = Истина Тогда
ДобавитьСвязанныйЭлементВладельцаНаФорму(Форма, ЭлементВладельца, НайтиВсехВладельцев, МассивПодчиненных);
КонецЕсли;
Прервать;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
///////////////////////////////////////////////////////////
// Дополнительные методы использованные выше
Функция ДобавитьВРеквизитыФормы(Форма, Имя, Тип, Путь = Неопределено, Заголовок = Неопределено, СохраняемыеДанные = Неопределено) Экспорт
Реквизит = Новый РеквизитФормы(Имя,Тип,Путь,Заголовок,СохраняемыеДанные);
МассивРеквизитов = Новый Массив;
МассивРеквизитов.Добавить(Реквизит);
Форма.ИзменитьРеквизиты(МассивРеквизитов);
Возврат Реквизит;
КонецФункции
Функция ДобавитьЭлементНаФорму(Форма, Имя, ТипЭлемента, Родитель = Неопределено, ПутьКДанным = Неопределено) Экспорт
Элемент = Форма.Элементы.Добавить(Имя, ТипЭлемента, Родитель);
Элемент.Вид = ВидПоляФормы.ПолеВвода;
Элемент.ПутьКДанным = ПутьКДанным;
Возврат Элемент;
КонецФункции
Процедура ЗадатьСвязьЭлементаФормы(Элемент, Имя, ПутьКДанным, ИзменениеЗначения = Неопределено, ЗамещатьРанееУстановленные = Истина) Экспорт
МассивСвязи = Новый Массив;
Если ТипЗнч(ИзменениеЗначения) <> Тип("РежимИзмененияСвязанногоЗначения") Тогда
ИзменениеЗначения = РежимИзмененияСвязанногоЗначения.Очищать;
КонецЕсли;
Если ЗамещатьРанееУстановленные <> Истина Тогда
СкопироватьМассив(Элемент.СвязиПараметровВыбора, МассивСвязи);
КонецЕсли;
МассивСвязи.Добавить(Новый СвязьПараметраВыбора(Имя, ПутьКДанным, ИзменениеЗначения));
Элемент.СвязиПараметровВыбора = Новый ФиксированныйМассив(МассивСвязи);
КонецПроцедуры
Процедура СкопироватьМассив(Источник, Приемник) Экспорт
Для Каждого ЗаписьМассива Из Источник Цикл Приемник.Добавить(ЗаписьМассива) КонецЦикла;
КонецПроцедуры