Имя: Пароль:
1C
1С v8
Условное оформление программно созданной таблицы значений
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). Да, знаю про функцию. Но решила, что раз такой служебной именно переменной нет, то можно юзать.
Учту, спасибо)
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший