В данной статье описаны примеры программного создания объектов управляемой формы 1С — таблицы значений и динамического списка, и их программный вывод в элементы формы
Введение в управляемые формы 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)


Все комментарии
Чтобы оставить комментарий, необходимо войти или зарегистрироваться.
Пока нет комментариев. Будьте первым!