Назойливое выделение строки списков 8.2

1. serggo 26.03.12 21:16 Сейчас в теме
Столкнулся, как и многие, с темой выделения активной строки в управляемых формах. А именно -- с невозможностью програмным образом на это голубое "чудо" повлиять. Те кто знают - те поймут, для тех кто не знает: при выделении строки таблицы формы (управляемой) платформа 8.2 заливает все ячейки, кроме выделенной (зависит конечно от режима выделения строки, поставите другой и все ячейки зальёт тёмно-синим), нежно-голубым цветом, ноу-хау дизайна блин... Повлиять как-то на эту выделенную строку кроме как
Элементы.ТаблицаФормы.ТекущаяСтрока = Неопределено;

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

Кто сталкивался? Подняли лапы! : ) Давайте придумаем вместе как этого зверя побороть. Возможно, я конечно незнаю, и есть "чудо-решение" в виде 1 строки кода... Но Максим Радченко в своё время на другом форуме писал, что-то в стиле: "проблема известна, не решена, над ней работают".

Есть идеи следующего рода:

1. Найти виндовую библиотеку, которая юзается для отрисовки форм (скорее всего gdi32.dll)
2. Найти методы которые вызываются, и чем вызываются (вызываются скорее всего frames.dll от 1с)
3. Написать какую-нить софтину, которая будет перехватывать запросы к чему-то от 1с при выделении строки и менять режим выделения скажем на полупрозрачный хотя-бы.

Заинтересовал метод SetBkColor библиотеки gdi.dll. По идее от устанавливает фон на отрисованных "квадратах" формы.... но я не уверен, что именно он используется при выделении строки.

Народ, отзовись ))
neo-ti; invertercant; Светлый ум; +3 Ответить
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Поручик 4674 26.03.12 22:59 Сейчас в теме
(1) Это что, сильно жить мешает? Других настоящих проблем нет?
18. Resha 19.11.15 13:36 Сейчас в теме
Поделюсь своей реализацией:

Есть таблица Данные (дерево значений). Добавл в него новую колонку ИдСтроки (число).
При заполнении дерева делаем:
НСтр = ДанныеЭлементы.Добавить();
НСтр.ИдСтроки = НСтр.ПолучитьИдентификатор();

Добавляем на форму два реквизита ТекущаяКолонка (строка) и ИдентификаторТекущейСтроки (число).
Заполняем первый так (заодно и очищаем выделение):
&НаКлиенте
Процедура ДанныеПриАктивизацииЯчейки(Элемент)
	ТекущаяКолонка = Элементы.Данные.ТекущийЭлемент.Имя;
	Элементы.Данные.ВыделенныеСтроки.Очистить();
КонецПроцедуры

И второй:
&НаКлиенте
Процедура ДанныеПриАктивизацииСтроки(Элемент)
	ИдентификаторТекущейСтроки = Элементы.Данные.ТекущаяСтрока;
КонецПроцедуры

В При создании добавляем УФ один общий и по одному элементу для каждой колонки дерева:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

	// Общий элемент УФ для всей строки
	ТекОф = Новый Структура("ЦветФона", Новый Цвет(205, 230, 255));
	ТекПредставление = "Цвет выделенной строки. Общий";
	УсловноеОформление.Элементы.Вставить(2).Представление = ТекПредставление;
	ТекОтбор = Новый Соответствие;
	ТекОтбор.Вставить("Данные.ИдСтроки", 	Новый ПолеКомпоновкиДанных("ИдентификаторТекущейСтроки"));
	УправляемыеФормыКлиентСервер.ИзменитьЭлементУсловногоОформления(УсловноеОформление, ТекОтбор, ТекОф, "Данные", ТекПредставление);
	
	// Отдельное УФ для каждой ячейки
	ТекОф = Новый Структура("ЦветФона, ЦветТекста", Новый Цвет(0, 0, 131), WebЦвета.Белый);
	Для каждого Эл Из Элементы.Данные.ПодчиненныеЭлементы Цикл
		ТекПредставление = "Цвет выделенной ячейки: " + Эл.Имя;
		УсловноеОформление.Элементы.Вставить(3).Представление = ТекПредставление;
		ТекОтбор = Новый Соответствие;
		ТекОтбор.Вставить("ТекущаяКолонка", 	Эл.Имя);
		ТекОтбор.Вставить("Данные.ИдСтроки", 	Новый ПолеКомпоновкиДанных("ИдентификаторТекущейСтроки"));
		УправляемыеФормыКлиентСервер.ИзменитьЭлементУсловногоОформления(УсловноеОформление, ТекОтбор, ТекОф, Эл.Имя, ТекПредставление); // Ищет по представдению и устанавливает значения
	КонецЦикла;
КонецПроцедуры
Показать

Обращаю внимание, что элементы УФ добавляются не в конец, а вставляюся ("Вставить(...)"). Это нужно для того, что бы они не перекрывали раскраску ячеек.

З.Ы. цвета взяты стандартные для 8.2.19.130, упр. формы в обычном приложении, режим совместимости 8.1.
mevgenym; +1 Ответить
19. Vlad_2008 16 22.11.15 04:03 Сейчас в теме
(18) Resha,

Я тоже почти так и делал, у меня была табл/часть документа.
Доп. колонок я не добавлял, т.к. можно было привязаться к номеру строки,
а усл/оформление добавлено сразу в конфигураторе.

Два реквизита (строка, ячейка), два события и оформление для колонок.

Но тогда это был Толстый клиент, а вот тут пару дней назад бился с
"голубым / желтым (8.3) чудом" упр. приложение (тонкий) - вышло не сразу.

Одна таблица - главная и две - зависимые, т.е. в главной выбираем документ,
а зависимые показывают нужную инфу, идет установка параметров дин/списков.

Если делать два серверных вызова - то все работает как-то не очень, то снимет
выделение, то нет.

Когда переделал на один - то стало нормально.

Но одна загвоздка осталась до сих пор - не могу убрать "чудо" при открытии формы.
20. Resha 23.11.15 00:27 Сейчас в теме
(19) Vlad_2008,

Если делать два серверных вызова - то все работает как-то не очень, то снимет
выделение, то нет


Иногда бывает полезно сделать "отложенные действия" Т.е. в ПриАкитивизации сделать все, что надо, и последней строкой повесить обработчик ожидания с задержкой 0.1 или 0.2 сек. Это не сильно заметно для пользователя, но даст платформе перед выполнением обработчика сделать все необходимые обновления списков. (если я вообще правильно понял о чём речь :-) )

Но одна загвоздка осталась до сих пор - не могу убрать "чудо" при открытии формы.


Не очень понял проблему. Может есть скрин? Тоже интересно.
25. sphere 29.08.19 15:35 Сейчас в теме
(1) В версии 8.3.13 устранена проблема исчезновения заданной раскраски фона ячейки при выделении строки (актуально для управляемых форм в управляемом приложении)
3. serggo 27.03.12 14:14 Сейчас в теме
Есть проблема хочется решить и получить опыт. Другие проблемы имеют другое решение.
4. daho 8 27.03.12 17:08 Сейчас в теме
А в вебморде, интерестно, те же кактусы? Там вроде как можно это решить средсвами погибче, чем ковыряние в системных библиотеках тем паче что много чего будет зависеть от версии ОС... так что в управляемом приложении это делать, ИМХО, даже не стоить и рыпаться.. лучше додавить Нуриева чтоб обработчик на смену рабочих областей повесил, это полезней..
5. djmarat2 7 31.10.12 18:03 Сейчас в теме
Я победил так:

Элементы.ТаблицаФормы.ВыделенныеСтроки.Очистить();
vk29; GonziK_KIV; creatermc; ilya4; ivanleb; maksal; zhenianik; chebser; AnderWonder; venvlad; Enyel; Feelthis; Mogidin; alexsh76; Resha; codename-s; Win98; vlad.frost; sh4d0w; kentavr27; vasyS; putdv; perchik_ua; HEKPOH; SergeyD; Vlad_2008; kichigin_al; +27 Ответить
7. Vlad_2008 16 09.02.13 11:06 Сейчас в теме
(5) djmarat2,

Пользоваться можно,

НО

- перестает работать "стандартное" удаление строки и событие "ПередУдалением"
(т.е. делаем руками)

- слетает выделение текущей ячейки (можно поправить через "УсловноеОформление")

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

За победу на "голубым чудом", однозначно плюс!
Feelthis; kentavr27; putdv; Mi4man; Светлый ум; kashun_a_c; +6 Ответить
9. Win98 10.07.14 09:04 Сейчас в теме
(7) Vlad_2008, апну темку.
"Голубое чудо" побеждено, вопрос как подсветить текущую ячейку остался открытым.

Может кто знает?
11. Vlad_2008 16 15.01.15 19:53 Сейчас в теме
(9) Win98,
Опс, давно сюда не заходил ))

Если вопрос с подсветкой тек. ячейки еще интересует,
то могу порыться в своих базах, поискать ... давно было.
6. djmarat2 7 31.10.12 18:08 Сейчас в теме
Это в событии таблицы формы "ПриАктивацииЯчейки"
ilya4; ivanleb; AnderWonder; venvlad; Enyel; orientir1C; +6 Ответить
8. kentavr27 97 10.05.14 23:34 Сейчас в теме
- слетает выделение текущей ячейки (можно поправить через "УсловноеОформление")


Что-то не нашел возможности поправить это через условное оформление...
Может быть подскажете как это сделать? Что с чем сравнить?
Или это поправлять только программно в событии ПриАктивизацииЯчейки ?

Но за способ конечно +
Иногда очень нужно
10. Cyberhawk 135 15.01.15 12:32 Сейчас в теме
А как-нибудь можно переопределить еще и цвет выделения рамкой? Либо вообще убрать рамку.
Прикрепленные файлы:
12. Vlad_2008 16 15.01.15 19:55 Сейчас в теме
(10) Cyberhawk,

С рамкой вроде когда-то тоже извращался, пробовал закрывать
пустой картинкой (она фокус не принимает, ну и нет рамки)
15. Resha 19.11.15 12:16 Сейчас в теме
(12) Vlad_2008,
Поищи пожалуйста (если ещё возможно). У меня не помагает ни (1), ни (5). Релиз 8.2.19.130.
16. antz 19.11.15 12:35 Сейчас в теме
(15) Resha, так, что ли?
Прикрепленные файлы:
СбросВыделения.epf
simich; GetNight; Resha; +3 Ответить
17. Resha 19.11.15 13:11 Сейчас в теме
(12) Vlad_2008, (16) antz,
Прошу прощения, уже сделал. Не обратил внимания, что надо ПриАктивизацииЯчейки, а не строки.
Спасибо
13. max1m1ch 19.01.15 11:16 Сейчас в теме
в веб клиенте никак не удается убрать выделение активной строки
14. mikeA 1 24.01.15 12:10 Сейчас в теме
Как вариант можно менять цвет фона заголовка колонки.
А чтобы вернуть его в значение по умолчанию надо присвоить ему "Новый Цвет".
Выглядит кстати довольно неплохо. Тормозит только)
21. Vlad_2008 16 23.11.15 10:44 Сейчас в теме
Ага, ты правильно понял, я так уже попробовал.
Все-таки изврат, сейчас ищу другой вариант.

Только ожидание я вешал в "ПриОткрытии", однократное, т.к.
потом все срабатывает нормально.

Проблема в том, что при открытии срабатывает "ПриАктивизации...", но выделение не пропадает. Потом перехожу на след. строчку - все ок.

Скрин позже добавлю.
22. Vlad_2008 16 23.11.15 12:33 Сейчас в теме
Вот два нужных списка: Заказы и Товары.



Надо чтоб было так:
- если ходим в списке Заказы, то в списке Товары выделение должно исчезать
- если ходим в списке Товары, то выделение должно быть штатное, как обычно

Если имеем в модуле только процедуру "ПриАктивизацииСтроки" для списка Заказы,
то все работает нормально, кроме момента после открытия формы, в товарах остается подсветка строки.

С обработкой ожидания работает, но сделал по другому:

- добавил процедуру "ПриАкт..Ячейки" для списка Товары
- добавил переменную модуля (клиентская)

В процедуре "ПриАкт..Ячейки" проверяем состояние переменной, если Неопределено, то очищаем выделенные
строки, а переменной присваиваем значение, т.е. сработает только один раз, а больше и не надо )).
23. Aziman 2 14.10.16 11:11 Сейчас в теме
В табличной части есть колонка с ценами, которая в зависимости от условий окрашивает строки этой колонки в разные цвета. Как сделать так, чтобы если щелкнуть по какой-то строке в табличной части, эта строка не закрашивалась в желтый, тем самым перекрашивая мои настройки?
24. Vlad_2008 16 14.10.16 22:53 Сейчас в теме
Самое главное правило при этом, скинуть текущую строку в неопределено для того списка, в котором мы НЕ хотим видеть "чудное" выделение, ес-но, событие при котором это возможно, у нас только одно, "При активизации ячейки" (того поля у которого мы хотим убрать "г" дробь "ж" чудо)

Т.е., если в Вашем случае, пользователь ходит в одном поле, и всю работу с данными он (пользователь) делает, именно в этом поле, то для него (это поле) и надо подключить обработчик для события "ПриАктивизацииЯчейки".

Но, только, надо понимать, что все "стандартные" (= штатные) действия с этим табличным полем "немного" изменятся, а именно, перестанет работать ВСЕ, удаление, копирование и прочее (потери относятся только к тем случаям когда "человек" (пользователь) умеет пользоваться клавиатурой, а мышку, конечно, можно и подменить).

Мне кажется, что я как-то сложно все описал, ммм, если есть вопросы - пишите, тут не давно пытался бороться с "г/ж" чудом - жуть, выложу мои страдания чуть позже.
26. 6есик 52 07.05.20 15:01 Сейчас в теме
Для того что бы подсвечивался только фон выделенной ячейки делаю так :

1. Режим выделения строки -> "Ячейка"
2.

&НаКлиенте
Перем ПрошлаяЯчейка,ПрошлыйФон;

&НаКлиенте
Процедура СписокПриАктивизацииЯчейки(Элемент)
	Если ПрошлаяЯчейка <> Неопределено И ПрошлаяЯчейка.ЦветФона <> ПрошлыйФон Тогда
		ПрошлаяЯчейка.ЦветФона = ПрошлыйФон;
	КонецЕсли;	
	Элементы.Список.ВыделенныеСтроки.Очистить();
	ПрошлаяЯчейка = Элемент.ТекущиеДанные[Элемент.ТекущийЭлемент.Имя+"ОформлениеЯчейки"];
	ПрошлыйФон = ПрошлаяЯчейка.ЦветФона;
	ПрошлаяЯчейка.ЦветФона = Новый Цвет(201,226,255);
КонецПроцедуры
Показать
27. Vlad_2008 16 08.05.20 12:49 Сейчас в теме
(26) Мне кажется что тут можно получить ошибку при Элемент.ТекущиеДанные = Неопределено.

Привычка, что в списке всегда есть строки, но при фильтрации поиском или при отборе может получиться пустой список, и, если отработает событие, то получим "красный крестикк" ))
28. 6есик 52 08.05.20 21:37 Сейчас в теме
Так точно, поправочка :

&НаКлиенте
Перем ПрошлаяЯчейка,ПрошлыйФон;

&НаКлиенте
Процедура СписокПриАктивизацииЯчейки(Элемент)
    Если ПрошлаяЯчейка <> Неопределено И ПрошлаяЯчейка.ЦветФона <> ПрошлыйФон Тогда
        ПрошлаяЯчейка.ЦветФона = ПрошлыйФон;
    КонецЕсли;    
    Элементы.Список.ВыделенныеСтроки.Очистить();
	Если Элемент.ТекущиеДанные <> Неопределено Тогда
		ПрошлаяЯчейка = Элемент.ТекущиеДанные[Элемент.ТекущийЭлемент.Имя+"ОформлениеЯчейки"];
		ПрошлыйФон = ПрошлаяЯчейка.ЦветФона;
		ПрошлаяЯчейка.ЦветФона = Новый Цвет(201,226,255);
	КонецЕсли;
КонецПроцедуры
Показать
29. VadimTer 07.05.21 13:43 Сейчас в теме
Помагает метод, прописанный в событии ПриАктивацииЯчейки для таблицы значений.

&НаКлиенте
Процедура ТаблицаЗначенийПриАктивизацииЯчейки(Элемент)
Элемент.ВыделенныеСтроки.Очистить();
КонецПроцедуры

При необходимости, можно в этом событии создать условие, при котором будет или не будет отменяться выделение строки
30. alexlkt 03.11.23 13:43 Сейчас в теме
(29)Стандартное перетаскивание перестает работать!!!
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот