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

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

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

Код 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»,     , ИмяРеквизита, );

РеквизитФормы (FormAttribute)

Основной

Синтаксис:

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

Параметры:

<Имя> (обязательный)

Тип: Строка.

Имя реквизита.

<Тип> (обязательный)

Тип: ОписаниеТипов.

Тип реквизита.

<Путь> (необязательный)

Тип: Строка.

Путь к создаваемому реквизиту. Не включает имя реквизита.

Значение по умолчанию: Пустая строка

<Заголовок> (необязательный)

Тип: Строка.

Содержит отображаемый текст реквизита.

Значение по умолчанию: Пустая строка

<СохраняемыеДанные> (необязательный)

Тип: Булево.

Реквизит содержит сохраняемые данные.

Истина — сохраняеый реквизит формы.

Значение по умолчанию: Ложь

Описание:

Создает описание реквизита управляемой формы на основе переданных параметров.

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

Создаем реквизит формы ДанныеТаблицы, тип ТаблицаЗначений, на форму его не выносим. И саму таблицу формы и ее колонки будем создавать программно. Для удобства тестирования добавим еще команду формы СоздатьТаблицу.

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

&НаСервере
Процедура СоздатьТаблицуНаСервере()

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

&НаСервере
Функция СоздатьСлучайнуюТаблицуЗначений()

    Если НомерТаблицы = 0 Тогда

        ТаблицаЗначений = Новый ТаблицаЗначений();
        ТаблицаЗначений.Колонки.Добавить("Код");
        ТаблицаЗначений.Колонки.Добавить("Наименование");
        ТаблицаЗначений.Колонки.Добавить("Количество");

        // делаем выборку
        Выборка = Справочники.Номенклатура.Выбрать();
        Пока Выборка.Следующий() Цикл
            // добавляем новуй строку в таблицу значений
            НоваяСтрока = ТаблицаЗначений.Добавить();
            НоваяСтрока.Код = Выборка.Код;
            НоваяСтрока.Наименование = Выборка.Наименование;
            НоваяСтрока.Количество = 1;
        КонецЦикла;
        
        НомерТаблицы = 1

    Иначе

        ТаблицаЗначений = Новый ТаблицаЗначений();
        ТаблицаЗначений.Колонки.Добавить("Код");
        ТаблицаЗначений.Колонки.Добавить("Фамилия");

        // делаем выборку
        Выборка = Справочники.Сотрудники.Выбрать();
        Пока Выборка.Следующий() Цикл
            // добавляем новуй строку в таблицу значений
            НоваяСтрока = ТаблицаЗначений.Добавить();
            НоваяСтрока.Код = Выборка.Код;
            НоваяСтрока.Фамилия = Выборка.Наименование;
        КонецЦикла;
        
        НомерТаблицы = 0

    КонецЕсли;
    
    Возврат ТаблицаЗначений;

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

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

Справка

УправляемаяФорма.ИзменитьРеквизиты()

УправляемаяФорма.ИзменитьРеквизиты(ДобавляемыеРеквизиты, УдаляемыеРеквизиты)

Параметры:

  • ДобавляемыеРеквизиты (необязательный, тип Массив). Массив, содержащий объекты типа РеквизитФормы. Добавлять можно реквизиты верхнего уровня и вложенные реквизиты, являющиеся колонками. К добавленным реквизитам верхнего уровня из модуля можно обращаться только с помощью конструкции ЭтотОбъект.
  • УдаляемыеРеквизиты (необязательный, тип Массив). Массив, содержащий строки, описывающие пути к удаляемым реквизитам. Удалять можно только ранее программно добавленные реквизиты.

Описание:

  • Изменяет структуру реквизитов формы. Сначала выполняется удаление реквизитов. Таким образом массивы добавляемых и удаляемых реквизитов могут содержать реквизиты с одинаковым путём.
  • Внимание! Действия добавления и удаления выполняются за один вызов. Следует учитывать, что операция изменения состава реквизитов является ресуркоемкой, поэтому операции изменения состава реквизитов формы выполняются пакетным образом.

Доступность:

  • Сервер, мобильное приложение (сервер).

ВсеЭлементыФормы.Добавить()

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

Параметры:

  • Имя (обязательный, тип Строка). Уникальное имя добавляемого элемента.
  • ТипЭлемента (обязательный, тип Тип). Тип добавляемого элемента.
  • Родитель (необязательный, тип: ГруппаФормы; ТаблицаФормы; УправляемаяФорма). Родитель для добавляемого элемента. Если не указан, то добавляется на верхний уровень.

Возвращаемое значение:

  • Тип: ДекорацияФормы; ГруппаФормы; КнопкаФормы; ТаблицаФормы; ПолеФормы.

Описание:

  • Добавляет элемент в коллекцию.

Доступность:

  • Сервер, мобильное приложение (сервер).

Поиск:
1С:Предприятие • Значение в реквизит формы • Изменить реквизиты • Реквизит формы в значение • Таблица значений • Управляемая форма • Элемент формы

Перейти в основной раздел:

Выводим на форму заполненную Таблицу значений в 1С 8.3:

&НаСервере
Процедура ПриОткрытииНаСервере()// Описание таблицы значений как реквизита
   
МассивТипа = Новый Массив;
   
МассивТипа.Добавить(Тип(«ТаблицаЗначений»));// Добавление ТаблицыЗначений в массив реквизитов
   
ОписаниеТипа = Новый ОписаниеТипов(МассивТипа);
   
МассивРеквизитовФормы = Новый Массив;
   
МассивРеквизитовФормы.Добавить(Новый РеквизитФормы(«ТаблицаСотрудников», ОписаниеТипа, «», «ТЗСотр»));// Создание ТаблицыЗначений с описанием колонок
   
КвалификаторыСтроки = Новый КвалификаторыСтроки(10);
   
ОписаниеСтроки_10 = Новый ОписаниеТипов(«Строка», ,КвалификаторыСтроки);ОписаниеСотрудника = Новый ОписаниеТипов(«СправочникСсылка.Сотрудники»);ТЗ = Новый ТаблицаЗначений;
   
ТЗ.Колонки.Добавить(«Код», ОписаниеСтроки_10);
   
ТЗ.Колонки.Добавить(«Сотрудник», ОписаниеСотрудника);
   
// ТЗ.Колонки.Добавить — можно и в цикле

    // Добавление в массив реквизитов колонок ТаблицыЗначений

Для Каждого Колонка Из ТЗ.Колонки Цикл
       
МассивРеквизитовФормы.Добавить(Новый РеквизитФормы(Колонка.Имя, Колонка.ТипЗначения, «ТаблицаСотрудников»));
    КонецЦикла;
// Удаление — если таблица существует
   
ЭлементТаблица = Элементы.Найти(«ТаблицаСотрудников»);
    Если
ЭлементТаблица <> Неопределено Тогда
       
Элементы.Удалить(ЭлементТаблица);
    Иначе
       
ИзменитьРеквизиты(МассивРеквизитовФормы);
    КонецЕсли;
// Добавление ТаблицыЗначений на форму
   
ТаблицаПолейВыбора = Элементы.Добавить(«ТЗСотр», Тип(«ТаблицаФормы»));
   
ТаблицаПолейВыбора.ПутьКДанным = «ТаблицаСотрудников»;
   
ТаблицаПолейВыбора.Отображение = ОтображениеТаблицы.Список;
   
ТаблицаПолейВыбора.ПоложениеКоманднойПанели = ПоложениеКоманднойПанелиЭлементаФормы.Нет; // Отключение командной панелиДля Каждого Колонка Из ТЗ.Колонки ЦиклНовыйЭлемент = Элементы.Добавить(Колонка.Имя, Тип(«ПолеФормы»), ТаблицаПолейВыбора);
       
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
       
НовыйЭлемент.ПутьКДанным = «ТаблицаСотрудников.» + Колонка.Имя;
       
НовыйЭлемент.Ширина = 10;

    КонецЦикла;

// Заполнение ТаблицыЗначений
   
Запрос = Новый Запрос;
   
Запрос.Текст =
       
«ВЫБРАТЬ
        |   Сотрудники.Код КАК Код,
        |   Сотрудники.ГоловнаяОрганизация КАК ГоловнаяОрганизация,
        |   Сотрудники.Ссылка КАК Ссылка,
        |   Сотрудники.Наименование КАК Наименование
        |ИЗ
        |   Справочник.Сотрудники КАК Сотрудники
        |
        |УПОРЯДОЧИТЬ ПО
        |   Наименование»
;РезультатЗапроса = Запрос.Выполнить();ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    Пока
ВыборкаДетальныеЗаписи.Следующий() Цикл
       
Строка = ТЗ.Добавить();
       
Строка.Код = ВыборкаДетальныеЗаписи.Код;
       
Строка.Сотрудник = ВыборкаДетальныеЗаписи.Ссылка;
    КонецЦикла;
// Передача ТаблицыЗначений в реквизит формы
   
ЗначениеВРеквизитФормы(ТЗ, «ТаблицаСотрудников»);

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

Обработка события Таблицы на форме в 1С 8.3:

//Для добавления обработчика события таблицы «Выбор»:
ТаблицаПолейВыбора.УстановитьДействие(«Выбор»,«ТЗВыбор»);//Для обработки данного события в форме процедуры прописывается отдельная процедура (НаКлиенте):
&НаКлиенте
Процедура ТЗВыбор(ТЗ, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
     
//Код для обработки обработчика
КонецПроцедуры

Чтение программно созданной Таблицы на форме в 1С 8.3:

// При обращении к реквизиту получите ошибку: Переменная не определена
// Для чтения реквизита, который создан программно, используется метод РеквизитФормыВЗначение
ТекущаяТаблица=РеквизитФормыВЗначение(«ТаблицаСотрудников»);

Copyright©, «Программист 1С в г.Минске», 27.04.2020

Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник

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

МассивДобавляемыхРеквизитов = Новый Массив;

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

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

[wp_ad_camp_3]

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

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

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

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

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

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

[wp_ad_camp_3]

ТаблицаФормы = Элементы.Добавить(«План», Тип(«ТаблицаФормы»));

ТаблицаФормы.ПутьКДанным = «План»;

ТаблицаФормы.ПоложениеКоманднойПанели = ПоложениеКоманднойПанелиЭлементаФормы.Нет;

ТаблицаФормы.ФиксацияСлева = 3;

ТаблицаФормы.УстановитьДействие(«ПередУдалением», «ПланПередУдалением»);

ТаблицаФормы.УстановитьДействие(«ПередНачаломДобавления», «ПланПередНачаломДобавления»);

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

НоваяКолонка = Элементы.Добавить(«ПланНоменклатура», Тип(«ПолеФормы»), Элементы.План);

НоваяКолонка.Заголовок = «Номенклатура»;

НоваяКолонка.ПутьКДанным = «План.Номенклатура»;

НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода;

НоваяКолонка.РежимРедактирования = РежимРедактированияКолонки.ВходПриВводе;

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

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

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

ЭлементУсловногоОформления = УсловноеОформление.Элементы.Добавить();

ОформляемоеПоле = ЭлементУсловногоОформления.Поля.Элементы.Добавить();

ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных(«ПланНоменклатура»);

ЭлементОтбора = ЭлементУсловногоОформления.Отбор.Элементы.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»));

ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(«План.Разница»);

ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;

ЭлементОтбора.ПравоеЗначение = 100;

ЭлементУсловногоОформления.Оформление.УстановитьЗначениеПараметра(«ЦветФона», WebЦвета.СеребристоСерый);

[wp_ad_camp_3]

Инструкция. Программная модификация управляемых форм

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

Мы рассмотрим основные составляющие этой задачи: добавление реквизитов, добавление элементов формы и назначение обработчиков событий элементов формы.

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

Для добавления реквизитов используется метод объекта ФормаКлиентскогоПриложения

							ИзменитьРеквизиты(ДобавляемыеРеквизиты, УдаляемыеРеквизиты);
						

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

Переменная ДобавляемыеРеквизиты является массивом объектов типа РеквизитФормы.

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

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

К добавленным реквизитам верхнего уровня из модуля можно обращаться только с помощью конструкции ЭтотОбъект. ˂Имя реквизита˃.

Процедуру ИзменитьРеквизиты логично вызывать из обработчика ПриСозданииНаСервере, но т.к. мы не заимствуем форму в расширение, то следует найти другую точку входа. Для конфигураций УТ 11, КА 2 и ERP 2 существует типовой механизм упрощенного изменения конфигураций. Нас интересует модуль МодификацияКонфигурацииПереопределяемый, в состав которого входит процедура

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

Данную процедуру можно заимствовать в расширение, добавить проверку имени формы и вставить код изменения реквизитов:

							Если Форма.ИмяФормы = "Справочник.Номенклатура.Форма.ФормаЭлемента" Тогда
							// код модификации реквизитов
							КонецЕсли;
						

Для остальных конфигураций придется переопределять другие процедуры. Например

							ПодключаемыеКоманды.ПриСозданииНаСервере(Форма)
						

или

							ВерсионированиеОбъектов.ПриСозданииНаСервере(Форма)
						

Использование той или иной процедуры следует проверить в модуле редактируемой формы.

Изменение элементов формы

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

Для добавления нового элемента формы требуется передать в функцию Добавить данной коллекции имя элемента, его тип и родителя (при необходимости). Например:

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

По аналогии с добавлением реквизитов, данный код можно выполнять в функциях МодификацияКонфигурацииПереопределяемый.ПриСозданииНаСервере (УТ, КА, ERP), ПодключаемыеКоманды.ПриСозданииНаСервере или ВерсионированиеОбъектов.ПриСозданииНаСервере.

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

Обработка событий формы

Выполнить код по событию элемента формы можно двумя способами:

  • Создать команду, указать для этой команды имя обработчика события и назначить эту команду элементу формы
  • Выполнить метод УстановитьДействие элемента формы, чтобы указать имя обработчика события в модуле формы

Оба метода предполагают наличие в модуле формы процедуры с сигнатурой, соответствующей обработчику события. Для первого способа в модуле формы должна быть клиентская процедура, принимающая единственный аргумент — Команда. Для второго — всё зависит от события, для которого выполняется обработчик. Так, например, для события ПриИзменении элемента формы с типом ПолеВвода будет требоваться процедура, принимающая единственный аргумент — ЭлементФормы. А для события ПередНачаломДобавления таблицы формы — целых 6 аргументов (ЭлементФормы, Отказ, Копирование, Родитель, ЭтоГруппа, Параметр). Поэтому для некоторых событий попросту невозможно подобрать соответствующие клиентские методы в модуле формы и заимствования формы в расширение не избежать.

Для самых простых случаев (команда или событие без параметров) можно использовать следующие комбинации обработчиков и переопределяемых процедур:

  • обработчик Подключаемый_ВыполнитьПереопределяемуюКоманду с переопределением процедуры МодификацияКонфигурацииКлиентПереопределяемый.ВыполнитьПереопределяемуюКоманду для УТ, КА и ERP;
  • обработчик Подключаемый_ВыполнитьКоманду с переопределением процедуры ПодключаемыеКомандыКлиент.ВыполнитьКоманду

При этом в предопределенной процедуре обязательно проверять имя команды (или имя элемента формы) и имя самой формы.

Например:

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

Либо вариант с использованием команд:

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

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

Полезные советы

Работа с динамическими списками

Довольно частой задачей является модификация в расширении текста запроса динамического списка. Многие разработчики просто копируют текст запроса из конфигуратора, редактируют его и заменяют стандартный в свойстве ТекстЗапроса объекта Динамический список.

Для небольших изменений гораздо лучше воспользоваться объектом СхемаЗапроса, появившемся в версии платформы 8.3.5. Он позволит всегда иметь актуальный текст запроса, если он поменяется при обновлении конфигурации.

Например:

							СхемаЗапроса = Новый СхемаЗапроса;
							СхемаЗапроса.УстановитьТекстЗапроса(Список.ТекстЗапроса);
							Пакет = СхемаЗапроса.ПакетЗапросов[0];
							Оператор = Пакет.Операторы[0];
							Оператор.ВыбираемыеПоля.Добавить("РеализацияТоваровУслуг.Ссылка");
							Список.ТекстЗапроса = СхемаЗапроса.ПолучитьТекстЗапроса();
						

Переопределение открываемой формы

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

Для этого следует реализовать новую форму (не заимствовать её, а написать с нуля) и в модуле менеджера переопределить процедуру ОбработкаПолученияФормы.

Например:

							Процедура ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка)
								Если ВидФормы = "ФормаОбъекта" И Параметры.Ключ.Вид = Перечисления.ВидыТоваров.Услуга Тогда
									ВыбраннаяФорма = Метаданные.Справочники.Товары.Формы.ФормаУслуги;
									СтандартнаяОбработка = Ложь;
								КонецЕсли;
							КонецПроцедуры
						

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

Понравилась статья? Поделить с друзьями:
  • Производственная компания геркулес алтайский край
  • Промежуточная вилка карданного вала газель бизнес
  • Программное добавление реквизитов формы списка 1с
  • Производственная компания лазерон санкт петербург
  • Промежуточная опора карданного вала газель бизнес