1С Управляемые Формы. Программное создание таблицы значений и динамического списка (Часть 2)
В данной статье описаны примеры программного создания объектов управляемой формы 1С — таблицы значений и динамического списка, и их программный вывод в элементы формы
Contents
- 1 Введение в управляемые формы 1С
- 2 Создание реквизита типа таблица значений и вывод на форму
- 3 Добавление условного оформления таблицы формы
- 4 Создание реквизита типа динамический список с заданными настройками и вывод на форму
- 5 Вывести динамический список в элементы управляемой формы 1С
- 6 Обновить динамический список 1С программно
- 7 Полезные ссылки
Введение в управляемые формы 1С
Перед прочтением данной статьи рекомендуется ознакомиться с первой частью, в которой описаны примеры программного создания элементов, команд, реквизитов управляемой формы, а также описание стандартных возможностей для работы с ними.
В данной же части будет рассмотрено программное создание динамических списков, таблиц значений на форме, их вывод в элементы формы и стандартные возможности для работы.
Модифицировать формы рекомендуется программно для удобного обновления конфигураций и исключения конфликтов, а также для удобной поддержки кода. Со статьями о механизмах модификации можно ознакомиться в разделе полезных ссылок.
Также все описанные в текущем разделе процедуры и функции находятся во внешней обработке УпрФормы.
Примеры программного создания элементов, команд, реквизитов управляемой формы, а также описание стандартных возможностей для работы с ними можно будет посмотреть в части 1.
Для запуска обработки в режиме предприятия необходимо наличие объектов «Справочники.Номенклатура», подчиненный ему «Справочники.ХарактеристикиНоменклатуры» и «РегистрыСведений.ЦеныНоменклатуры”.
Создание реквизита типа таблица значений и вывод на форму
&НаСервере Процедура пр_СоздатьТаблицуЗначений() МассивДобавляемыхРеквизитов = Новый Массив; //добавить реквизит ТЗ МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("пр_ТаблицаЗначений", Новый ОписаниеТипов("ТаблицаЗначений"))); //добавить каждую колонку как отдельный реквизит МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("Период", Новый ОписаниеТипов("Дата",,,,,Новый КвалификаторыДаты(ЧастиДаты.Дата)),"пр_ТаблицаЗначений" ,"Период")); МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("Номенклатура", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"),"пр_ТаблицаЗначений" ,"Номенклатура")); МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("Характеристика", Новый ОписаниеТипов("СправочникСсылка.ХарактеристикиНоменклатуры"),"пр_ТаблицаЗначений" ,"Характеристика")); МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("ВидЦены", Новый ОписаниеТипов("СправочникСсылка.ВидыЦен"),"пр_ТаблицаЗначений" ,"Вид цены")); МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("Цена", Новый ОписаниеТипов("Число", ,,Новый КвалификаторыЧисла(15,2)), "пр_ТаблицаЗначений" ,"Цена")); ИзменитьРеквизиты(МассивДобавляемыхРеквизитов); КонецПроцедуры &НаСервере Процедура пр_ВывестиТаблицуЗначений() пр_ВывестиТаблицуНаФорму(ЭтаФорма, "пр_ТаблицаЗначений", Элементы["пр_Страница2"], "Таблица цен"); КонецПроцедуры &НаСервере Процедура пр_ВывестиТаблицуНаФорму(Форма, ИмяТаблицы, Родитель, ЗаголовокТаблицы) Экспорт ТаблицаФормы = Форма.Элементы.Добавить(ИмяТаблицы, Тип("ТаблицаФормы"), Родитель); ТаблицаФормы.ПутьКДанным = ИмяТаблицы; ТаблицаФормы.Заголовок = ЗаголовокТаблицы; ТаблицаФормы.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Верх; ТаблицаФормы.ИзменятьПорядокСтрок = Ложь; ТаблицаФормы.ИзменятьСоставСтрок = Ложь; ТаблицаФормы.РазрешитьНачалоПеретаскивания = Ложь; СтруктураСвойств = Новый Структура(); пр_ДобавитьНовуюКолонку(Форма, ТаблицаФормы, ИмяТаблицы, "Период"); пр_ДобавитьНовуюКолонку(Форма, ТаблицаФормы, ИмяТаблицы, "Номенклатура"); пр_ДобавитьНовуюКолонку(Форма, ТаблицаФормы, ИмяТаблицы, "Характеристика"); пр_ДобавитьНовуюКолонку(Форма, ТаблицаФормы, ИмяТаблицы, "ВидЦены"); пр_ДобавитьНовуюКолонку(Форма, ТаблицаФормы, ИмяТаблицы, "Цена", СтруктураСвойств); КонецПроцедуры &НаСервере Процедура пр_ДобавитьНовуюКолонку(Форма, ТаблицаФормы, ИмяТаблицы, ИмяКолонки, СтруктураСвойств = Неопределено) НоваяКолонка = Форма.Элементы.Добавить(ИмяТаблицы+ИмяКолонки, Тип("ПолеФормы"), ТаблицаФормы); НоваяКолонка.Заголовок = ИмяКолонки; НоваяКолонка.ПутьКДанным = ИмяТаблицы + "." + ИмяКолонки; НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода; Если НЕ СтруктураСвойств = Неопределено Тогда Для Каждого КлючЗначение Из СтруктураСвойств Цикл Попытка НоваяКолонка[КлючЗначение.Ключ] = СтруктураСвойств[КлючЗначение.Ключ]; Исключение КонецПопытки; КонецЦикла; КонецЕсли; КонецПроцедуры
Добавление условного оформления таблицы формы
Создаем условное оформление для таблицы:
- если реквизит формы Использование (тип булево) = Истина, тогда разрешаем изменять цену в строках таб. части;
- если в строке таб части цена не заполнена, то выделять фон ячейки «Цена» розовым.
&НаСервере Процедура пр_ДобавитьУОТаблицыФормы() //условное оформление формы //если реквизит Использование = Истина, то разрешать изменять цену ЭлементОформления = УсловноеОформление.Элементы.Добавить(); // Создаем условие отбора в созданной группе: ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("пр_Использование"); // имя поля ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; // либо задаем свой ЭлементОтбора.ПравоеЗначение = Ложь; ЭлементОтбора.Использование = Истина; // Установка значения элемента УО ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Доступность", Ложь); ЭлементОформления.Использование = Истина; ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветТекста", WebЦвета.КрасноФиолетовый); ЭлементОформления.Использование = Истина; // Создаем поля оформления ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить(); //чтобы выделить ячейку, нужно указать имя соответствующего элемента на форме ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("пр_ТаблицаЗначенийЦена"); ПолеОформления.Использование = Истина; //условное оформление формы //если в строке цена = 0, тогда строку закрашиваем розовым ЭлементОформления = УсловноеОформление.Элементы.Добавить(); // Создаем условие отбора в созданной группе: ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("пр_ТаблицаЗначений.Цена"); // имя поля ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.НеЗаполнено; // либо задаем свой ЭлементОтбора.Использование = Истина; // Установка значения элемента УО ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.Розовый); ЭлементОформления.Использование = Истина; // Создаем поля оформления //чтобы выделить всю строку, нужно добавить все ячейки строки, пока же выделим одну ячейку "Цена" ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить(); ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("пр_ТаблицаЗначенийЦена"); ПолеОформления.Использование = Истина; КонецПроцедуры
В процедуру команды добавим вызов серверной процедуры для заполнения таблицы цен в зависимости от выбранной номенклатуры и характеристики:
&НаКлиенте Процедура пр_Команда1(Команда) пр_Команда1НаСервере(); КонецПроцедуры &НаСервере Процедура пр_Команда1НаСервере() ЭтаФорма["пр_ТаблицаЗначений"].Очистить(); Запрос = Новый Запрос; Запрос.УстановитьПараметр("Номенклатура", ЭтаФорма.пр_Номенклатура); Запрос.УстановитьПараметр("Характеристика", ЭтаФорма.пр_Характеристика); Запрос.Текст = "ВЫБРАТЬ | ЦеныНоменклатурыСрезПоследних.Период КАК Период, | ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура, | ЦеныНоменклатурыСрезПоследних.Характеристика КАК Характеристика, | ЦеныНоменклатурыСрезПоследних.ВидЦены КАК ВидЦены, | ЦеныНоменклатурыСрезПоследних.Цена КАК Цена |ИЗ | РегистрСведений.ЦеныНоменклатуры.СрезПоследних( | , | Номенклатура = &Номенклатура | И Характеристика = &Характеристика) КАК ЦеныНоменклатурыСрезПоследних"; Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл Стр = ЭтаФорма["пр_ТаблицаЗначений"].Добавить(); ЗаполнитьЗначенияСвойств(Стр, Выборка); КонецЦикла; КонецПроцедуры
Добавляем в процедуру ПриСозданииНаСервере процедуры:
&НаСервере Процедура пр_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) //установим заголовок формы ЭтаФорма.Заголовок = "Шаблон для программной работы с реквизитами, командами и элементами формы"; ЭтаФорма.АвтоЗаголовок = Ложь; пр_СоздатьГруппы(); пр_СоздатьНовуюКоманду(); пр_СоздатьДекорацию(); пр_СоздатьРеквизиты(); пр_УдалитьРеквизиты(); пр_ВывестиРеквизитыНаФорму(); пр_СоздатьТаблицуЗначений(); пр_ВывестиТаблицуЗначений(); пр_ДобавитьУОТаблицыФормы(); КонецПроцедуры
Заполняем реквизиты Номенклатура, Характеристика и заполняем цены в таблице значений.
Создание реквизита типа динамический список с заданными настройками и вывод на форму
На странице 3 создадим динамический список с выводом всех цен выбранной номенклатуры и характеристики.
Условное оформление динамического списка 1С программно
Добавим Условное Оформление динамического списка, отбор и сортировку программно.
&НаСервере Процедура пр_СоздатьДинамическийСписок() //создать дин. список с произвольным запросом ТекстЗапроса = "ВЫБРАТЬ | ЦеныНоменклатуры.Период КАК Период, | ЦеныНоменклатуры.Номенклатура КАК Номенклатура, | ЦеныНоменклатуры.Характеристика КАК Характеристика, | ЦеныНоменклатуры.ВидЦены КАК ВидЦены, | ЦеныНоменклатуры.Цена КАК Цена, | ЦеныНоменклатуры.Регистратор КАК Регистратор |ИЗ | РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры |ГДЕ | ЦеныНоменклатуры.Номенклатура = &Номенклатура | И ЦеныНоменклатуры.Характеристика = &Характеристика"; МассивДобавляемыхРеквизитов = Новый Массив; //создать реквизит дин. списка МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("пр_ДинамическийСписок", Новый ОписаниеТипов("ДинамическийСписок"),,,ЛОЖЬ)); ИзменитьРеквизиты(МассивДобавляемыхРеквизитов); РеквизитДинамическийСписок = ЭтаФорма["пр_ДинамическийСписок"]; //если запрос не произвольный, тогда используем следующий код: //РеквизитДинамическийСписок.ПроизвольныйЗапрос = Ложь; //РеквизитДинамическийСписок.ОсновнаяТаблица = "РегистрСведений.ЦеныНоменклатуры"; РеквизитДинамическийСписок.ПроизвольныйЗапрос = Истина; РеквизитДинамическийСписок.ОсновнаяТаблица = "РегистрСведений.ЦеныНоменклатуры"; РеквизитДинамическийСписок.ТекстЗапроса = ТекстЗапроса; РеквизитДинамическийСписок.Параметры.УстановитьЗначениеПараметра("Номенклатура", ЭтаФорма["пр_Номенклатура"]); РеквизитДинамическийСписок.Параметры.УстановитьЗначениеПараметра("Характеристика", ЭтаФорма["пр_Характеристика"]); //не будем выводить эту колонку в списке, но нужен к ней доступ всегда РеквизитДинамическийСписок.УстановитьОбязательноеИспользование("Регистратор", Истина); КонецПроцедуры &НаСервере Процедура пр_ДобавитьОтборДинамическийСписок() ЭлементОтбора = ЭтаФорма["пр_ДинамическийСписок"].Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Период"); ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Больше; // больше или меньше и т.п. ЭлементОтбора.Использование = Истина; ЭлементОтбора.ПравоеЗначение = Дата('2015.01.01 00:00:00'); КонецПроцедуры &НаСервере Процедура пр_ДобавитьУОДинамическийСписок() //если цена от 4000 до 5000, то выделять зеленым ЭлементОформления = ЭтаФорма["пр_ДинамическийСписок"].УсловноеОформление.Элементы.Добавить(); //сначала добавим группу И ГруппаОформления = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных")); ГруппаОформления.Использование = Истина; ГруппаОформления.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИ; // Создаем условие отбора в созданной группе: цена > 4000 ЭлементОтбора = ГруппаОформления.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Цена"); // имя поля ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Больше; // либо задаем свой ЭлементОтбора.ПравоеЗначение = 4000; //правым значением может выступать ПолеКомпоновкиДанных формы или списка //ЭлементОтбора.ПравоеЗначение = Новый ПолеКомпоновкиДанных(ИмяПоля); ЭлементОтбора.Использование = Истина; //второй элемент отбора: цена < 5000 ЭлементОтбора = ГруппаОформления.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Цена"); // имя поля ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Меньше; // либо задаем свой ЭлементОтбора.ПравоеЗначение = 5000; ЭлементОтбора.Использование = Истина; // Установка значения элемента УО ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.ЗеленыйЛес); // Возможно обращение как по индексу так и установка через метод //Элемент = ЭлементОформления.Оформление.Элементы[0]; //Элемент.Значение = Цвет; ЭлементОформления.Использование = Истина; // Создаем поля оформления ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить(); //чтобы выделить ячейку, нуджно указать ее имя поля ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("Период"); ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить(); ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("Номенклатура"); ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить(); ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("Характеристика"); ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить(); ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("ВидЦены"); ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить(); ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("Цена"); ПолеОформления.Использование = Истина; КонецПроцедуры &НаСервере Процедура пр_ДобавитьСортировкуДинамическийСписок() ЭлементСортировки = ЭтаФорма["пр_ДинамическийСписок"].Порядок.Элементы.Добавить(Тип("ЭлементПорядкаКомпоновкиДанных")); ЭлементСортировки.Поле = Новый ПолеКомпоновкиДанных("Период"); ЭлементСортировки.ТипУпорядочивания = НаправлениеСортировкиКомпоновкиДанных.Убыв; ЭлементСортировки.Использование = Истина; КонецПроцедуры
Вывести динамический список в элементы управляемой формы 1С
Для вывода дин. списка воспользуемся процедурами, которые использовали при выводе таблицы значений, так как это один тип — ДанныеФормыКоллекция.
&НаСервере Процедура пр_ВывестиДинамическийСписок() пр_ВывестиДинамическийСписокНаФорму(ЭтаФорма, "пр_ДинамическийСписок", Элементы["пр_Страница3"], "Таблица цен"); КонецПроцедуры Процедура пр_ВывестиДинамическийСписокНаФорму(Форма, ИмяТаблицы, Родитель, ЗаголовокТаблицы) Экспорт ТаблицаФормы = Форма.Элементы.Добавить(ИмяТаблицы, Тип("ТаблицаФормы"), Родитель); ТаблицаФормы.ПутьКДанным = ИмяТаблицы; ТаблицаФормы.Заголовок = ЗаголовокТаблицы; ТаблицаФормы.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Верх; СтруктураСвойств = Новый Структура("Вид", ВидПоляФормы.ПолеНадписи); //если нужны какие-то специфические свойства колонки, то нужно их добавить в структуру свойств пр_ДобавитьНовуюКолонку(Форма, ТаблицаФормы, ИмяТаблицы, "Период", СтруктураСвойств); пр_ДобавитьНовуюКолонку(Форма, ТаблицаФормы, ИмяТаблицы, "Номенклатура", СтруктураСвойств); пр_ДобавитьНовуюКолонку(Форма, ТаблицаФормы, ИмяТаблицы, "Характеристика", СтруктураСвойств); пр_ДобавитьНовуюКолонку(Форма, ТаблицаФормы, ИмяТаблицы, "ВидЦены", СтруктураСвойств); пр_ДобавитьНовуюКолонку(Форма, ТаблицаФормы, ИмяТаблицы, "Цена", СтруктураСвойств); КонецПроцедуры
Обновить динамический список 1С программно
Рассмотрим, как обновить параметры динамического списка 1С программно. Если в запросе дин. списка используются параметры, то их необходимо обновлять при изменении соответствующих реквизитов.
&НаСервере Процедура пр_ОбновитьПараметрДинСписков(ИмяЭлемента, ТекСсылка) РеквизитДинамическийСписок = ЭтаФорма["пр_ДинамическийСписок"]; РеквизитДинамическийСписок.Параметры.УстановитьЗначениеПараметра(ИмяЭлемента, ТекСсылка); КонецПроцедуры &НаКлиенте Процедура пр_НоменклатураПриИзменении(Элемент) пр_ОбновитьПараметрДинСписков("Номенклатура", ЭтаФорма["пр_Номенклатура"]); КонецПроцедуры &НаКлиенте Процедура пр_ХарактеристикаПриИзменении(Элемент) пр_ОбновитьПараметрДинСписков("Характеристика", ЭтаФорма["пр_Характеристика"]); КонецПроцедуры
Добавляем в процедуру ПриСозданииНаСервере процедуры:
&НаСервере Процедура пр_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) //установим заголовок формы ЭтаФорма.Заголовок = "Шаблон для программной работы с реквизитами, командами и элементами формы"; ЭтаФорма.АвтоЗаголовок = Ложь; пр_СоздатьГруппы(); пр_СоздатьНовуюКоманду(); пр_СоздатьДекорацию(); пр_СоздатьРеквизиты(); пр_УдалитьРеквизиты(); пр_ВывестиРеквизитыНаФорму(); пр_СоздатьДинамическийСписок(); пр_ДобавитьОтборДинамическийСписок(); пр_ДобавитьСортировкуДинамическийСписок(); пр_ДобавитьУОДинамическийСписок(); пр_ВывестиДинамическийСписок(); КонецПроцедуры
Заполняем реквизиты Номенклатура, Характеристика и заполняем цены в таблице значений.
Содержимое регистра сведений ЦеныНоменклатуры:
Полезные ссылки
1. Типовой механизм упрощенного изменения конфигурации в ERP 2.0 и УТ 11
2. Типовой функционал модификации конфигурации линейки ERP-решений (УТ 11, КА 2 и ERP 2)
3. 1С Управляемые Формы. Программное создание реквизитов , команд, элементов (Часть 1)
Comments
So empty here ... leave a comment!