Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
05 окт 2022, 08:12

Цвет фона только что бывшей текущей, строки элемента формы "ТаблицаФормы"

Автор oooo800, 13 мар 2022, 21:44

0 Пользователей и 1 гость просматривают эту тему.

oooo800

Платформа 8.3.19.1467, самописная конфигурация, УФ.
Справочник - "Номенклатура"; форма списка с элементами формы "таблица формы" с реквизитами формы "динамический список" =  "Дерево" и "Список".
Оба реквизиты ссылаются на одну и ту же основную таблицу "Справочник.Номенклатура", соответственно, у "Дерево" - отображение в виде дерева, у "Список" - отображение в виде простого списка.

В "Дерево" отображаются только группы, в "Список" только элементы, которые относятся к группе, на которой фокус на "Дерево" .

В событиях "ПриАктивизацииЯчейкиДерево" и "ПриАктивизацииЯчейкиСписок" при смене текущего элемента с "Дерево" на "Список" устанавливаю
Элементы.Дерево.ТекущаяСтрока = Неопределено;и, соответственно, при смене с "Список" на "Дерево"
Элементы.Список.ТекущаяСтрока = Неопределено;
Это делается для того, чтобы при "гулянии" по обозначенным элементам формы, со строки родителя дерева на строку подчиненную списка и наоборот, отрабатывались события "ПриАктивизацииЯчейкиДерево" и "ПриАктивизацииЯчейкиСписок".

Вопрос вот в чем - как "раскарасить" фон только что бывшей, текущей, строку дерева при переходе на список, и только что бывшей, текущей, строку списка, при переходе на дерево, что-то вроде:
"Дерево" -> "Список"
РаскраситьСтроку(Элементы.Дерево.ТекущаяСтрока);
Элементы.Дерево.ТекущаяСтрока = Неопределено;

"Список" -> "Дерево"
РаскраситьСтроку(Элементы.Список.ТекущаяСтрока);
Элементы.Список.ТекущаяСтрока = Неопределено;

И, потом, при пересмене текущего элемента формы - сменить цвет ранее раскрашенной строки в белый" , то есть: цвет фона строки "Дерева" "Запчасти" изменен, текущий элемент - "Список", текущая его строка "Инжектор", переходим на "Дерево", причем на любую строку - "красится" строка "Инжектор" списка, перекрашивается в белый ранее окрашенная строка "Запчасти".

Так понимаю, вариант один - через условное оформление.
Или есть другие варианты ?

Если с УО, то:

&НаСервере
Функция РаскраситьСтроку(Строка)
?????????
КонецФункции

&НаКлиенте

...
РаскраситьСтроку(Элементы.Список.ТекущаяСтрока);
Элементы.Список.ТекущаяСтрока = Неопределено;
...


Для "восстановления" строки в белый, наверно придется сделать реквизит с запоминанием окрашенной ранее строки.


oooo800

Тестово, для изменения цвета поля "Код" текущей строки элемента формы "Дерево" сделал так:

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
...
УсловноеОформлениеДерево = Дерево.УсловноеОформление;
УсловноеОформлениеДерево.Элементы.Очистить();

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

&НаКлиенте
Процедура ПриАктивизацииЯчейкиДерево(Элемент)

Если ЭтаФорма.ТекущийЭлемент = Элементы.Дерево Тогда
ЭлементОтбораУО = Дерево.УсловноеОформление.Элементы[0].Отбор.Элементы[0];
ЭлементОтбораУО.ПравоеЗначение = Элементы.Дерево.ТекущаяСтрока;

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

Вроде работает.
Только:
-как "красить" корневой узел;
- как восстанавливать снова в белый ?

oooo800

Только:
-как "красить" корневой узел;
- как восстанавливать снова в белый, а сбросить форматирование, причем лучше "сбросить";
- чтобы все аналогично работало и в web интерфейсе - сейчас при установке текущей строки древа в неопределенно, в списке пусто, в "Толстом клиенте" и "Тонком клиенте" - нормально.

Если "перекрашивать" текст в черный, а фон в белый, при перепозиционировании на этой же строк в дереве она выделяется по другому, поэтому, наверное нужен "сброс".

oooo800

Сделал и окрас фона и перекрас в белый (правда при выделении данной строки, на ней другой цвет - надо еще дорабатывать).
Но не работает окрас строки в дереве, если перейти на список, строку подчиненного элемента (в дереве только группы) - это срабатывает (строка в дереве красится), потом вернуться опять на ту же группу в дереве (строка в дереве "обеляется" ), а вот если опять перейти на любой подчиненный элемент этой группы, тут не срабатывает.
Причем, в отладчике проходит через:
ЭлементОтбораУО = Дерево.УсловноеОформление.Элементы[0].Отбор.Элементы[0];
ЭлементОтбораУО.ПравоеЗначение = Элементы.Дерево.ТекущиеДанные.Наименование;

Почему-то не срабатывает условное форматирование.

Ну и пока не понимаю, как при уходе с корня его раскрасить.

nvj84

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

oooo800

Цитата: nvj84 от 15 мар 2022, 04:06Его лучше заменить на нечто такое.
Чем лучше ?

Цитата: nvj84 от 15 мар 2022, 04:06Сама задача если откровенно не понятна (что зачем и для чего).
Первоначально задача была тривиальная - в форме списка справочника (управляемые формы), где есть элементы "ТаблицаФормы" с отображением "Дерево" (только группы) и "Список" только (элементы) , связанные с соответствующими рекувизитами формы "ДинамическийСписок" у которых одна и та же основная таблица справочник "Номенклатура", необходимо скрывать кнопки формы "Изменить", "Скопировать" , "ПометкаУдаления" при пустом списке и/или позиционировании на "корне" дерева, ну и потом их показывать (при обратных условиях).
Но эта задача оказалась ни разу не тривиальной: платформа, по умолчанию делает их недоступными, но не прячет, причем, при этом, например. на "корне" древа, кнопка "Скопировать" остается доступной, пока не отключить "ИзменятьСоставСтрок" .Не понятно, как можно копировать "кореень".
Дальше больше: не срабатывает событие ПриАктивизацииПоля/Ячейки при "гулянии туда-сюда", например с "корня" дерева на один из его подчиненных элементов и обратно.
Также не срабатывает событие ПриНажатии отделного столбца, только если включить ГиперссылкаЯчейки и задействовать ПриВыборе, но этот вариант не приемлим (из-за одинарного нажатия, подчеркнутого текста и не срабатывании на фоне ячейки, то есть не та тексте) .
Чтобы реализовать это пришлось сделать скрытый столбец и "туда-сюда гонять" фокус в него и с него.
Это для возможности отработки событий ПриАктивизацииПоля/Ячейки при "гулянии туда-сюда", например с "корня" дерева на один из его подчиненных элементов и обратно
В принципе сделал, и все работало.
НО !
Такой вариант, @#$#$%$# ...ка,не заработал в Web клиенте, а именно, со крытым столбцом, если в "Толстом" и "Тонком" было позиционирование на строке, например дерева, но фокуса не было видно (он был "на" скрытом столбце) , то в Web клиенте это работало ПО ДРУГОМУ.
Там фокус вместо "ставания" на "скрытый" столбец устанавливался на "Наименование", что ломало всю работу.
Пришлось, при смене дерева на список и наоборот, для элемента, с которого "сошли" делать Элементы.....ТекущаяСтрока = Неопределено.
Но тут возникает необходимость, при сходе с дерева и переходе на список, "понимать", то есть выделять строку дерева = группу, к которой относятся элементы, отображаемые в текущий момент в списке.
Почти реализовал.
Осталось только: как "раскрасить" строку "корня" дерева, как восстановить фон строки дерева, при возврате на него так, чтоб при позиционировании на сстроку, с которой ушли до этого, она выделялась стандарно, а не серым (почему-ьто) и как избавиться от "блимкания" - при сходе с дерева, строка становится белой (Элементы.Дерево.ТекущаяСтрока = Неопределено, потом она красится.

Если предложите лучший вариант реализации такого функционала, готов попробовать реализовать.
И, если есть возможность донести до разработчиков 1С платформы, готов написать, что нужно доработать по дереву/списку (элементам формы "ТаблицаФормы").

Оптимус

Цитата: oooo800 от 13 мар 2022, 21:44только что бывшей, текущей, строку
Объясните, пожалуйста, смысл этой фразы.

oooo800

В дереве, группы:
Запчасти
Узлы
Комплектующие

Сейчас позиционирование в дереве, на строке "Узлы" , фокус на поле "Код", то есть, грубо говоря:
ЭтаФорма.ТекущийЭлемент = Элементы.Дерево;

Элементы.Дерево.ТекущаяСтрока = "Узлы"
Элементы.Дерево.ТекущийЭлемент="ДеревоКод"


В списке открыты, то есть отображены (выведены) элементы, из группы "Узлы:
узел1
узел2
узел3

Исходя из моей последней реализации, Элементы.Список.ТекущаяСтрока = Неопределено.

Переходим на элемент узел2 списка.

Бывшая до этого текущая строка = строка дерева "Узлы".

Ну и наоборот: при переходе со строки "списка" узел2 на дерево, на любую строку, бывшая текущей строка = строка списка "узел2".

oooo800

Ни как, пока, не "разукрасить" строку - корневой узел таблицы формы, связанной с динамическим списком, с отображением "Дерево".

Похожие темы (5)

Рейтинг@Mail.ru Rambler's Top100

Поиск