1С Управляемые Формы. Программное создание таблицы значений и динамического списка (Часть 2)

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

Введение в  управляемые формы 1С

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

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

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

Также все описанные в текущем разделе процедуры и функции находятся во внешней обработке УпрФормы.
Примеры программного создания элементов, команд, реквизитов управляемой формы, а также описание стандартных возможностей для работы с ними можно будет посмотреть в части 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)

Comments

So empty here ... leave a comment!

Добавить комментарий

Sidebar