|
Условное оформление программно созданной таблицы значений | ☑ | ||
---|---|---|---|---|
0
belka4_4
09.03.16
✎
19:33
|
Здравствуйте! Снова я
Есть таблица значений, создаётся программно (т.к. список колонок зависит от значений реквизита). В общем случае получить надо что-то такое http://pixs.ru/showimage/Bezimyanni_8933752_21031375.jpg Создаю ТЗ, заполняю её типа как тут: http://catalog.mista.ru/public/191774/ Выкидываю на форму: //переносим таблицу значений на форму ЭтаФорма.ЗначениеВРеквизитФормы(Таб,ИмяТЗ); Теперь на форме таблица с именем "ТабЗН" (через отладчик доступно). В ячейках - ссылки на мероприятие. Надо: 1. убрать возможность заполнения ячеек ручками, кнопку выпадающего списка и открытия и вместо этого добавить своё контекстное меню чтобы можно было обработать. 2. вместо ссылки пользователю показывать только тип мероприятия, а открыть для просмотра можно будет по кнопке контекстного меню 3. для каждого типа свой цвет ячейки. Пытаюсь делать через условное оформление. Вопрос: как подобраться к ячейке чтобы были доступны эти все свойства? В отладчике по Элементы.ТабЗН.ПодчинённыеЭлементы.ТабЗН[ИмяКолонки] доступны кнопки и цвет фона, но цвет фона нужен не для колонки а именно для ячейки. По самой таблице до вывода её на форму делала так: Для Каждого ТекСтрока Из Таб Цикл// в цикле перебираем все строки таблицы значений Для Каждого ТекКолонка Из Таб.Колонки Цикл// перебираем все столбца текущей строки табличцы значений ТекЯчейка = ТекСтрока[ТекКолонка.Имя];// выбираем данные из текущей ячейки КонецЦикла; КонецЦикла; Но тут только значения. С оформлением ничего сделать нельзя. Пока пробовала сделать просто ненужное мне условное оформление хотя бы для строки. Но ничего не выходит. Пробовала так: ........ //переносим таблицу значений на форму ЭтаФорма.ЗначениеВРеквизитФормы(Таб,ИмяТЗ); УсловноеОформление.Элементы.Очистить(); ЭлементОформления = УсловноеОформление.Элементы.Добавить(); // Создаем условие отбора ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ЭтаФорма.ТабЗН[1].Пара"); // имя поля ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; ЭлементОтбора.ПравоеЗначение = Перечисления.Пары.Вторая; ЭлементОтбора.Использование = Истина; // Установка значения элемента УО ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.Кирпичный); Т.е. если пара вторая - строка должна стать кирпичного цвета. Знаю что к полю подбираться как-то так: // Создаем поля оформления ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить(); ПолеОформления.Поле = Новый ПолеКомпоновкиДанных(ПолеДляОформления); ПолеОформления.Использование = Истина; но опять же что в это самое ПолеДляОформления передавать. Как этот цикл по ячейкам организовать? |
|||
1
Cyberhawk
09.03.16
✎
19:41
|
Много букв + несколько вопросов = лень
|
|||
2
belka4_4
09.03.16
✎
19:43
|
(1) Вопрос один. Просто расписала что я вообще делаю.
Если коротко: Есть программно созданная таблица вида http://pixs.ru/showimage/Bezimyanni_8933752_21031375.jpg В ячейках - ссылки на мероприятие. Надо: 1. убрать возможность заполнения ячеек ручками, кнопку выпадающего списка и открытия и вместо этого добавить своё контекстное меню чтобы можно было обработать. 2. вместо ссылки пользователю показывать только тип мероприятия, а открыть для просмотра можно будет по кнопке контекстного меню 3. для каждого типа свой цвет ячейки. Пытаюсь делать через условное оформление. Вопрос: как подобраться к ячейке чтобы были доступны эти все свойства? |
|||
3
Cyberhawk
09.03.16
✎
20:02
|
Я бы делал в виде отчета на СКД...
|
|||
4
kosts
09.03.16
✎
20:28
|
(2) Положи на форму готовую тз.
Количество колонок соответствующее твоей задаче (5, 9, 33 колонки). Создавать динамически колонки не нужно. Меняй заголовки у готовой таблицы. 1. Только просмотр включи. Контекстное меню можно добавить. Но только это нетиповой подход. Тогда уже обрабатывай двойное нажатие для открытия. 2. Условное оформление в форме. 3. Условное оформление в форме. Условное оформление находится в свойствах формы. Вроде так. Т.е. динамически надо всего лишь заполнить готовую ТЗ, и заголовки колонок. Запомнить соответствия колонок и данных. Вся настройка таблицы и условного оформления в конфигураторе. |
|||
5
Ник080808
09.03.16
✎
20:41
|
(3) 100500
|
|||
6
belka4_4
09.03.16
✎
20:43
|
(4)
Количество колонок постоянно меняется. В зависимости от того, за какой промежуток пользователь хочет видеть данные. Кнопку списка и открытия пока убрала так: НовыйЭлемент.Вид = ВидПоляФормы.ПолеНадписи; |
|||
7
belka4_4
09.03.16
✎
20:46
|
(3), (5)
Тоже уже думала про отчёт. Но просто мне надо не только выводить, но ещё и менять чего-нибудь (отменить мероприятие, забронировать). И хотелось бы чтобы вся работа по бронированию была в одном месте - в обработке "Управление аудиторным фондом". Там 3 формы: списка, поиска помещения и вот эта занятости. |
|||
8
kosts
09.03.16
✎
20:52
|
(6) Добавь 40 или 50 колонок. Не обязательно все заполнять, пусть пустые будут. Зато в другом упрощается.
|
|||
9
belka4_4
09.03.16
✎
20:57
|
(8). Максимально пользователь может узнать за 7 месяцев. Многовато "прозапас"(
|
|||
10
kosts
09.03.16
✎
21:09
|
(9) Как раз для системы такое количество тфу.
А вот пользователь наверное доволен будет, когда ему вывалят 200 колонок... |
|||
11
belka4_4
09.03.16
✎
21:10
|
(10)
Ну так я за пользователя и переживаю. |
|||
12
belka4_4
09.03.16
✎
21:11
|
(10)
Да и сидеть на форме руками создавать 200 колонок это тож как-то не правильно. |
|||
13
kosts
09.03.16
✎
21:16
|
В любом случае показывать пользователю одновременно больше 30-35 колонок не нужно.
По этому не пойму зачем делать 200. Или скажи уже, сколько колонок хочешь показать... |
|||
14
belka4_4
09.03.16
✎
21:43
|
(13). Если рассуждать логически, то да - в основном не более 30 колонок. Но раз данные хранятся за пол года, значит если барин хочет всё - пусть видит всё.
А так придётся ограничивать его диапазоном дат. Сейчас ограничиваю датами записей из регистра сведений о занятости. С календарём я не знаю как запретить выбирать даты вне диапазона. Поэтому делаю типа такого: Процедура ДатаНачалаПриИзменении(Элемент) Даты = ОбщиеМеханизмы.ПолучитьДатыИзРС(); Если ДатаНачала < Даты.ДатаСамойРаннейЗаписиВРС Тогда ДатаНачала = Даты.ДатаСамойРаннейЗаписиВРС; КонецЕсли; ЗаполнитьТаблицу(); КонецПроцедуры Аналогично для реквизита ДатаОкончания. Т.е. если дата превышает допустимую - просто допустимая устанавливается. Согласна, способ с ручным созданием наиболее простой для этой задачи. Но хочется же чтоб без ГК((( На то она и автоматизация чтобы не создавать руками пусть даже 30 колонок. Тем более всё равно по ним нужен будет цикл с установкой заголовка. |
|||
15
belka4_4
09.03.16
✎
23:29
|
Вот так прохожу по реквизитам таблицы:
...... //переносим таблицу значений на форму ЭтаФорма.ЗначениеВРеквизитФормы(Таб,ИмяТЗ); ЭлементыФормы = Элементы.ТабЗН.ПодчиненныеЭлементы; Для Каждого ЭлементФормы Из ЭлементыФормы Цикл Если Найти(ЭлементФормы.Имя, "Дата") <> 0 Тогда ЭлементФормы.ЦветФона = WebЦвета.Аквамарин; КонецЕсли; КонецЦикла; В результате все даты окрашиваются в аквамарин. Уже немного ближе к истине. Но как здесь добавить условное оформление? |
|||
16
EvgeniuXP
10.03.16
✎
00:43
|
можешь условное оформление сделать прямо на форме, добавить колонки по выкрашиванию цвета - они скрыты будут, вот и пусть закрашивают. При заполнении ТЗ заполняй еще и числа цветом
|
|||
17
belka4_4
10.03.16
✎
00:58
|
(16). Т.е. тоже поддерживаете идею о создании ТЗ на 30 колонок и последующее её изменение? Чтобы поля стали доступны для отбора.
|
|||
18
Ник080808
10.03.16
✎
17:22
|
(17) Отчет. "Но просто мне надо не только выводить, но ещё и менять чего-нибудь (отменить мероприятие, забронировать). " - делается через расшифровку.
|
|||
19
belka4_4
10.03.16
✎
18:17
|
(18). В курсе про расшифровку. Основной аргумент был:
"И хотелось бы чтобы вся работа по бронированию была в одном месте - в обработке "Управление аудиторным фондом"." Пока борюсь. |
|||
20
belka4_4
10.03.16
✎
18:17
|
Получилось окрашивать пару вот так:
ЭлементОформления = УсловноеОформление.Элементы.Добавить(); ОформляемоеПоле = ЭлементОформления.Поля.Элементы.Добавить(); ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных(ТабЗН_Пара); // Создаем условие отбора ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ТабЗН.Пара); // имя поля ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; ЭлементОтбора.ПравоеЗначение = Перечисления.Пары.Вторая; ЭлементОтбора.Использование = Истина; ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.Кирпичный); ЭлементОформления.Использование = Истина; Вторая пара в таблице окрашивается. Но вот с датами не работает(. Пробую так: ЭлементОформления = УсловноеОформление.Элементы.Добавить(); Дата = ДатаНачала; Пока Дата <= ДатаОкончания Цикл ЭлементОформления.Поля.Элементы.Очистить(); ОформляемоеПоле = ЭлементОформления.Поля.Элементы.Добавить(); ИмяКолонки = "ТабЗН_Дата" + Формат(Дата, "ДФ=dd_MM"); ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных(ИмяКолонки); // Создаем условие отбора ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ЛевоеЗначение = "ТабЗН.Дата" + Формат(Дата, "ДФ=dd_MM") + ".ТипМероприятия";//Получили например ТабЗН.Дата07_03.ТипМероприятия ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ЛевоеЗначение); ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; ЭлементОтбора.ПравоеЗначение = Перечисления.ТипыМероприятий.Лекция; ЭлементОтбора.Использование = Истина; ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.Кирпичный); //ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Текст", НСтр("ru = 'вторая'")); ЭлементОформления.Использование = Истина; Дата = Дата + 24*3600; КонецЦикла; Не окрашивается вообще Пробовала ещё так: ЭлементОформления = УсловноеОформление.Элементы.Добавить(); Дата = ДатаНачала; Пока Дата <= ДатаОкончания Цикл ИмяКолонки = "ТабЗН_Дата" + Формат(Дата, "ДФ=dd_MM"); ЭлементОформления.Поля.Элементы.Очистить(); ОформляемоеПоле = ЭлементОформления.Поля.Элементы.Добавить(); ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных(ИмяКолонки); // Создаем условие отбора ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ЛевоеЗначение = "ТабЗН.Дата" + Формат(Дата, "ДФ=dd_MM"); ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ЛевоеЗначение); // имя поля ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; ЭлементОтбора.ПравоеЗначение = Справочники.Мероприятия.НайтиПоКоду(000000008); ЭлементОтбора.Использование = Истина; ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.Кирпичный); //ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Текст", НСтр("ru = 'вторая'")); ЭлементОформления.Использование = Истина; Дата = Дата + 24*3600; КонецЦикла; В этом случае получаем вот что: http://pixs.ru/showimage/1jpg_6974496_21043506.jpg На форме создала таблицу ТЗ для испытаний. Так там при установке условия отбора колонка Дата с типом СправочникСсылка.Мероприятия не имеет никаких данных о себе по ссылке и максимум можно установить так: ТЗ.Дата Равно Справочник.Мероприятия.ПустаяСсылка Получается нельзя обратиться к данным никак? |
|||
21
belka4_4
10.03.16
✎
18:31
|
По поводу контекстного меню и командной панели: максимум смогла добиться отсутствия командной панели и по ПКМ показывает только 3 варианта (Изменить, Копировать, Выделить все)и они не доступны (просто подсвечиваются бледно-серым, но применить их нельзя). Как их убрать так и не нашла. Остальное убрала так:
//Получили таблицу, изменили массив реквизитов и т.д. //Помещаем Элементы на форму Таблица = Элементы.Добавить(ИмяТЗ, Тип("ТаблицаФормы")); Таблица.ПутьКДанным = ИмяТЗ; Таблица.Отображение = ОтображениеТаблицы.Список; // ВОТ ЗДЕСЬ УБИРАЮ НЕНУЖНОЕ Таблица.ПоложениеКоманднойПанели = ПоложениеКоманднойПанелиЭлементаФормы.Нет; Таблица.ТолькоПросмотр = Истина; Таблица.ИзменятьПорядокСтрок = Ложь;//убрали из меню Переместить вверх/вниз Таблица.ИзменятьСоставСтрок = Ложь;//убрали из меню Добавить, Удалить Таблица.КонтекстноеМеню.Доступность = Ложь; // КОНЕЦ ЧИСТКИ Для Каждого Колонка Из Таб.Колонки Цикл НовыйЭлемент = ЭтаФорма.Элементы.Добавить(ИмяТЗ + "_" + Колонка.Имя, Тип("ПолеФормы"), Таблица); НовыйЭлемент.Вид = ВидПоляФормы.ПолеНадписи; НовыйЭлемент.ПутьКДанным = ИмяТЗ + "." + Колонка.Имя; // тут ещё ширину колонок устанавливаю КонецЦикла; //переносим таблицу значений на форму ЭтаФорма.ЗначениеВРеквизитФормы(Таб,ИмяТЗ); Для своих задач создала отдельно непривязанную к таблице командную панель средствами конфигуратора. Текущую выделенную ячейку считываю так: Строка = Элементы.ТабЗН.ТекущаяСтрока; Колонка = СтрЗаменить(Элементы.ТабЗН.ТекущийЭлемент.Имя, "ТабЗН_", ""); Мероприятие = ЭтаФорма.ТабЗН[Строка][Колонка]; +дополнительно обрабатываю чтобы выделенное пользователем было заполненное значение типа СправочникСсылка.Мероприятие, а не пара или пустое, например. Может, кому пригодится) |
|||
22
belka4_4
10.03.16
✎
18:31
|
Вопрос с условным оформлением остаётся открытым, к сожалению(
|
|||
23
Ник080808
10.03.16
✎
18:43
|
(19) ну так выводите в обработке в табличный документ. Кто мешает то?
|
|||
24
Ma3eIIa
10.03.16
✎
18:45
|
(0) если ты выводишь только. да и вообще кури СКД.
|
|||
25
Ник080808
10.03.16
✎
18:46
|
(22) "ЭлементОформления = УсловноеОформление.Элементы.Добавить();
Дата = ДатаНачала; Пока Дата <= ДатаОкончания Цикл ЭлементОформления.Поля.Элементы.Очистить(); " - может очищать перед циклом?) |
|||
26
Ma3eIIa
10.03.16
✎
18:46
|
||||
27
Ma3eIIa
10.03.16
✎
18:51
|
можно и такое. но думаю не сможешь. еще пока рано.
http://catalog.mista.ru/public/100480/ хотя вот бонус нарыл http://servicebook.pro/market-place/gant-1c-diagramma-ganta-s-parallelnym-otobrazheniem-dannyh-po-zadacham-i-grafika-v-1s-8-1-i-8-2/ |
|||
28
belka4_4
10.03.16
✎
19:10
|
(25)
Тогда зло распространяется на все колонки. http://pixs.ru/showimage/2jpg_9122631_21044175.jpg Поэтому и очищаю, чтоб только для одной колонки окрашивалось |
|||
29
belka4_4
10.03.16
✎
19:13
|
(26), (27). Спасибо, почитаю. Но да, с диаграммой Ганта наверное рановато мне=(
|
|||
30
Ник080808
10.03.16
✎
20:16
|
(28) тогда непонятно что не так
|
|||
31
belka4_4
10.03.16
✎
20:21
|
(30)
Видимо нельзя как по ссылке обратиться. Сейчас делаю так. Помимо мероприятия получаю ещё к какому типу оно относится. Т.е. есть колонка типа Дата07_03_2016 и колонка ГруппаМероприятия07_03_2016, значение которой имеет тип Строка. Просто на форме эту колонку не отображаю. И тогда условное оформление пытаюсь сделать так: ЭлементОформления = УсловноеОформление.Элементы.Добавить(); Дата = ДатаНачала; Пока Дата <= ДатаОкончания Цикл ЭлементОформления.Поля.Элементы.Очистить(); ОформляемоеПоле = ЭлементОформления.Поля.Элементы.Добавить(); ИмяКолонки = "ТабЗН_Дата" + Формат(Дата, "ДФ=dd_MM_yyyy"); ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных(ИмяКолонки); // Создаем условие отбора ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ЛевоеЗначение = "ТабЗН.ГруппаМероприятия" + Формат(Дата, "ДФ=dd_MM_yyyy"); ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ЛевоеЗначение); // имя поля ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; ЭлементОтбора.ПравоеЗначение = "Семестровое"; ЭлементОтбора.Использование = Истина; ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.Кирпичный); //ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Текст", НСтр("ru = 'вторая'")); ЭлементОформления.Использование = Истина; Дата = Дата + 24*3600; КонецЦикла; Т.е. Окрасить хочу поле Дата в зависимости от значения соседнего поля Группа. Но вообще ничего не закрашивается((( |
|||
32
Мимохожий Однако
10.03.16
✎
20:23
|
(0)Написала, что делала. Но я так и не понял для чего. Если озвучишь цель обработки, то возможно и решение будет проще.
|
|||
33
belka4_4
10.03.16
✎
20:29
|
(32). Есть РС, который хранит где, что, во сколько и когда проходит. Измерения Дата, Пара, Помещение. Ресурс - Мероприятия (Да, регистр не периодический и есть измерение Дата - так надо).
Т.е. записи вида 07.03.2016 | 09.50-11.20 | 210 | ИИТ Вытягивают из этого регистра данные чтобы получить что-то такое: http://pixs.ru/showimage/Bezimyanni_8933752_21031375.jpg При взаимодействии с таблицей у пользователя должна быть возможность отменить мероприятие, забронировать новое, перенести. Сейчас вопрос стоит в окрашивании ячеек в зависимости от типа мероприятия. ТипМероприятия - реквизит справочника, имеет значение ПеречислениеСсылка. |
|||
34
Ник080808
10.03.16
✎
21:00
|
(33) не ну отчет на скд. И пишется быстрее и работать красивее будет.
|
|||
35
Garykom
гуру
10.03.16
✎
21:16
|
А никто не предложил ТабличныйДокумент на форму засунуть и с ним играться?
|
|||
36
belka4_4
10.03.16
✎
21:20
|
УРААААА!!!!! Поборола. Злосчастная ошибка была. Не в том месте строчка
ЭлементОформления = УсловноеОформление.Элементы.Добавить(); Её нужно на каждом витке цикла добавлять Дата = ДатаНачала; Пока Дата <= ДатаОкончания Цикл ЭлементОформления = УсловноеОформление.Элементы.Добавить(); ЭлементОформления.Поля.Элементы.Очистить(); ОформляемоеПоле = ЭлементОформления.Поля.Элементы.Добавить(); ИмяКолонки = "ТабЗН_Дата" + Формат(Дата, "ДФ=dd_MM_yyyy"); ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных(ИмяКолонки); //Создаем условие отбора ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ЛевоеЗначение = "ТабЗН.ГруппаМероприятия" + Формат(Дата, "ДФ=dd_MM_yyyy"); ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ЛевоеЗначение); // имя поля ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; ЭлементОтбора.ПравоеЗначение = Перечисления.ТипыМероприятий.Конференция; ЭлементОтбора.Использование = Истина; ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.Аквамарин); //ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Текст", НСтр("ru = 'вторая'")); ЭлементОформления.Использование = Истина; Дата = Дата + 24*3600; КонецЦикла; Вот только таких циклов надо столько, сколько типов мероприятий. Вот это поворот. не проблема, конечно накопипастить, но это странно |
|||
37
Garykom
гуру
10.03.16
✎
21:21
|
(35)+ свое контекстное меню сделать если нуна ))
|
|||
38
Garykom
гуру
10.03.16
✎
22:06
|
(36) замечание: нежелательно использовать в качестве имен переменных служебные слова языка программирования, например "Дата"
|
|||
39
belka4_4
10.03.16
✎
22:07
|
(35), (37) Предлагали выше. Но уже вроде как получилось с таблицей)
Проблема с менюшкой правда осталась( Не критично, но если ни к чему не приду, то, наверное, придётся к табдоку обратиться. (38). Вы про итератор в цикле? |
|||
40
Garykom
гуру
10.03.16
✎
22:13
|
(39) в 1С есть функция "Дата()", поэтому использовать переменную с таким же именем нежелательно.
|
|||
41
belka4_4
10.03.16
✎
22:19
|
(40). Да, знаю про функцию. Но решила, что раз такой служебной именно переменной нет, то можно юзать.
Учту, спасибо) |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |