Управляемая форма. Добавляем связанный элемент-"владелец" на форму.

Программно размещаем на форме для Поля <СправочникСсылка> его "Владельца". Замечания, предложения — смело в комментарии.
Пример владельца в метаданных справочника «районы»
Реализация: для элемента «Район» добавлен связанный Регион-владелец

Задача

  1. На форму программно добавляется реквизит и связанное с ним ПолеВвода
  2. Тип значения добавляемого может быть подчиненный справочник
  3. Для удобства ввода для таких реквизитов необходимо добавить на форму связанное ПолеВвода «Владелец».
  4. У «Владельца» в свою очередь может быть так же владелец, и тд.
Пара замечаний (оговорок)
  1. Заголовок для ПоляВвода «Владелец» берётся из его метаданных для первого заполненного из: РасширенноеПредставлениеОбъекта, ПредставлениеОбъекта, Имя.
  2. Если у справочника (тип значения целевого элемента) несколько типов владельцев — будет использоваться первый.
  3. Владелец размещается перед целевым элементов в том же (его же) элементе размещения (форма или группа).
 
 

// Будет добавлено на форму ,
// связанное с переданным , ПолеВвода Владелец (первый владелец из возможных).
// Будет размещён в
// — будут найдены Владелец Владельца и тд.
Процедура ДобавитьСвязанныйЭлементВладельцаНаФорму(Форма, Элемент, НайтиВсехВладельцев = Истина, МассивПодчиненных = Неопределено) Экспорт

    ЗначениеРеквизита = Неопределено;

    ВыполнитьЗначениеРеквизита Форма.» + Элемент.ПутьКДанным);

    Если Справочники.ТипВсеСсылки().СодержитТип(ТипЗнч(ЗначениеРеквизита)) Тогда

        // Размещение элемента
       
Родитель = Элемент.Родитель;

        Для Каждого Владелец Из ЗначениеРеквизита.Метаданные().Владельцы Цикл

            ЗаголовокВладельца = Владелец.РасширенноеПредставлениеОбъекта;
           
ЗаголовокВладельца = ?(ПустаяСтрока(ЗаголовокВладельца), Владелец.ПредставлениеОбъекта, ЗаголовокВладельца);
           
ЗаголовокВладельца = ?(ПустаяСтрока(ЗаголовокВладельца), Владелец.Имя,     ЗаголовокВладельца);

            ПреффиксТипаСсылки = ?(Метаданные.Справочники.Содержит(Владелец), «СправочникСсылка.», «ПланВидовХарактеристикСсылка.»);
           
ОписаниеТипаВладельца = Новый ОписаниеТипов(ПреффиксТипаСсылки + Владелец.Имя);

            ИмяРеквизитаВладельца = Элемент.Имя + «__Владелец»;

            // добавим реквизит формы и связанный с ним элемент
           
РеквизитВладельца = ДобавитьВРеквизитыФормы(Форма,ИмяРеквизитаВладельца,ОписаниеТипаВладельца,,ЗаголовокВладельца,Истина);
           
ЭлементВладельца  = ДобавитьЭлементНаФорму (Форма,ИмяРеквизитаВладельца,Тип(«ПолеФормы»),Родитель, ИмяРеквизитаВладельца);

            // значение нового реквизита
           
Форма[РеквизитВладельца.Имя] = ЗначениеРеквизита.Владелец;

            // переместим «вперёд» элемент владельца
           
Форма.Элементы.Переместить(ЭлементВладельца, Родитель, Элемент);

            // установим связь с
           
ЗадатьСвязьЭлементаФормы(Элемент, «Отбор.Владелец», РеквизитВладельца.Имя);

            Если ТипЗнч(МассивПодчиненных) <> Тип(«Массив») Тогда МассивПодчиненных = Новый Массив КонецЕсли;

            Для Каждого ЗаписьМассива Из МассивПодчиненных Цикл
               
ЗадатьСвязьЭлементаФормы(Форма.Элементы[ЗаписьМассива], РеквизитВладельца.Имя, РеквизитВладельца.Имя);
            КонецЦикла;

            МассивПодчиненных.Добавить(Элемент.Имя);

            Если НайтиВсехВладельцев = Истина Тогда
               
ДобавитьСвязанныйЭлементВладельцаНаФорму(Форма, ЭлементВладельца, НайтиВсехВладельцев, МассивПодчиненных);
            КонецЕсли;

            Прервать;
        КонецЦикла;
    КонецЕсли;

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

///////////////////////////////////////////////////////////
// Дополнительные методы использованные выше

Функция ДобавитьВРеквизитыФормы(Форма, Имя, Тип, Путь = Неопределено, Заголовок = Неопределено, СохраняемыеДанные = Неопределено) Экспорт

    Реквизит  = Новый РеквизитФормы(Имя,Тип,Путь,Заголовок,СохраняемыеДанные);

    МассивРеквизитов = Новый Массив;
   
МассивРеквизитов.Добавить(Реквизит);
   
Форма.ИзменитьРеквизиты(МассивРеквизитов);

    Возврат Реквизит;

КонецФункции

Функция ДобавитьЭлементНаФорму(Форма, Имя, ТипЭлемента, Родитель = Неопределено, ПутьКДанным = Неопределено) Экспорт

    Элемент = Форма.Элементы.Добавить(Имя, ТипЭлемента, Родитель);
   
Элемент.Вид = ВидПоляФормы.ПолеВвода;
   
Элемент.ПутьКДанным = ПутьКДанным;

    Возврат Элемент;

КонецФункции

Процедура ЗадатьСвязьЭлементаФормы(Элемент, Имя, ПутьКДанным, ИзменениеЗначения = Неопределено, ЗамещатьРанееУстановленные = Истина) Экспорт

    МассивСвязи = Новый Массив;

    Если ТипЗнч(ИзменениеЗначения) <> Тип(«РежимИзмененияСвязанногоЗначения») Тогда
       
ИзменениеЗначения = РежимИзмененияСвязанногоЗначения.Очищать;
    КонецЕсли;

    Если ЗамещатьРанееУстановленные <> Истина Тогда
       
СкопироватьМассив(Элемент.СвязиПараметровВыбора, МассивСвязи);
    КонецЕсли;

    МассивСвязи.Добавить(Новый СвязьПараметраВыбора(Имя, ПутьКДанным, ИзменениеЗначения));

    Элемент.СвязиПараметровВыбора = Новый ФиксированныйМассив(МассивСвязи);

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

Процедура СкопироватьМассив(Источник, Приемник) Экспорт

 Для Каждого ЗаписьМассива Из Источник Цикл Приемник.Добавить(ЗаписьМассива) КонецЦикла;

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

http://unnoesso.blogspot.co.at/2012/07/blog-post.html

4 Comments

  1. xzorkiix

    Была ошибка, при добавлении Владельца-Владельца не назначалась связь с исходным Элементом формы.

    Добавлен в основную процедуру «сборщик» массив — МассивПодчиненных

    Reply
  2. Поручик

    (0) (1) Ну ты молодец. Убери из текста свои модули ПользовательскиеИнтерфейсыСервер. Волшебник., раз уж выложил процедуры оттуда.

    Про форматирование текста умолчу. Воспользуйся раскраской кода http://infostart.ru/public/19856/

    Reply
  3. Armando

    Я ничего не понял

    Reply
  4. xzorkiix

    Немного подправил метод:

    1. Получение значения реквизита формы

    2. Присвоение имени создаваемого элемента

    в статье актуальный вариант.

    Reply

Leave a Comment

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