gifts2017

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

Опубликовал Евгений Шабалин (xzorkiix) в раздел Программирование - Практика программирования

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Евгений Шабалин (xzorkiix) 01.08.12 12:00
Была ошибка, при добавлении Владельца-Владельца не назначалась связь с исходным Элементом формы.

Добавлен в основную процедуру "сборщик" массив - МассивПодчиненных
2. Сергей Ожерельев (Поручик) 01.08.12 14:20
(0) (1) Ну ты молодец. Убери из текста свои модули ПользовательскиеИнтерфейсыСервер. Волшебник., раз уж выложил процедуры оттуда.
Про форматирование текста умолчу. Воспользуйся раскраской кода http://infostart.ru/public/19856/
3. Armando Armando (Armando) 01.08.12 20:17
4. Евгений Шабалин (xzorkiix) 07.08.12 15:21
Немного подправил метод:
1. Получение значения реквизита формы
2. Присвоение имени создаваемого элемента

в статье актуальный вариант.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа