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