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