Добавить программно реквизит на управляемую форму таблицу

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

Содержание

В качестве примера будем использовать пустую обработку, в которой есть реквизит НашНужныйРеквизит. Все манипуляции по добавлению, удалению элементов и реквизитов формы производятся на сервере, и можно использовать как предопределенные обработчики, например &ПриСозданииНаСервере, так и любые другие методы с директивой &НаСервере. В нашем примере будем все элементы добавлять при помощи отдельных команд, для большей наглядности.

Как в 1С программно добавить элемент формы?

Вывести существующий реквизит

&НаСервере
Процедура ДобавитьПолеВводаНаСервере()	
	// Проверка нужна, чтобы избежать ошибки при попытке создания элемента с одним и тем же именем несколько раз
	Если Элементы.Найти("НашНужныйЭлемент") = Неопределено Тогда
		// Вначале просто добавляем элемент в коллекцию Элементы
		НовыйЭлемент = Элементы.Добавить("НашНужныйЭлемент", Тип("ПолеФормы"));		
		//Затем донастраиваем его и указываем нужные свойства
		НовыйЭлемент.ПутьКДанным = "Объект.НашНужныйРеквизит";
		НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
		НовыйЭлемент.Заголовок = "Программно добавленное поле ввода";
	КонецЕсли;	
КонецПроцедуры

&НаКлиенте
Процедура ДобавитьПолеВвода(Команда)
	ДобавитьПолеВводаНаСервере();
КонецПроцедуры

Создать новый реквизит формы

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

&НаКлиенте
Процедура ДобавитьРеквизитФлажок(Команда)
	ДобавитьРеквизитФлажокНаСервере();
КонецПроцедуры

Вставить элемент формы в нужное место

&НаСервере
Процедура ВставитьКартинкуПередФлажкомНаСервере()
	Если Элементы.Найти("ВставленнаяКартинка") = Неопределено Тогда
		СледующийЭлемент = Элементы.Найти("НужныйФлажок");
		// Если флажок найден - вставим элемент перед ним, если нет - добавим в конец
		// Заодно рассмотрим как добавить программно декорацию-картинку на форму
		ЭлементКартинка = Элементы.Вставить("ВставленнаяКартинка", Тип("ДекорацияФормы"),,СледующийЭлемент);
		ЭлементКартинка.Вид = ВидДекорацииФормы.Картинка;
		// Обратите внимание, картинка в этом случае может быть либо Пустая, либо ИзБиблиотеки
		ЭлементКартинка.Картинка = БиблиотекаКартинок.Реквизит;
	КонецЕсли;	
КонецПроцедуры

&НаКлиенте
Процедура ВставитьКартинкуПередФлажком(Команда)
	ВставитьКартинкуПередФлажкомНаСервере();
КонецПроцедуры

Как программно добавить команду в управляемую форму?

&НаСервере
Процедура ДобавитьПрограммноКомандуНаСервере()
	Если Элементы.Найти("КнопкаПредупредить") = Неопределено Тогда
		//Добавим команду в коллекцию команд
		КомандаПредупредить = Команды.Добавить("Предупредить");
		КомандаПредупредить.Заголовок = "Предупредить!";
		КомандаПредупредить.Действие = "КомандаПредупредить";
		
		КнопкаКоманды = Элементы.Добавить("КнопкаПредупредить", Тип("КнопкаФормы"));
		КнопкаКоманды.ИмяКоманды = "Предупредить";
		// Если помещаем просто на форму, то вид - обычная кнопка
		// Если укажем контейнер с типом Командная панель, то вид - КнопкаКоманднойПанели
		КнопкаКоманды.Вид = ВидКнопкиФормы.ОбычнаяКнопка;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ДобавитьПрограммноКоманду(Команда)
	ДобавитьПрограммноКомандуНаСервере();
КонецПроцедуры

&НаКлиенте
Процедура КомандаПредупредить(Команда)
	ПоказатьПредупреждение(, "А ведь я предупреждал!");
КонецПроцедуры

Как добавить таблицу на форму программно?

На программном добавлении таблицы на форму стоит остановиться отдельно. Порядок действий следующий:
Сперва создаем основной реквизит – саму таблицу формы. Далее – создаем подчиненные реквизиты-колонки. В простейшем случае колонки можно создать, перебрав колонки таблицы значений – источника. Далее следует создать связанные с только что созданными реквизитами элементы формы – также сперва основной элемент – таблицу, а затем подчиненные элементы – колонки.

&НаСервере
Процедура СоздатьТаблицуЗначенийНаСервере()
	
	Если Элементы.Найти("ДинамическаяТаблицаЭлемент") <> Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	НовыеРеквизиты = Новый Массив;
	
	ТипРеквизита = Новый ОписаниеТипов("ТаблицаЗначений");
	РеквизитТЗ = Новый РеквизитФормы("ДинамическаяТаблица", ТипРеквизита, "", "Динамическая таблица");
	
	НовыеРеквизиты.Добавить(РеквизитТЗ);
	
	ТЗ = Новый ТаблицаЗначений;
	ТЗ.Колонки.Добавить("Отметка", Новый ОписаниеТипов("Булево"));
	ТЗ.Колонки.Добавить("Дата", Новый ОписаниеТипов("Дата"));
	ТЗ.Колонки.Добавить("Комментарий", Новый ОписаниеТипов("Строка"));
	
	Для Каждого КолонкаТаблицы Из ТЗ.Колонки Цикл
		НовыеРеквизиты.Добавить(Новый РеквизитФормы(КолонкаТаблицы.Имя, КолонкаТаблицы.ТипЗначения, "ДинамическаяТаблица"));
	КонецЦикла;	
	ИзменитьРеквизиты(НовыеРеквизиты);
	
	ЭлементТаблица = Элементы.Добавить("ДинамическаяТаблицаЭлемент", Тип("ТаблицаФормы"));
	ЭлементТаблица.ПутьКДанным = "ДинамическаяТаблица";
	ЭлементТаблица.Отображение = ОтображениеТаблицы.Список;
	
	Для Каждого КолонкаТаблицы Из ТЗ.Колонки Цикл
		ЭлементКолонкаТаблицы = Элементы.Добавить(КолонкаТаблицы.Имя, Тип("ПолеФормы"), ЭлементТаблица);
		Если КолонкаТаблицы.ТипЗначения.СодержитТип(Тип("Булево")) Тогда
			ЭлементКолонкаТаблицы.Вид = ВидПоляФормы.ПолеФлажка;
		Иначе
			ЭлементКолонкаТаблицы.Вид = ВидПоляФормы.ПолеВвода;
		КонецЕсли;
		ЭлементКолонкаТаблицы.ПутьКДанным = "ДинамическаяТаблица." + КолонкаТаблицы.Имя;
	КонецЦикла;	

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

&НаКлиенте
Процедура СоздатьТаблицуЗначений(Команда)
	СоздатьТаблицуЗначенийНаСервере();
КонецПроцедуры

Как программно установить обработчик события элемента формы?

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

&НаКлиенте
Процедура ДобавитьОбработчикДействия(Команда)
	ДобавитьОбработчикДействияНаСервере();
КонецПроцедуры

// Количество и порядок параметров метода-обработчика должны соответствовать событию
// Подробнее см. синтакс-помощник
&НаКлиенте
Процедура ПриИзмененииТаблицы(Элемент)
	Сообщить("Изменили колонку " + Элемент.ТекущийЭлемент.Имя); 	
КонецПроцедуры

При разработке решений возникает необходимость добавить реквизит формы, состав и типы которых зависят от данных. Например при построении динамических деревьев с периодами, или при выводе контактной информации и т.д.

Содержание

  1. Задача
  2. Добавление реквизитов
  3. Удаление реквизитов
  4. Добавление реквизита табличной части
  5. Добавление реквизита с типом Произвольный

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

Задача

Для наглядности разберем простой пример, в котором можно было обойтись только элементами формы, но мы создадим и реквизиты.

Есть некая конфигурация, в форме элемента справочника Номенклатура необходимо программно создавать реквизиты формы и элементы к ним:

  • ЯчейкаХранения, тип СправочникСсылка.ЯчейкиХранения;
  • ТекущийОстаток, тип Число.

Элементы объединить в группу с горизонтальной группировкой. На текущий момент форма имеет следующий вид:

добавить реквизит формы

Добавление реквизитов

В обработчике формы ПриСозданииНаСервере() опишем код, который разбивается на 3 этапа:

  1. Описание и создание реквизитов формы;
  2. Создание элементов формы, объединение в группу без отображения;
  3. Заполнение данных.

Ниже приведен готовый код, код снабжен комментариями и разбит на области для лучшего понимания

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
    #Область ДобавлениеРеквизитовФормы
	
    // Массив для новых реквизитов
    ДобавляемыеРеквизиты	= Новый Массив;
		
    // Опишем ревизиты формы
    Реквизит_ЯчейкаХранения = Новый РеквизитФормы("ЯчейкаХранения",	Новый ОписаниеТипов("СправочникСсылка.ЯчейкиХранения"),	, "Ячейка");
    Реквизит_ТекущийОстаток = Новый РеквизитФормы("ТекущийОстаток",	Новый ОписаниеТипов("Число", , , Новый КвалификаторыЧисла(10, 3)), , "Остаток");
	
    // Для наглядности заполним массив после описания реквизитов формы
    ДобавляемыеРеквизиты.Добавить(Реквизит_ЯчейкаХранения);
    ДобавляемыеРеквизиты.Добавить(Реквизит_ТекущийОстаток);
	
    // Добавим новые реквизиты в форму
    ИзменитьРеквизиты(ДобавляемыеРеквизиты);
	
    #КонецОбласти
	
    #Область ДобавлениеЭлементовФормы
	
    // Горизонтальная группа без отображения на форме
    ГруппаФормы = Элементы.Добавить("Группа_СправочныеДанные", Тип("ГруппаФормы"));
    ГруппаФормы.Вид                        = ВидГруппыФормы.ОбычнаяГруппа;
    ГруппаФормы.Отображение                = ОтображениеОбычнойГруппы.Нет;
    ГруппаФормы.ОтображатьЗаголовок        = Ложь;
    ГруппаФормы.Группировка                = ГруппировкаПодчиненныхЭлементовФормы.Горизонтальная;
	
    // Элементы
	
    НовыйЭлемент = Элементы.Добавить("ЯчейкаХранения", Тип("ПолеФормы"), ГруппаФормы);
    НовыйЭлемент.ПутьКДанным                  = "ЯчейкаХранения";
    НовыйЭлемент.Вид                          = ВидПоляФормы.ПолеВвода;
    НовыйЭлемент.ТолькоПросмотр               = Истина;
	
    НовыйЭлемент = Элементы.Добавить("ТекущийОстаток", Тип("ПолеФормы"), ГруппаФормы);
    НовыйЭлемент.ПутьКДанным                  = "ТекущийОстаток";
    НовыйЭлемент.Вид                          = ВидПоляФормы.ПолеВвода;
    НовыйЭлемент.ТолькоПросмотр               = Истина;
	
    #КонецОбласти
	
    #Область ЗаполнениеДанных
	
    //  Имитируем заполнение данных
    ЭтаФорма.ЯчейкаХранения = ПредопределенноеЗначение("Справочник.ЯчейкиХранения.Распаковка");
    ЭтаФорма.ТекущийОстаток = 12;
	
    #КонецОбласти
	
КонецПроцедуры

После выполнения приведенного кода форма будет выглядеть так:

реквизит программно

Удаление реквизитов

Для удаления необходимо передать массив содержащий пути реквизитов в качестве второго параметра метода формы ИзменитьРеквизиты().

    #Область УдалениеРеквизитовФормы
	
    // Массив удаляемых реквизитов
    УдаляемыеРеквизиты = Новый Массив;
    УдаляемыеРеквизиты.Добавить("ЯчейкаХранения");
    УдаляемыеРеквизиты.Добавить("ТекущийОстаток");
	
    // Удалим реквизиты формы
    ИзменитьРеквизиты( , УдаляемыеРеквизиты);
	
    #КонецОбласти

Внимание!!! Удалять можно только реквизиты созданные программно.

Добавление реквизита табличной части

Добавление реквизита и элемента формы для табличной части почти ничем не отличается, необходимо только указать путь «Объект.<ИмяТабличнойЧасти>». Ниже пример добавления реквизита Ячейка в ТЧ Комплектация.

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

Добавление реквизита с типом Произвольный

В одной из задач стало необходимо добавить реквизит с типом Произвольный, но ни СП, ни интернеты ответа не дали. В итоге через несколько попыток было найдено решение

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

Внимание!!! Данные добавленного реквизита сохраняться в ИБ не будут.

Содержание[Убрать]

    • Как программно добавить Группу на форму?
    • Как программно добавить Поле ввода на форму?
    • Как программно добавить колонку в ТЧ?
    • Как программно вывести табличную часть документа на управляемую форму?
    • Как Добавить программно флажок на форму?
    • Как установить событие для программно созданного элемента?

В чем удобство использования программного создания элементов формы:

  1. более удобно находить изменения между конфигурациями
  2. Изменять форму «на лету» в процессе работы
  3. Минимизировать изменения типовой конфигурации (в некоторых конфигурациях для этого созданы Переопределяемые модули/процедуры)

Рассмотрим наиболее частые вопросы, все действия показаны здесь проводятся в форме в процедуре ПриСозданииНаСервере

Как программно добавить Группу на форму?

ГруппаТовары = Элементы.Добавить("ГруппаТовары", Тип("ГруппаФормы"),Элементы);	// Добавляет группу на форму
ГруппаТовары.Заголовок = "Товары на продажу";

Как программно добавить Поле ввода на форму?

НовыйРеквизит = Элементы.Добавить("КонтрагентПоставщик", Тип("ПолеФормы"), ГруппаТовары);
НовыйРеквизит.Заголовок = "Контрагент поставщик";
НовыйРеквизит.Вид = ВидПоляФормы.ПолеВвода;
НовыйРеквизит.ПутьКДанным = "Объект.КонтрагентПоставщик";

Как программно добавить колонку в ТЧ?

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

Как программно вывести табличную часть документа на управляемую форму?

ГруппаТовары = Элементы.ГруппаТовары;
ТаблицаТовары = Элементы.Добавить("ТаблицаТовары", Тип("ТаблицаФормы"),ГруппаТовары;
ТаблицаТовары.ПутьКДанным = "Объект.Товары";
// для создания колонок в созданной таблице используется метод описанный выше "Как программно добавить колонку в ТЧ"

Как Добавить программно флажок на форму?

НовыйРеквизит = ЭлементыФормы.Добавить("ЭтоИностранныйПоставщик", Тип("ПолеФормы"), ГруппаТовары); 
НовыйРеквизит.Заголовок = "Это иностранный поставщик"; 
НовыйРеквизит.Вид = ВидПоляФормы.ПолеФлажка; 
НовыйРеквизит.ПутьКДанным = "Объект.ЭтоИностранныйПоставщик"; 

Как установить событие для программно созданного элемента?

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

Недостаточно прав для комментирования

Как создать на форме таблицу и сделать для неё подсветку содержимого колонки в строке по условию?

Итак для начала нам надо добавить реквизиты в форму. Для этого у нас есть метод: ИзменитьРеквизиты(). Перед тем как его использовать мы сформируем массив добавляемых реквизитов, который будет называться МассивДобавляемыхРеквизитов.

Код 1C v 8.2 УП

 МассивДобавляемыхРеквизитов = Новый Массив; 
МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("План", Новый ОписаниеТипов("ТаблицаЗначений")));

Обратите внимание, что элементы массива у нас типа РеквизитФормы. Дальше помимо таблицы значений, нам надо добавить колонки таблицы, например будем добавлять три колонки:

Код 1C v 8.2 УП

 МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("Номенклатура", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"),"План" ,"Номенклатура")); 
МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("Регион", Новый ОписаниеТипов("Число",Новый КвалификаторыЧисла(10,2)),"План" , "Регион"));
МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("Разница", Новый ОписаниеТипов("Число",Новый КвалификаторыЧисла(10,2)),"План" , "Осталось распределить"));

Во время добавления колонок в МассивДобавляемыхРеквизитов обязательно надо указать путь к создаваемому реквизиту, в нашем случае это «План», который был добавлен в массив ранее. Обратите внимание, что путь к создаваемому реквизиту не включает в себя сам реквизит. После того, как массив сформирован, можно вызывать изменение реквизитов:

Код 1C v 8.2 УП

 ИзменитьРеквизиты(МассивДобавляемыхРеквизитов);    

После изменения реквизитов у нас уже есть нужный нам реквизит формы «План» типа ТаблицаЗначений с тремя колонками. Если вам надо будет обратиться к значению реквизита, то вы можете это сделать используя ЭтаФорма[«План»]. Можно приступать к созданию элементов формы, для отображения данных. Сначала создадим элемент формы типа ТаблицаФормы.

Код 1C v 8.2 УП

 ТаблицаФормы = Элементы.Добавить("План", Тип("ТаблицаФормы"));
ТаблицаФормы.ПутьКДанным = "План";
ТаблицаФормы.ПоложениеКоманднойПанели = ПоложениеКоманднойПанелиЭлементаФормы.Нет;
ТаблицаФормы.ФиксацияСлева = 3;
ТаблицаФормы.УстановитьДействие("ПередУдалением", "ПланПередУдалением");
ТаблицаФормы.УстановитьДействие("ПередНачаломДобавления", "ПланПередНачаломДобавления");

Как вы видите из приведенного когда, во время создания элемента мы тут же определяем действия на события. После создания элемента План типа ТаблицаФормы создадим подчиненные ему элементы типа ПолеФормы, которые будут отвечать у нас за вывод данных в колонки таблицы. Для этого в цикле перебора колонок таблицы необходимо выполнить следующий код (на примере одной из итераций цикла):

Код 1C v 8.2 УП

 НоваяКолонка = Элементы.Добавить("ПланНоменклатура", Тип("ПолеФормы"), Элементы.План); 
НоваяКолонка.Заголовок = "Номенклатура";
НоваяКолонка.ПутьКДанным = "План.Номенклатура";
НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода;
НоваяКолонка.РежимРедактирования = РежимРедактированияКолонки.ВходПриВводе;

Обратите внимание, что во время добавления элемента мы указываем родителя Элементы.План. Так же путь к данным у нас состоит из наименования реквизита типа ТаблицаЗначений и имени колонки, разделенные точкой. После того, как вы в цикле создадите все элементы для колонок форма будет готова к выводу и вводу данных в таблицу.

Теперь можно перейти ко второй части задачи про подсветку цветом колонки Номенклатура. Например условие у нас будет накладываться на колонку Разница и когда она будет равно 100 строку надо будет подсвечивать колонку Номенклатуры серым цветом.

Для реализации этой части задачи мы будем использовать объект УсловноеОформление, который доступен на стороне сервера. Сначала в элементы условного оформления необходимо добавить новый элемент. Затем мы добавляем оформляемые поля. Если надо подсвечивать всю строку, то можно обойти в цикле колонки и добавить все их поля ввода в оформляемые. Так же необходимо потом добавить отбор. В левом значении отбора указываем поле, по которому будет идти сравнение. Поле указывает с точкой, как путь к данным во время добавления колонки.

Код 1C v 8.2 УП

 ЭлементУсловногоОформления = УсловноеОформление.Элементы.Добавить();
ОформляемоеПоле = ЭлементУсловногоОформления.Поля.Элементы.Добавить();
ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("ПланНоменклатура");
ЭлементОтбора = ЭлементУсловногоОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("План.Разница");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = 100;
ЭлементУсловногоОформления.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.СеребристоСерый);

Внешняя обработка, демонстрирующая создание таблицы значений программно — Скачивать файлы может только зарегистрированный пользователь!
Андрей Данилюк

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

Для добавления реквизитов удобно либо создать процедуру и вызывать ее из обработчика ПриСозданииНаСервере, либо использовать специальный общий модуль РаботаСФормамиПереопределяемый.

Пример добавления реквизитов на форму:

&НаСервере
Процедура ДополнитьЭлементыФормы()

     МассивРеквизитов = Новый Массив;

     РеквизитОткрытаИзОбработкиЛаборатории = Новый РеквизитФормы("ОткрытаИзОбработкиЛаборатории", Новый ОписаниеТипов("Булево"));
     РеквизитРезультат = Новый РеквизитФормы("РезультатАнализа", Новый ОписаниеТипов("Строка"));

     МассивРеквизитов.Добавить(РеквизитОткрытаИзОбработкиЛаборатории);
     МассивРеквизитов.Добавить(РеквизитРезультат);

     ИзменитьРеквизиты(МассивРеквизитов);

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

Пример добавления кнопок и элементов на форму:

&НаСервере
Процедура ДополнитьЭлементыФормы()

    НоваяКоманда = ЭтаФорма.Команды.Добавить("ЗагрузкаДанных");
    НоваяКоманда.Действие = "ЗагрузкаДанных";

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

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

&НаКлиенте
Процедура ЗагрузкаДанных(Команда)

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

Пример указания процедуры-обработчика для событий формы:

&НаСервере
Процедура ДополнитьЭлементыФормы()

    УстановитьДействие("ОбработкаОповещения", "ОбработкаОповещенияФормы");

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

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

&НаСервере 
Процедура ДополнитьЭлементыФормы()
    ЭлементНазначениеЗаявки = Элементы.Вставить("НазначениеЗаявки", Тип("ПолеФормы"), Элементы.ГруппаЛево, Элементы.ГруппаОрганизация);
    ЭлементНазначениеЗаявки.ПутьКДанным = "Объект.НазначениеЗаявки";
    ЭлементНазначениеЗаявки.Вид = ВидПоляФормы.ПолеПереключателя;
    ЭлементНазначениеЗаявки.Заголовок = "Тип заявки на";
    ЭлементНазначениеЗаявки.УстановитьДействие("ПриИзменении", "ИзменениеНазначенияЗаявки");
КонецПроцедуры

&НаКлиенте
Процедура ИзменениеНазначенияЗаявки(Элемент)
     //Обработчик команды
КонецПроцедуры

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

МассивРеквизитов = Новый Массив;

//Добавляем три реквизита формы
МассивРеквизитов.Добавить(Новый РеквизитФормы("ОтображатьСвязи", Новый ОписаниеТипов("Булево")));
МассивРеквизитов.Добавить(Новый РеквизитФормы("ОтображатьРабочуюГруппу", Новый ОписаниеТипов("Булево")));
МассивРеквизитов.Добавить(Новый РеквизитФормы("ОтображатьВизы", Новый ОписаниеТипов("Булево")));

//Добавление реквизита в табличную часть "Файлы"
МассивРеквизитов.Добавить(Новый РеквизитФормы("Актуальность", Новый ОписаниеТипов("Булево"), "Файлы", "Актуальность", Истина));

ИзменитьРеквизиты(МассивРеквизитов);

В данной статье описаны примеры программного создания объектов управляемой формы 1С — таблицы значений и динамического списка, и их программный вывод в элементы формы

Contents

  • 1 Введение в  управляемые формы 1С
  • 2 Создание реквизита типа таблица значений и вывод на форму
  • 3 Добавление условного оформления таблицы формы
  • 4 Создание реквизита типа динамический список с заданными настройками и вывод на форму
  • 5 Вывести динамический список в элементы управляемой формы 1С
  • 6 Обновление параметров динамического списка программно
  • 7 Полезные ссылки

Перед прочтением данной статьи рекомендуется ознакомиться с первой частью, в которой описаны примеры программного создания элементов, команд, реквизитов управляемой формы, а также описание стандартных возможностей для работы с ними.

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

Модифицировать формы рекомендуется программно для удобного обновления конфигураций и исключения конфликтов, а также для удобной поддержки кода. Со статьями о механизмах модификации можно ознакомиться в разделе полезных ссылок.

Также все описанные в текущем разделе процедуры и функции находятся во внешней обработке УпрФормы.
Примеры программного создания элементов, команд, реквизитов управляемой формы, а также описание стандартных возможностей для работы с ними можно будет посмотреть в части 1.

Для запуска обработки в режиме предприятия необходимо наличие объектов «Справочники.Номенклатура», подчиненный ему «Справочники.ХарактеристикиНоменклатуры» и «РегистрыСведений.ЦеныНоменклатуры”.

Создание реквизита типа таблица значений и вывод на форму

&НаСервере
Процедура пр_СоздатьТаблицуЗначений()
    
    МассивДобавляемыхРеквизитов = Новый Массив;
    //добавить реквизит ТЗ
    МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("пр_ТаблицаЗначений", Новый ОписаниеТипов("ТаблицаЗначений")));
    
    //добавить каждую колонку как отдельный реквизит
    МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("Период", Новый ОписаниеТипов("Дата",,,,,Новый КвалификаторыДаты(ЧастиДаты.Дата)),"пр_ТаблицаЗначений" ,"Период"));
    МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("Номенклатура", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"),"пр_ТаблицаЗначений" ,"Номенклатура"));
    МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("Характеристика", Новый ОписаниеТипов("СправочникСсылка.ХарактеристикиНоменклатуры"),"пр_ТаблицаЗначений" ,"Характеристика"));
    МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("ВидЦены", Новый ОписаниеТипов("СправочникСсылка.ВидыЦен"),"пр_ТаблицаЗначений" ,"Вид цены"));
    МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("Цена", Новый ОписаниеТипов("Число", ,,Новый КвалификаторыЧисла(15,2)), "пр_ТаблицаЗначений" ,"Цена"));
    
    ИзменитьРеквизиты(МассивДобавляемыхРеквизитов);
    
КонецПроцедуры

&НаСервере
Процедура пр_ВывестиТаблицуЗначений()
    
    пр_ВывестиТаблицуНаФорму(ЭтаФорма, "пр_ТаблицаЗначений", Элементы["пр_Страница2"], "Таблица цен");
    
КонецПроцедуры

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

&НаСервере
Процедура пр_ДобавитьНовуюКолонку(Форма, ТаблицаФормы, ИмяТаблицы, ИмяКолонки, СтруктураСвойств = Неопределено)
    
    НоваяКолонка = Форма.Элементы.Добавить(ИмяТаблицы+ИмяКолонки, Тип("ПолеФормы"), ТаблицаФормы);
    НоваяКолонка.Заголовок = ИмяКолонки;
    НоваяКолонка.ПутьКДанным = ИмяТаблицы + "." + ИмяКолонки;
    НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода;    
    Если НЕ СтруктураСвойств = Неопределено Тогда
        Для Каждого КлючЗначение Из СтруктураСвойств Цикл
            Попытка
                НоваяКолонка[КлючЗначение.Ключ] = СтруктураСвойств[КлючЗначение.Ключ];
            Исключение
            КонецПопытки;
        КонецЦикла;    
    КонецЕсли;
    
КонецПроцедуры

Добавление условного оформления таблицы формы

Создаем условное оформление для таблицы:

  • если реквизит формы Использование (тип булево) = Истина, тогда разрешаем изменять цену в строках таб. части;
  • если в строке таб части цена не заполнена, то выделять фон ячейки «Цена» розовым.
&НаСервере
Процедура пр_ДобавитьУОТаблицыФормы()
    
    //условное оформление формы
    //если реквизит Использование = Истина, то разрешать изменять цену
    ЭлементОформления = УсловноеОформление.Элементы.Добавить();    
    
    // Создаем условие отбора в созданной группе:
    ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("пр_Использование"); // имя поля
    ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; // либо задаем свой    
    ЭлементОтбора.ПравоеЗначение = Ложь;
    ЭлементОтбора.Использование = Истина;
    
    // Установка значения элемента УО
    ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Доступность", Ложь);
    ЭлементОформления.Использование = Истина;
    ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветТекста", WebЦвета.КрасноФиолетовый);
    ЭлементОформления.Использование = Истина;

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

	// Создаем поля оформления
	//чтобы выделить всю строку, нужно добавить все ячейки строки, пока же выделим одну ячейку "Цена"
	ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить();
	ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("пр_ТаблицаЗначенийЦена");
	ПолеОформления.Использование = Истина;	
  
КонецПроцедуры

В процедуру команды добавим вызов серверной процедуры для заполнения таблицы цен в зависимости от выбранной номенклатуры и характеристики:

&НаКлиенте
Процедура пр_Команда1(Команда)
	
	пр_Команда1НаСервере();
	 
КонецПроцедуры

&НаСервере
Процедура пр_Команда1НаСервере()
	
	ЭтаФорма["пр_ТаблицаЗначений"].Очистить();
	
	Запрос = Новый Запрос;
	Запрос.УстановитьПараметр("Номенклатура", ЭтаФорма.пр_Номенклатура);
	Запрос.УстановитьПараметр("Характеристика", ЭтаФорма.пр_Характеристика);
	Запрос.Текст = "ВЫБРАТЬ
	               |	ЦеныНоменклатурыСрезПоследних.Период КАК Период,
	               |	ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура,
	               |	ЦеныНоменклатурыСрезПоследних.Характеристика КАК Характеристика,
	               |	ЦеныНоменклатурыСрезПоследних.ВидЦены КАК ВидЦены,
	               |	ЦеныНоменклатурыСрезПоследних.Цена КАК Цена
	               |ИЗ
	               |	РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
	               |			,
	               |			Номенклатура = &Номенклатура
	               |				И Характеристика = &Характеристика) КАК ЦеныНоменклатурыСрезПоследних";
	Выборка = Запрос.Выполнить().Выбрать();
	
	Пока Выборка.Следующий() Цикл
		Стр = ЭтаФорма["пр_ТаблицаЗначений"].Добавить();
		ЗаполнитьЗначенияСвойств(Стр, Выборка);
	КонецЦикла;
	
КонецПроцедуры

Добавляем в процедуру ПриСозданииНаСервере процедуры:

&НаСервере
Процедура пр_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	//установим заголовок формы 
	ЭтаФорма.Заголовок 		= "Шаблон для программной работы с реквизитами, командами и элементами формы";
	ЭтаФорма.АвтоЗаголовок 	= Ложь;
	
	пр_СоздатьГруппы();
	пр_СоздатьНовуюКоманду();
	пр_СоздатьДекорацию();
	пр_СоздатьРеквизиты();
	пр_УдалитьРеквизиты();
	пр_ВывестиРеквизитыНаФорму();
	
	пр_СоздатьТаблицуЗначений();
	пр_ВывестиТаблицуЗначений();
	пр_ДобавитьУОТаблицыФормы();

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

Заполняем реквизиты Номенклатура, Характеристика и заполняем цены в таблице значений.

Создание реквизита типа динамический список с заданными настройками и вывод на форму

На странице 3 создадим динамический список с выводом всех цен выбранной номенклатуры и характеристики.
Добавим Условное Оформление дин. списка, отбор и сортировку программно.

&НаСервере
Процедура пр_СоздатьДинамическийСписок()
    
    //создать дин. список с произвольным запросом
    ТекстЗапроса = "ВЫБРАТЬ
                   |    ЦеныНоменклатуры.Период КАК Период,
                   |    ЦеныНоменклатуры.Номенклатура КАК Номенклатура,
                   |    ЦеныНоменклатуры.Характеристика КАК Характеристика,
                   |    ЦеныНоменклатуры.ВидЦены КАК ВидЦены,
                   |    ЦеныНоменклатуры.Цена КАК Цена,
                   |    ЦеныНоменклатуры.Регистратор КАК Регистратор
                   |ИЗ
                   |    РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
                   |ГДЕ
                   |    ЦеныНоменклатуры.Номенклатура = &Номенклатура
                   |    И ЦеныНоменклатуры.Характеристика = &Характеристика";
    
    МассивДобавляемыхРеквизитов = Новый Массив;    
    //создать реквизит дин. списка
    МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("пр_ДинамическийСписок", Новый ОписаниеТипов("ДинамическийСписок"),,,ЛОЖЬ));
    ИзменитьРеквизиты(МассивДобавляемыхРеквизитов);
    
    РеквизитДинамическийСписок = ЭтаФорма["пр_ДинамическийСписок"];
    //если запрос не произвольный, тогда используем следующий код:
    //РеквизитДинамическийСписок.ПроизвольныйЗапрос = Ложь;
    //РеквизитДинамическийСписок.ОсновнаяТаблица = "РегистрСведений.ЦеныНоменклатуры";
    
    РеквизитДинамическийСписок.ПроизвольныйЗапрос = Истина;
    РеквизитДинамическийСписок.ОсновнаяТаблица = "РегистрСведений.ЦеныНоменклатуры";
    РеквизитДинамическийСписок.ТекстЗапроса = ТекстЗапроса;
    РеквизитДинамическийСписок.Параметры.УстановитьЗначениеПараметра("Номенклатура", ЭтаФорма["пр_Номенклатура"]);
    РеквизитДинамическийСписок.Параметры.УстановитьЗначениеПараметра("Характеристика", ЭтаФорма["пр_Характеристика"]);
    
    //не будем выводить эту колонку в списке, но нужен к ней доступ всегда
    РеквизитДинамическийСписок.УстановитьОбязательноеИспользование("Регистратор", Истина);
        
КонецПроцедуры

&НаСервере
Процедура пр_ДобавитьОтборДинамическийСписок()
    
    ЭлементОтбора = ЭтаФорма["пр_ДинамическийСписок"].Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Период");
    ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Больше; // больше или меньше и т.п.
    ЭлементОтбора.Использование = Истина;
    ЭлементОтбора.ПравоеЗначение = Дата('2015.01.01 00:00:00');     
    
КонецПроцедуры

&НаСервере
Процедура пр_ДобавитьУОДинамическийСписок()
    
    //если цена от 4000 до 5000, то выделять зеленым
    
    ЭлементОформления = ЭтаФорма["пр_ДинамическийСписок"].УсловноеОформление.Элементы.Добавить();    
    
    //сначала добавим группу И
    ГруппаОформления = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
    ГруппаОформления.Использование  = Истина;
    ГруппаОформления.ТипГруппы  = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИ;
    
    // Создаем условие отбора в созданной группе: цена > 4000
    ЭлементОтбора = ГруппаОформления.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Цена"); // имя поля
    ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Больше; // либо задаем свой    
    ЭлементОтбора.ПравоеЗначение = 4000;
    //правым значением может выступать ПолеКомпоновкиДанных формы или списка
    //ЭлементОтбора.ПравоеЗначение = Новый ПолеКомпоновкиДанных(ИмяПоля);
    ЭлементОтбора.Использование = Истина;
    
    //второй элемент отбора: цена < 5000
    ЭлементОтбора = ГруппаОформления.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Цена"); // имя поля
    ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Меньше; // либо задаем свой    
    ЭлементОтбора.ПравоеЗначение = 5000;
    ЭлементОтбора.Использование = Истина;
        
    
    // Установка значения элемента УО
    ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.ЗеленыйЛес);
    // Возможно обращение как по индексу так и установка через метод
    //Элемент = ЭлементОформления.Оформление.Элементы[0];
    //Элемент.Значение = Цвет;
    ЭлементОформления.Использование = Истина;
    
    // Создаем поля оформления
    ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить();
    //чтобы выделить ячейку, нуджно указать ее имя поля
    ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("Период");
    ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить();
    ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("Номенклатура");
    ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить();
    ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("Характеристика");
    ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить();
    ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("ВидЦены");
    ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить();
    ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("Цена");
    ПолеОформления.Использование = Истина;    
    
КонецПроцедуры

&НаСервере
Процедура пр_ДобавитьСортировкуДинамическийСписок()
    
    ЭлементСортировки = ЭтаФорма["пр_ДинамическийСписок"].Порядок.Элементы.Добавить(Тип("ЭлементПорядкаКомпоновкиДанных"));
    ЭлементСортировки.Поле = Новый ПолеКомпоновкиДанных("Период");
    ЭлементСортировки.ТипУпорядочивания = НаправлениеСортировкиКомпоновкиДанных.Убыв;
    ЭлементСортировки.Использование = Истина;    
    
КонецПроцедуры

Вывести динамический список в элементы управляемой формы 1С

Для вывода дин. списка воспользуемся процедурами, которые использовали при выводе таблицы значений, так как это один тип — ДанныеФормыКоллекция.

&НаСервере
Процедура пр_ВывестиДинамическийСписок()
    
    пр_ВывестиДинамическийСписокНаФорму(ЭтаФорма, "пр_ДинамическийСписок", Элементы["пр_Страница3"], "Таблица цен");
    
КонецПроцедуры

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

    СтруктураСвойств = Новый Структура("Вид",  ВидПоляФормы.ПолеНадписи); //если нужны какие-то специфические свойства колонки, то нужно их добавить в структуру свойств
    пр_ДобавитьНовуюКолонку(Форма, ТаблицаФормы, ИмяТаблицы, "Период", СтруктураСвойств);    
    пр_ДобавитьНовуюКолонку(Форма, ТаблицаФормы, ИмяТаблицы, "Номенклатура", СтруктураСвойств);    
    пр_ДобавитьНовуюКолонку(Форма, ТаблицаФормы, ИмяТаблицы, "Характеристика", СтруктураСвойств);    
    пр_ДобавитьНовуюКолонку(Форма, ТаблицаФормы, ИмяТаблицы, "ВидЦены", СтруктураСвойств);    
    пр_ДобавитьНовуюКолонку(Форма, ТаблицаФормы, ИмяТаблицы, "Цена", СтруктураСвойств);    
    
КонецПроцедуры

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

Если в запросе дин. списка используются параметры, то их необходимо обновлять при изменении соответствующих реквизитов.

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

&НаКлиенте
Процедура пр_НоменклатураПриИзменении(Элемент)
    пр_ОбновитьПараметрДинСписков("Номенклатура", ЭтаФорма["пр_Номенклатура"]);        
КонецПроцедуры

&НаКлиенте
Процедура пр_ХарактеристикаПриИзменении(Элемент)
    пр_ОбновитьПараметрДинСписков("Характеристика", ЭтаФорма["пр_Характеристика"]);        
КонецПроцедуры

Добавляем в процедуру ПриСозданииНаСервере процедуры:

&НаСервере
Процедура пр_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	//установим заголовок формы 
	ЭтаФорма.Заголовок 		= "Шаблон для программной работы с реквизитами, командами и элементами формы";
	ЭтаФорма.АвтоЗаголовок 	= Ложь;
	
	пр_СоздатьГруппы();
	пр_СоздатьНовуюКоманду();
	пр_СоздатьДекорацию();
	пр_СоздатьРеквизиты();
	пр_УдалитьРеквизиты();
	пр_ВывестиРеквизитыНаФорму();

	
	пр_СоздатьДинамическийСписок();
	пр_ДобавитьОтборДинамическийСписок();
	пр_ДобавитьСортировкуДинамическийСписок();
	пр_ДобавитьУОДинамическийСписок();
	пр_ВывестиДинамическийСписок();
	
КонецПроцедуры

Заполняем реквизиты Номенклатура, Характеристика и заполняем цены в таблице значений.

Содержимое регистра сведений ЦеныНоменклатуры:

Динамический список на форме:

Полезные ссылки

1. Типовой механизм упрощенного изменения конфигурации в ERP 2.0 и УТ 11
2. Типовой функционал модификации конфигурации линейки ERP-решений (УТ 11, КА 2 и ERP 2)
3. 1С Управляемые Формы. Программное создание реквизитов , команд, элементов (Часть 1)

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

Добавление поля ввода управляемой формы

В данном примере, реализован механизм программного добавления поля ввода управляемой формы. Перед добавление элемента формы необходимо создать реквизит формы для хранения данных. Если реквизит уже существует, то его ненужно создавать программно.

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)//Добавление реквизита

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

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

Добавление кнопки управляемой формы

Для программного создания кнопки нужно будет создать команду, в которой необходимо в свойстве «Действие» задать имя процедуры обработчика команды.

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

Команда1

= ЭтаФорма.Команды.Добавить("Команда1");
Команда1.Действие = "ИмяПроцедуры";
Команда1.Заголовок = "Команда 1";

Элемент1

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

&НаКлиенте

Процедура ИмяПроцедуры()
Сообщить("Нажата кнопка Команда 1");
КонецПроцедуры

Если создаваемый элемент нужно поместить в какую-либо группу, то это делается при создании этого элемента, указыванием нужного родителя:

Элемент = ЭтаФорма.Элементы.Добавить("Кнопка1", Тип("КнопкаФормы"), ЭтаФорма.Элементы.Группа1);

В данном случае кнопка добавиться в элемент с названием «Группа1» и будет отображаться в соответствие со свойствами этого элемента.

Добавление надписи (декорации) управляемой формы

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

Элемент1

= ЭтаФорма.Элементы.Добавить("Декорация1", Тип("ДекорацияФормы"), ЭтаФорма);
Элемент1.Заголовок = "Текст надписи";КонецПроцедуры

Добавление команды

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	
	//Добавление команды формы
	Команда = Команды.Добавить(
		"ПоказатьПредупреждение"); //Имя команды
	Команда.Заголовок = "Показать предупреждение";
	Команда.Действие  = "КомандаПоказатьПредупреждение"; //Имя связанной процедуры
	
	//Полный перечень свойств команды в синтакс-помощнике
	//	Интерфейс (управляемый)->Форма клиентского приложения->КомандаФормы
	
	//Добавление кнопки формы
	КнопкаФормы = Элементы.Добавить(
		"КнопкаПоказатьПредупреждение", //Имя кнопки
		Тип("КнопкаФормы"),             //Тип, всегда КнопкаФормы
		ЭтаФорма);                      //Контейнер для кнопки (Форма, Группа, Командная панель)
		
	КнопкаФормы.ИмяКоманды = "ПоказатьПредупреждение"; //Связь с командой по имени
	
	//Возможные варианты вида кнопки:
	//	-Гиперссылка
	//	-ГиперссылкаКоманднойПанели
	//	-КнопкаКоманднойПанели
	//	-ОбычнаяКнопка
	//Если контейнер для формы - командная панель
	//то вид кнопки должен быть КнопкаКоманднойПанели
	КнопкаФормы.Вид = ВидКнопкиФормы.ОбычнаяКнопка; 
	
	//Полный перечень свойств кнопки формы в синтакс-помощнике
	//	Интерфейс (управляемый)->Кнопка формы
		
КонецПроцедуры

//Процедура вызываемая командой "ПоказатьПредупреждение"
&НаКлиенте
Процедура КомандаПоказатьПредупреждение(Команда)
	
	ПоказатьПредупреждение(, "ОК!");
	
КонецПроцедуры

Добавление реквизита формы

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	//Пример:
	//Добавление реквизита с именем "АдресДоставки", тип Строка
	
	ДобавляемыеРеквизиты = Новый Массив;
	
	ТипРеквизита = Новый ОписаниеТипов("Строка");
	
	РеквизитФормы = Новый РеквизитФормы(
		"АдресДоставки",  //Имя реквизита формы
		ТипРеквизита,     //Тип
		"",               //Путь  (Пусто, "Объект", ИмяТЧ)
						  // например "Объект.Товары"	
		"Адрес доставки");//Заголовок
						  							 
	ДобавляемыеРеквизиты.Добавить(РеквизитФормы);
	
	//Заставляем форму создать новые реквизиты
	ИзменитьРеквизиты(ДобавляемыеРеквизиты);
	
	//Обращение к реквизиту формы из кода
	ЭтаФорма.АдресДоставки = "ул. Пушкина";
	
	//Вывод реквизита на форму (при необходимости)
	ПолеВвода = Элементы.Добавить("ФормаАдресДоставки", Тип("ПолеФормы"), ЭтаФорма);
	ПолеВвода.Вид = ВидПоляФормы.ПолеВвода;
	ПолеВвода.ПутьКДанным = "АдресДоставки";
	
КонецПроцедуры

Добавление группы формы

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

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

Добавление страниц формы

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	//Пример:
	//Добавление группы страниц
	//Добавление страниц
	//Добавление элементов на страницы
	
	СтраницыФормы = Элементы.Добавить(
		"СтраницыФормы",
		Тип("ГруппаФормы"),
		ЭтаФорма);
		
	СтраницыФормы.Вид = ВидГруппыФормы.Страницы;
	
	//Подключить обработчик при смене страницы
	СтраницыФормы.УстановитьДействие("ПриСменеСтраницы", "ДействиеПриСменеСтраницы");
	
	//Добавление 1-й страницы
	СтраницаФормы1 = Элементы.Добавить(
		"Страница1",
		Тип("ГруппаФормы"),
		СтраницыФормы);
		
	СтраницаФормы1.Вид = ВидГруппыФормы.Страница;
	СтраницаФормы1.Заголовок = "Первая страница";
	
	//Добавление 2-й страницы
	СтраницаФормы2 = Элементы.Добавить(
		"Страница2",
		Тип("ГруппаФормы"),
		СтраницыФормы);
		
	СтраницаФормы2.Вид = ВидГруппыФормы.Страница;
	СтраницаФормы2.Заголовок = "Вторая страница";
	
	//Добавить поле ввода на страницу 1
	ПолеВвода = Элементы.Добавить("ФормаКомментарий", Тип("ПолеФормы"), СтраницаФормы1);
	ПолеВвода.Вид = ВидПоляФормы.ПолеВвода;
	ПолеВвода.ПутьКДанным = "Объект.Комментарий";
	
	//Добавить поле ввода на страницу 2
	ПолеВвода = Элементы.Добавить("ФормаКомментарий2", Тип("ПолеФормы"), СтраницаФормы2);
	ПолеВвода.Вид = ВидПоляФормы.ПолеВвода;
	ПолеВвода.ПутьКДанным = "Объект.Комментарий";
	
КонецПроцедуры

&НаКлиенте
Процедура ДействиеПриСменеСтраницы(Элемент)
	
	Сообщить("Изменена страница");
	
КонецПроцедуры

Как программно добавить колонку в ТЧ?

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

Как программно вывести табличную часть документа на управляемую форму?

ГруппаТовары = Элементы.ГруппаТовары;
ТаблицаТовары = Элементы.Добавить("ТаблицаТовары", Тип("ТаблицаФормы"),ГруппаТовары;
ТаблицаТовары.ПутьКДанным = "Объект.Товары";
// для создания колонок в созданной таблице используется метод описанный выше "Как программно добавить колонку в ТЧ"

Как Добавить программно флажок на форму?

НовыйРеквизит = ЭлементыФормы.Добавить("ЭтоИностранныйПоставщик", Тип("ПолеФормы"), ГруппаТовары); 
НовыйРеквизит.Заголовок = "Это иностранный поставщик"; 
НовыйРеквизит.Вид = ВидПоляФормы.ПолеФлажка; 
НовыйРеквизит.ПутьКДанным = "Объект.ЭтоИностранныйПоставщик";

Как установить событие для программно созданного элемента?

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

Источники:
Программное создание элементов формы в управляемом приложении
Программное добавление элементов управляемых форм
Программное добавление элементов на управляемую форму
Программное создание элементов управляемых форм 1C

Смотрите также:
Электронный учебник по программированию в 1С
Рекомендации по изучению программирования 1С с нуля
Игра «Кто хочет стать миллионером?» с вопросами на определенную тематику (язык программирования JavaScript, английские, немецкие, французские, испанские, португальские, ни­дер­ландские, итальянские слова, электробезопасность, промышленная безопасность, бокс и т.п.), написанная на 1С
Программирование в 1С 8.3 с нуля — краткий самоучитель
Комплексная подготовка программистов 1С:Предприятие 8.2
Сайты с уроками программирования и со справочниками
Youtube-каналы с уроками программирования
Сайты для обучения программированию
Лекции и уроки

Понравилась статья? Поделить с друзьями:
  • Добавить реквизит в табличную часть на форме в расширении
  • Доверенность на автомобиль для страховой компании при дтп
  • Доверенность на получение документов в страховой компании
  • Доверенность от компании на постановку автомобиля на учет
  • Доверенность удостоверенная управляющей компанией образец