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