helpf.pro
Регистрация
 +3 
Распечатать

Форма ~ Программное создание таблицы значений с условным оформлением

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

Итак для начала нам надо добавить реквизиты в форму. Для этого у нас есть метод: ИзменитьРеквизиты(). Перед тем как его использовать мы сформируем массив добавляемых реквизитов, который будет называться МассивДобавляемыхРеквизитов.
Код 1C v 8.2 УП
 МассивДобавляемыхРеквизитов = Новый Массив; 
МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("План", Новый ОписаниеТипов("ТаблицаЗначений")));

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

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

После изменения реквизитов у нас уже есть нужный нам реквизит формы «План» типа ТаблицаЗначений с тремя колонками. Если вам надо будет обратиться к значению реквизита, то вы можете это сделать используя ЭтаФорма["План"]. Можно приступать к созданию элементов формы, для отображения данных. Сначала создадим элемент формы типа ТаблицаФормы.
Код 1C v 8.2 УП
 ТаблицаФормы = Элементы.Добавить("План", Тип("ТаблицаФормы"));
ТаблицаФормы.ПутьКДанным = "План";
ТаблицаФормы.ПоложениеКоманднойПанели = ПоложениеКоманднойПанелиЭлементаФормы.Нет;
ТаблицаФормы.ФиксацияСлева = 3;
ТаблицаФормы.УстановитьДействие("ПередУдалением", "ПланПередУдалением");
ТаблицаФормы.УстановитьДействие("ПередНачаломДобавления", "ПланПередНачаломДобавления");

Как вы видите из приведенного когда, во время создания элемента мы тут же определяем действия на события. После создания элемента План типа ТаблицаФормы создадим подчиненные ему элементы типа ПолеФормы, которые будут отвечать у нас за вывод данных в колонки таблицы. Для этого в цикле перебора колонок таблицы необходимо выполнить следующий код (на примере одной из итераций цикла):
Код 1C v 8.2 УП
 НоваяКолонка = Элементы.Добавить("ПланНоменклатура", Тип("ПолеФормы"), Элементы.План); 
НоваяКолонка.Заголовок = "Номенклатура";
НоваяКолонка.ПутьКДанным = "План.Номенклатура";
НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода;
НоваяКолонка.РежимРедактирования = РежимРедактированияКолонки.ВходПриВводе;

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

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

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

Внешняя обработка, демонстрирующая создание таблицы значений программно - Скачивать файлы может только зарегистрированный пользователь!
Андрей Данилюк
Разместил:   Версии: | 8.x | 8.2 УП |  Дата:   Прочитано: 31686
 +3 
Распечатать
Возможно, вас также заинтересует
10060 (0x0000274C): Попытка установить соединение была безуспешной 0
Установили новый терминальный сервер, на нем подняли 1С, терминальные пользователе неописуемо довольны, все просто летает :) И вот же надо было такому случиться, главному бухгалтеру не понравилось работать через...
1C и Google Maps 12
была поставлена задача отображения на географической карте медицинских учреждений. После обзора предлагаемых решений был выбран сервис google. Но так же подобного рода подход будет работать и с картами сервиса yandex. Во...
1C медленно работает по сети с базой на SQL Server 8
Данное обстоятельство может быть обусловлено многими причинами. Одна из них - неоптимальная настройка MS SQL . Перечислим неоптимальности в настройке: 1) Неправильно указанный сетевой протокол, используемый для...
1C: Enterprise Development Tools 35
И вот случилось долгожданное: Вышел 1C: Enterprise Development Tools - это среда для разработки конфигурации в IDE Eclipse. С сайта 1С: « 1C:Enterprise Development Tools » – это инструмент нового поколения для разработчиков бизнес-приложений систем
1С Предприятие что это? 6
Что такое 1С? 1С — это фирма , у которой одно из направлений деятельности — разработка программного обеспечения для автоматизации бизнес-процессов предприятий. « 1С:Предприятие » - конкретный продукт, который...
Посмотреть все результаты поиска похожих
Комментарии
pessok
29.01.2013 12:29Комментарий: 6
pessok
+ к моему посту:
вообще ничего не происходит условного оформления, хотя в отладчике, вроде бы, все верно
pessok
29.01.2013 11:44Комментарий: 5
pessok
Присоединяюсь к вопросу serggo. Есть реквизит формы (таблица значений). На его основании динамически создается таблица формы.

Код 1C v 8.2 УП
 
&НаСервере
Процедура ЗаполнитьТабЧастьНаФорме()

//Удалим таблицу на форме, если она была создана
Если Элементы.Найти("ТаблицаЗаполнения") <> Неопределено Тогда
Элементы.Удалить(Элементы.ТаблицаЗаполнения);
КонецЕсли;

СодержимоеТаблицы = ПодготовитьТаблицу();

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

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

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

ТаблицаЗаполнения.Загрузить(СодержимоеТаблицы);

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


Теперь цель: менять УО динамически при нажатии на кнопку:

Код 1C v 8.2 УП
 
&НаКлиенте
Процедура УстановитьЦвет(Команда)

СтрокиТаблицыСПризнаком = СоответствиеКомандПризнакам.НайтиСтроки(Новый Структура("ИмяКоманды", Команда.Имя));

Если СтрокиТаблицыСПризнаком.Количество() = 1 Тогда

ПризнакСовершенности = СтрокиТаблицыСПризнаком[0].Признак;
ЦветЯчейки = СтрокиТаблицыСПризнаком[0].Цвет;

Иначе

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

Если СтрокиЦветов.Количество() > 0 Тогда
Для Каждого ЭлМассива Из СтрокиЦветов Цикл

ДанныеПоЦветам.Удалить(ЭлМассива);

КонецЦикла;
КонецЕсли;

НовСтр = ДанныеПоЦветам.Добавить();
НовСтр.СтрокаТаблицы = ЭлТабЗаполн.ТекущаяСтрока;
НовСтр.КолонкаТаблицы = ЭлТабЗаполн.ТекущийЭлемент.Имя;
НовСтр.Цвет = ЦветЯчейки;

УстановитьУсловноеОформление();
Элементы.ТаблицаЗаполнения.Обновить();
ЭтаФорма.ОбновитьОтображениеДанных();
КонецПроцедуры


Сама установка условного оформления: отбор ставим на номер строки.

Код 1C v 8.2 УП
 
УсловноеОформление.Элементы.Очистить();

Для Каждого СтрокаЦветов Из ДанныеПоЦветам Цикл

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

ОформляемоеПоле = ЭлементУсловногоОформления.Поля.Элементы.Добавить();
ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("ТаблицаЗаполнения"+СтрокаЦветов.КолонкаТаблицы);

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

ЭлементУсловногоОформления.Оформление.УстановитьЗначениеПараметра("ЦветФона", СтрокаЦветов.Цвет);

КонецЦикла;


Чтобы было понятнее - это некий табель, в который оператор расставляет цвета.

ЧЯДНТ? *01
Rudzfeld
23.03.2012 05:21Комментарий: 4
Rudzfeld
А есть обработка, в которой на форме присутствуют две кнопки "Добавить колонку" и "Удалить колонку"? Т. е. сколько хочу, столько и добавляю/удаляю колонок. На форме уже имеется таблица с несколькими колонками (имеется ввиду, чтобы не добавлять все заново таблицу на форму).
Alenak87
15.02.2012 17:19Комментарий: 3
Alenak87
помогите создать Н табличных частей...с названием СеместровыйМодуль1...СеместровыйМодуль2...итд...СеместровыйМодульН. параметр Н может иметь разные значение...1,2,3,4...и др
E_Migachev
16.01.2012 10:49Комментарий: 2
E_Migachev
serggo, после изменения нужно по новой применять условное оформление
serggo
15.01.2012 15:57Комментарий: 1
serggo
В примере в качестве данных указана программно-создаваемая таблица формы (План). Как быть в случае, если таблица уже есть, а программно только редактируется (создаются строки, колонки и тд). У меня получается, что условное оформление один раз устанавливается по условию, а при редактировании поля с условием - УО не меняется : ( Как можно сделать чтобы всё работало? )
Код 1C v 8.2 УП
 
// Подготавливаем массив реквизитов
МассивРеквизитов = Новый Массив;

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

// Создаём реквизиты
ИзменитьРеквизиты(МассивРеквизитов);

// Создаём элементы формы
ТаблицаПолейВыбора = Элементы.Добавить("МояТаблица", Тип("ТаблицаФормы"),Элементы.ГруппаПотребности);
ТаблицаПолейВыбора.ПутьКДанным = "Объект.Потр";
ТаблицаПолейВыбора.Отображение = ОтображениеТаблицы.Список;

Для Каждого Колонка Из ТЗ.Колонки Цикл
НовыйЭлемент = Элементы.Добавить("Дерево_" + Колонка.Имя, Тип("ПолеФормы"), ТаблицаПолейВыбора);
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
НовыйЭлемент.ПутьКДанным = "Объект.Потр." + Колонка.Имя;
НовыйЭлемент.Заголовок = Колонка.Заголовок;
НовыйЭлемент.РежимРедактирования = РежимРедактированияКолонки.ВходПриВводе;
КонецЦикла;
// УСЛОВНОЕ ОФОРМЛЕНИЕ СТРОК

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


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