Пример владельца в метаданных справочника «районы» |
Реализация: для элемента «Район» добавлен связанный Регион-владелец |
Задача
- На форму программно добавляется реквизит и связанное с ним ПолеВвода
- Тип значения добавляемого может быть подчиненный справочник
- Для удобства ввода для таких реквизитов необходимо добавить на форму связанное ПолеВвода «Владелец».
- У «Владельца» в свою очередь может быть так же владелец, и тд.
- Заголовок для ПоляВвода «Владелец» берётся из его метаданных для первого заполненного из: РасширенноеПредставлениеОбъекта, ПредставлениеОбъекта, Имя.
- Если у справочника (тип значения целевого элемента) несколько типов владельцев — будет использоваться первый.
- Владелец размещается перед целевым элементов в том же (его же) элементе размещения (форма или группа).
// Будет добавлено на форму ,
// связанное с переданным , ПолеВвода Владелец (первый владелец из возможных).
// Будет размещён в
// — будут найдены Владелец Владельца и тд.
Процедура ДобавитьСвязанныйЭлементВладельцаНаФорму(Форма, Элемент, НайтиВсехВладельцев = Истина, МассивПодчиненных = Неопределено) Экспорт
ЗначениеРеквизита = Неопределено;
Выполнить(«ЗначениеРеквизита = Форма.» + Элемент.ПутьКДанным);
Если Справочники.ТипВсеСсылки().СодержитТип(ТипЗнч(ЗначениеРеквизита)) Тогда
// Размещение элемента
Родитель = Элемент.Родитель;
Для Каждого Владелец Из ЗначениеРеквизита.Метаданные().Владельцы Цикл
ЗаголовокВладельца = Владелец.РасширенноеПредставлениеОбъекта;
ЗаголовокВладельца = ?(ПустаяСтрока(ЗаголовокВладельца), Владелец.ПредставлениеОбъекта, ЗаголовокВладельца);
ЗаголовокВладельца = ?(ПустаяСтрока(ЗаголовокВладельца), Владелец.Имя, ЗаголовокВладельца);
ПреффиксТипаСсылки = ?(Метаданные.Справочники.Содержит(Владелец), «СправочникСсылка.», «ПланВидовХарактеристикСсылка.»);
ОписаниеТипаВладельца = Новый ОписаниеТипов(ПреффиксТипаСсылки + Владелец.Имя);
ИмяРеквизитаВладельца = Элемент.Имя + «__Владелец»;
// добавим реквизит формы и связанный с ним элемент
РеквизитВладельца = ДобавитьВРеквизитыФормы(Форма,ИмяРеквизитаВладельца,ОписаниеТипаВладельца,,ЗаголовокВладельца,Истина);
ЭлементВладельца = ДобавитьЭлементНаФорму (Форма,ИмяРеквизитаВладельца,Тип(«ПолеФормы»),Родитель, ИмяРеквизитаВладельца);
// значение нового реквизита
Форма[РеквизитВладельца.Имя] = ЗначениеРеквизита.Владелец;
// переместим «вперёд» элемент владельца
Форма.Элементы.Переместить(ЭлементВладельца, Родитель, Элемент);
// установим связь с
ЗадатьСвязьЭлементаФормы(Элемент, «Отбор.Владелец», РеквизитВладельца.Имя);
Если ТипЗнч(МассивПодчиненных) <> Тип(«Массив») Тогда МассивПодчиненных = Новый Массив КонецЕсли;
Для Каждого ЗаписьМассива Из МассивПодчиненных Цикл
ЗадатьСвязьЭлементаФормы(Форма.Элементы[ЗаписьМассива], РеквизитВладельца.Имя, РеквизитВладельца.Имя);
КонецЦикла;
МассивПодчиненных.Добавить(Элемент.Имя);
Если НайтиВсехВладельцев = Истина Тогда
ДобавитьСвязанныйЭлементВладельцаНаФорму(Форма, ЭлементВладельца, НайтиВсехВладельцев, МассивПодчиненных);
КонецЕсли;
Прервать;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
///////////////////////////////////////////////////////////
// Дополнительные методы использованные выше
Функция ДобавитьВРеквизитыФормы(Форма, Имя, Тип, Путь = Неопределено, Заголовок = Неопределено, СохраняемыеДанные = Неопределено) Экспорт
Реквизит = Новый РеквизитФормы(Имя,Тип,Путь,Заголовок,СохраняемыеДанные);
МассивРеквизитов = Новый Массив;
МассивРеквизитов.Добавить(Реквизит);
Форма.ИзменитьРеквизиты(МассивРеквизитов);
Возврат Реквизит;
КонецФункции
Функция ДобавитьЭлементНаФорму(Форма, Имя, ТипЭлемента, Родитель = Неопределено, ПутьКДанным = Неопределено) Экспорт
Элемент = Форма.Элементы.Добавить(Имя, ТипЭлемента, Родитель);
Элемент.Вид = ВидПоляФормы.ПолеВвода;
Элемент.ПутьКДанным = ПутьКДанным;
Возврат Элемент;
КонецФункции
Процедура ЗадатьСвязьЭлементаФормы(Элемент, Имя, ПутьКДанным, ИзменениеЗначения = Неопределено, ЗамещатьРанееУстановленные = Истина) Экспорт
МассивСвязи = Новый Массив;
Если ТипЗнч(ИзменениеЗначения) <> Тип(«РежимИзмененияСвязанногоЗначения») Тогда
ИзменениеЗначения = РежимИзмененияСвязанногоЗначения.Очищать;
КонецЕсли;
Если ЗамещатьРанееУстановленные <> Истина Тогда
СкопироватьМассив(Элемент.СвязиПараметровВыбора, МассивСвязи);
КонецЕсли;
МассивСвязи.Добавить(Новый СвязьПараметраВыбора(Имя, ПутьКДанным, ИзменениеЗначения));
Элемент.СвязиПараметровВыбора = Новый ФиксированныйМассив(МассивСвязи);
КонецПроцедуры
Процедура СкопироватьМассив(Источник, Приемник) Экспорт
Для Каждого ЗаписьМассива Из Источник Цикл Приемник.Добавить(ЗаписьМассива) КонецЦикла;
КонецПроцедуры
http://unnoesso.blogspot.co.at/2012/07/blog-post.html
Была ошибка, при добавлении Владельца-Владельца не назначалась связь с исходным Элементом формы.
Добавлен в основную процедуру «сборщик» массив — МассивПодчиненных
(0) (1) Ну ты молодец. Убери из текста свои модули ПользовательскиеИнтерфейсыСервер. Волшебник., раз уж выложил процедуры оттуда.
http://infostart.ru/public/19856/
Про форматирование текста умолчу. Воспользуйся раскраской кода
Я ничего не понял
Немного подправил метод:
1. Получение значения реквизита формы
2. Присвоение имени создаваемого элемента
в статье актуальный вариант.