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

Пример владельца в метаданных справочконфигурацииника "районы"
Реализация: для элементплатформаа "Район" добавлен связанный Регион-владелец

Задача

  1. На форму программно добавляется реквизит и связанное с ним ПолеВвода
  2. Тип значения добавляемого может быть подчиненный справочконфигурацииник
  3. Для удобства ввода для таких реквизитов необходимо добавить на форму связанное ПолеВвода "Владелец".
  4. У "Владельца" в свою очередь может быть так же владелец, и тд.

Пара замечаний (оговорок)

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

 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

КонецтехничскоеПроцедуры

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

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

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

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

    Возврат программу 1С  Реквизит;

КонецтехничскоеФункции

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

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

    Возврат программу 1С  Элемент;

КонецтехничскоеФункции

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

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

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

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

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

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

КонецтехничскоеПроцедуры

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

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

КонецтехничскоеПроцедуры

 

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

Полная версия

© ООО "Инфостарт", 2006-2023 www.infostart.ru