К основному контенту

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

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

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

Про 4 - профиксил. Добавлен массив-"сборщик" элементов которые следует "подчинять" вновь созданному. (см. параметр МассивПодчиненных)

Моё решение


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Комментарии

Популярные сообщения из этого блога

СписокВыбора. Показать Представление вместо Значения

Вводная Если на форме есть элемент управления со списком выбора, в моем конкретном примере это Колонка Значение (Число (3,0)) с настроенным списком выбора. По умолчанию платформа отображает именно строковое значения, а не текст представления  из списка выбора (когда как при выборе значения из списка показываются именно представления). Решение Для Управляемых форм необходимо настроить правила условного оформления, для обычных форм - оформление ячеек при выводе данных.

Табличный Документ. Разная ширина колонки в строках

Когда нужно в макете (табличном документе) изменить ширину колонки  для конкретных строк: 1. Выделить всю строку (строки). Именно всю, фокус для выделенной области не работает. 2. Нажимаем и не отпускает Ctrl 3. С помощью мыши изменяют ширину любой из колонок - будет задан вопрос об создании нового формата строк - соглашаемся. Как же прекрасен мир, где для модификаций не достаточно просто использовать контекстное меню и диалог редактора свойств, где нужно знать заветные слова и таинства танца. 90ые, моё почтение. UPD Программно, тоже самое, можно сделать через ТабДок = Новый ТабличныйДокумент(); ТабДок.Область(1,,1,).СоздатьФорматСтрок(); ТабДок.Область(1,1).ШиринаКолонок = 70; ТабДок.Область(1,2).ШиринаКолонок = 30; ТабДок.Область(2,,2,).СоздатьФорматСтрок(); ТабДок.Область(2,1).ШиринаКолонок = 30; ТабДок.Область(2,2).ШиринаКолонок = 70; ТабДок.Показать();

Расширение конфигурации + Связанные документы (Режим совместимости 8.3.12)

Вводная: реализовать ввод Заказа поставщику на основании Заказа на Ремонт. решить через расширения конфигурации. Хочу обратить ваше внимание, не нужно добавлять в расширение критерий отбора, для 8.3.12 нам не доступно добавление\изменение состава критерия. Более того может зависать конфигуратор (столкнулся с последней версией 8.3.14 + ERP) Разработку рекомендую вести с применением хранилища и для расширения. Иначе устанете потом выгребать чего лишнего включили в расширение при добавлении таких или схожих обектов с составными типами и подобное. Все текущие типовые решения сейчас идут в режиме совместимости 8.3.12, в прочем и для 8.3.14 (и даже 8.3.15 ничего не поменялось). Что нам нужно было бы сделать при отказе от поддержки: 1) добавить наш документ в Критерий отбора (состав, реквизиты); 2) в раздел Ввод на основании целевого документа. И что с целью сохранения поддержки. Как сделать это же для расширения: 1) Добавить реквизит расширения Документы.ЗаказПоставщику._За