diamond АШ Tlg

Программное создание и удаление реквизитов управляемой формы 1С 8.3

Программное создание и удаление реквизитов управляемой формы 1С. Шпаргалка, раскрыты все темы. Применимо при разработке в расширениях конфигурации 1С.

Все исчерпывающие тему примеры программного создания, удаления и использования реквизитов управляемой формы в расширении конфигурации 1С с префиксом расш_.

Программное добавление реквизитов базовых типов

&НаСервере
Процедура расш_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
            
    расш_ПрограммноеСозданиеРеквизитовФормы();
        
КонецПроцедуры
    
&НаСервере
Процедура расш_ПрограммноеСозданиеРеквизитовФормы()

    ДобавляемыеРеквизиты = Новый Массив;
    
    // тип Число
    НовРеквизит = Новый РеквизитФормы(
        "расш_СуммаИтого",
        Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(12, 2, ДопустимыйЗнак.Любой)),,
        "Сумма Итого"
    ); 
    ДобавляемыеРеквизиты.Добавить(НовРеквизит);

    // тип Число, как сохранямый реквизит формы
    // (когда у формы включено автоматическое сохранение данных в настройках)
    НовРеквизит = Новый РеквизитФормы(
        "расш_СуммаСохраняемая",
        Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(12, 2, ДопустимыйЗнак.Любой)),,
        "Сумма сохраняемая",
        Истина   // признак сохраняемого реквизита
    ); 
    ДобавляемыеРеквизиты.Добавить(НовРеквизит);

    // тип Дата
    НовРеквизит = Новый РеквизитФормы(
        "расш_ДатаВыплаты",
        Новый ОписаниеТипов("Дата",,,Новый КвалификаторыДаты(ЧастиДаты.Дата)),,
        "Дата выплаты"
    );
    ДобавляемыеРеквизиты.Добавить(НовРеквизит);

    // тип Строка неограниченной длины
    НовРеквизит = Новый РеквизитФормы(
        "расш_Адрес",
        Новый ОписаниеТипов("Строка"),,
        "Дата выплаты", Истина
    );
    ДобавляемыеРеквизиты.Добавить(НовРеквизит);

    // тип Строка с переменной длиной до 100 символов
    НовРеквизит = Новый РеквизитФормы(
        "расш_Адрес",
        Новый ОписаниеТипов("Строка",, Новый КвалификаторыСтроки(100)),,
        "Дата выплаты", Истина
    );
    ДобавляемыеРеквизиты.Добавить(НовРеквизит);

    // тип Строка с фиксированной длиной 5 символов
    НовРеквизит = Новый РеквизитФормы(
        "расш_Адрес",
        Новый ОписаниеТипов("Строка",, Новый КвалификаторыСтроки(5, ДопустимаяДлина.Фиксированная)),,
        "Дата выплаты", Истина
    );
    ДобавляемыеРеквизиты.Добавить(НовРеквизит);

    // тип Булево
    НовРеквизит = Новый РеквизитФормы(
        "расш_Замужем",
        Новый ОписаниеТипов("Булево"),,
        "Замужем", Истина
    );
    ДобавляемыеРеквизиты.Добавить(НовРеквизит);

КонецПроцедуры
 &НаСервере
Процедура расш_ПрограммноеСозданиеРеквизитовФормы()
    
    ДобавляемыеРеквизиты = Новый Массив;

    НовРеквизит = Новый РеквизитФормы(
        "расш_Валюта",
        Новый ОписаниеТипов("СправочникСсылка.Валюты"),,
        "Валюта"
    ); 
    ДобавляемыеРеквизиты.Добавить(НовРеквизит);

    ЭтаФорма.ИзменитьРеквизиты(ДобавляемыеРеквизиты);
    
КонецПроцедуры

Программное добавление реквизита составного типа

 &НаСервере
Процедура расш_ПрограммноеСозданиеРеквизитовФормы()
        
    ДобавляемыеРеквизиты = Новый Массив;
    
    СписокТипов = Новый Массив;
    СписокТипов.Добавить(Тип("Строка"));
    СписокТипов.Добавить(Тип("Число"));
    СписокТипов.Добавить(Тип("СправочникСсылка.Контрагенты"));

    НовРеквизит = Новый РеквизитФормы(
        "расш_СоставнойРеквизит",
        Новый ОписаниеТипов(СписокТипов),,
        "Всякая всячина"
    ); 
    ДобавляемыеРеквизиты.Добавить(НовРеквизит);
    
    ЭтаФорма.ИзменитьРеквизиты(ДобавляемыеРеквизиты);
        
КонецПроцедуры

Программное добавление реквизита типа ТаблицаЗначений

 &НаСервере
Процедура расш_ПрограммноеСозданиеРеквизитовФормы()
        
    ДобавляемыеРеквизиты = Новый Массив;
    
    // Таблица значений:
    НовРеквизит = Новый РеквизитФормы(
        "расш_ТаблицаШтрафов",
        Новый ОписаниеТипов("ТаблицаЗначений"),,
        "Таблица штрафов"
    ); 
    ДобавляемыеРеквизиты.Добавить(НовРеквизит);

    // Колонки таблицы значений:

    НовРеквизит = Новый РеквизитФормы(
        "Сотрудник",
        Новый ОписаниеТипов("СправочникСсылка.Сотрудники"),
        "расш_ТаблицаШтрафов",
        "Сотрудник"
    ); 
    ДобавляемыеРеквизиты.Добавить(НовРеквизит);

    НовРеквизит = Новый РеквизитФормы(
        "СуммаШтрафа",
        Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(12, 2, ДопустимыйЗнак.Любой)),
        "расш_ТаблицаШтрафов",
        "Сумма Штраф"
    ); 
    ДобавляемыеРеквизиты.Добавить(НовРеквизит);
   
    ЭтаФорма.ИзменитьРеквизиты(ДобавляемыеРеквизиты);
        
КонецПроцедуры

Программное удаление реквизитов формы

Область применения: опасные цирковые трюки. Удалять можно только программно созданные реквизиты!

&НаСервере
Процедура расш_ПрограммноеУдалениеРеквизитовФормы()

    УдаляемыеРеквизиты = Новый Массив;
    УдаляемыеРеквизиты.Добавить("расш_Валюта");
    УдаляемыеРеквизиты.Добавить("расш_Итого");
	
    // Удаление реквизитов формы
    ИзменитьРеквизиты( , УдаляемыеРеквизиты);

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

Так как добавление и удаление реквизитов - это ресурсоёмкие операции, то рекомендуется делать удаление и добавление в один заход (при этом метод ИзменитьРеквизиты() сперва выполняет удаление):

&НаСервере
Процедура расш_ПрограммноеУдалениеИСозданиеРеквизитовФормы()

    ДобавляемыеРевизиты = Новый Массив;
    УдаляемыеРеквизиты = Новый Массив;
    // ... 
    
    ИмяУдаляемогоРеквизита = "расш_ФизическоеЛицо";
    МассивРеквизитов = ЭтаФорма.ПолучитьРеквизиты();
	Для Каждого Рекв Из МассивРеквизитов Цикл
        Если Рекв.Имя = ИмяУдаляемогоРеквизита Тогда
            // требуется проверка на существование, т.к. при отсутствии реквизита удаление выдаст ошибку
            УдаляемыеРеквизиты.Добавить(ИмяУдаляемогоРеквизита);
            Прервать;
        КонецЕсли;
    КонецЦикла;
        
    // Удаление и добавление реквизитов формы
    ИзменитьРеквизиты(ДобавляемыеРевизиты, УдаляемыеРеквизиты);
    
КонецПроцедуры

Обращение к программно созданным реквизитам формы

При разработке в расширении конфигурации в модуле формы обращаться к созданным программно реквизитам нужно как к элементу массива ЭтаФорма:

&НаСервере
Процедура расш_ДелайРазНаСервере()

    ЭтаФорма["расш_Итого"] = ЭтаФорма["расш_Сумма"] + Надбавки;
    
    //расш_Итого = расш_Сумма + Надбавки; // выдаст ошибку!!!
 
КонецПроцедуры

&НаКлиенте
Процедура расш_ДелайДваНаКлиенте()

    ЭтаФорма["расш_Итого"] = ЭтаФорма["расш_Сумма"] - 100;
    
КонецПроцедуры

Чтоб ваш код легко читался лучше сперва прочитать реквизиты в переменные, но при этом всегда внимательно следите, чтобы у формы основной конфигурации не было одноименнных реквизитов как ваши переменные, а также одноименных переменных в блоке объявления глобальных переменных начале модуля формы!

&НаКлиенте
Процедура расш_ДелайТри()

    Сумма1 = ЭтаФорма["расш_Сумма1"];   
    Сумма2 = ЭтаФорма["расш_Сумма2"];
    
    ЕстьПревышение = Ложь;

    Если Сумма1 > Сумма2 Тогда
        ЕстьПревышение = Истина;
    КонецЕсли;
    
    ЭтаФорма["расш_ЕстьПревышение"] = ЕстьПревышение;
    
КонецПроцедуры

Связанные публикации

Программное создание команд в управляемой форме 1С

Программное создание элементов управляемой формы 1С