|
Оформление строк табличного поля | ☑ | ||
---|---|---|---|---|
0
KindLion
14.08.12
✎
12:32
|
Доброго дня!
В табличном поле документа мне необходимо менять оформление строки, сравнивая данные текущей и предыдущей строк. Алгоритм, который написал - несовершенен, т.к. начинает глючить после редактирования любой ячейки, или при удалении любой строки. Собственно, сам код: Перем мПредНоменклатура; Перем мПредХарактеристика; Перем мПредЦвет; Процедура ТЧ_ПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки) Если (ДанныеСтроки.Номенклатура <> мПредНоменклатура) Или (ДанныеСтроки.ХарактеристикаНоменклатуры <> мПредХарактеристика) Тогда Если мПредЦвет = WebЦвета.Белый Тогда мЦвет = WebЦвета.ЗамшаСветлый; Иначе мЦвет = WebЦвета.Белый; КонецЕсли; мПредЦвет = мЦвет; Иначе мЦвет = мПредЦвет; КонецЕсли; мПредНоменклатура = ДанныеСтроки.Номенклатура; мПредХарактеристика = ДанныеСтроки.ХарактеристикаНоменклатуры; ОформлениеСтроки.ЦветФона = мЦвет; КонецПроцедуры мПредНоменклатура = Справочники.Номенклатура.ПустаяСсылка(); мПредХарактеристика = Справочники.ХарактеристикиНоменклатуры.ПустаяСсылка(); мПредЦвет = WebЦвета.ЗамшаСветлый; ============================== Как этот код нужно доработать? |
|||
1
KindLion
14.08.12
✎
12:43
|
Ап?
|
|||
2
Kashemir
14.08.12
✎
12:46
|
Пользуй событие ПриПолученииДанных
|
|||
3
Mort
14.08.12
✎
12:48
|
(0)(2) Не взлетит.
Нет, оформлять нужно в этих процедурах, а вот считать параметры оформления нужно уже на других событиях ТЧ. |
|||
4
Mort
14.08.12
✎
12:50
|
Ещё ТП имеет отличное событие на изменение порядка строк. А именно никакое.
|
|||
5
KindLion
14.08.12
✎
12:51
|
(2)
Да, я видел это событие. Но вот чего не соображу - ОформленияСтрок - коллекция только для видимой части ТЧ, а для того, чтобы оформить [0] строку этой коллекции, мне надо заглянуть на одну строчку вверх от горизонта. :) |
|||
6
KindLion
14.08.12
✎
12:52
|
(4) Перетаскивание строк я запретил - тут проблемы не будет.
Но вот удаление строки... это возможно - оно ведь тоже меняет состав строк.... :( |
|||
7
Mort
14.08.12
✎
12:55
|
1. Делаешь соответствие строкаТЧ - реквизиты оформления.
2. При удалении/окончании редактирования обновляешь это соотвествие. 3. При получении данных читаешь оформление для своих строк из соответствия. .. Profit! |
|||
8
pessok
14.08.12
✎
12:56
|
данные надо сравнивать все же не по табличному полю, а по табличной части. ключом у тебя будет НомерСтроки. Т.е. ты берешь
ТЧ[ОформлениеСтроки.Ячейки.НомерСтроки-1] = ТЧ[ОформлениеСтроки.Ячейки.НомерСтроки-2] Как-то так. Только не забудь про условия на 0 там и прочее |
|||
9
pessok
14.08.12
✎
12:57
|
(7) так будет дольше, наверное
|
|||
10
KindLion
14.08.12
✎
12:59
|
(8) Рассматривал я этот вариант.
Только СтрокаТЧ ничего не знает об оформлении стрки в таб.поле. А писать в ТЧ что-то про оформление - путь легкий, но моветонистый, имхо. |
|||
11
KindLion
14.08.12
✎
13:01
|
(7) вот это я тоже рассматривал.
Муторно слегка, но, в принципе, взлететь должно |
|||
12
Mort
14.08.12
✎
13:02
|
(9) Тут не совсем понятно в задаче, достаточно ли одной предыдущей строки для однозначного вычисления оформления. Если да, то вариант в (8), конечно лучше.
|
|||
13
Mort
14.08.12
✎
13:04
|
+(12) Вообще судя по (0) недостаточно.
|
|||
14
pessok
14.08.12
✎
13:06
|
(10) т.е. тебе надо сравнивать не сами данные из двух строк, а еще и их оформление?
|
|||
15
KindLion
14.08.12
✎
13:08
|
(13) Для оформления текущей строки необходимо и достаточно знать:
1. Данные предыдущей строки 2. Оформление предыдущей строки Ну или понимания того, что текущая строка - первая в табличном поле, и тогда оформлять ее данными по умолчанию |
|||
16
Kashemir
14.08.12
✎
13:13
|
(15)
Процедура ТабличноеПоле1ПриПолученииДанных(Элемент, ОформленияСтрок) Для каждого ОформленияСтроки из ОформленияСтрок Цикл ИндексСтрокиВТЗИсточнике = ТЗИсточник.Индекс(ОформленияСтроки.ДанныеСтроки); КонецЦикла; КонецПроцедуры Оформлением можно оперировать лишь в пределах текущих видимых строк. Отсюда опираться на оформление предыдущей строки для первой выводимой невозможно. |
|||
17
pessok
14.08.12
✎
13:15
|
(15)
1. Данные предыдущей строки 2. Оформление предыдущей строки 2 строится не из 1? |
|||
18
Mort
14.08.12
✎
13:15
|
Вообще есть функция получения текущего оформления для строки, но юзать её здесь небезопасно.
|
|||
19
pessok
14.08.12
✎
13:16
|
+(15) ну как вариант, можно при изменении тч создавать ее копию, в нее добавлять колонки, в которых хранить условия оформления строк, а уже при выводе строки делать как в (8) или (16), но уже по отношению к новой ТЗ
|
|||
20
KindLion
14.08.12
✎
13:17
|
(16) вот об этом я и писал в (5)
(17) - нет, 2 строится не из 1, а из 1 и 2 для вышележащей строки |
|||
21
Kashemir
14.08.12
✎
13:18
|
(20) Ну так это невозможно в принципе - оформление существует только для видимых строк
|
|||
22
KindLion
14.08.12
✎
13:19
|
(19) - да, я тоже склоняюсь к этому варианту.
И, каждый раз переписывать эту копию после окончания редактирования и после удаления. Муторно, но если все сделать аккуратно, то должно сработать. Спасибо! |
|||
23
pessok
14.08.12
✎
13:19
|
(20) подумай в адрес (19). в твоем случае, это, наверное, единственный приемлемый вариант.
"2 строится не из 1, а из 1 и 2 для вышележащей строки" рассказывать тебе про рекурсию ведь не надо? |
|||
24
pessok
14.08.12
✎
13:20
|
(22) можно так, или поизголятся таки с рекурсией. может даже красивше получится, но не факт, что быстрее
|
|||
25
Kashemir
14.08.12
✎
13:31
|
Перем КэшОформления;
Процедура ОбновитьКэшОформления() // при любом изменения данных формы и первом вызове КэшОформления = Новый Соответствие; КэшОформления.Очистить(); мПредНоменклатура = Неопределено; мПредХарактеристика = Неопределено; мЦвет = WebЦвета.ЗамшаСветлый; Для каждого Стр из ТЧ Цикл мЦвет= ?( мПредНоменклатура = Стр.Номенклатура И мПредХарактеристика = Стр.Характеристика ,мЦвет, ?(мЦвет=WebЦвета.ЗамшаСветлый,WebЦвета.Белый,WebЦвета.ЗамшаСветлый)); КэшОформления.Вставить(ТЧ.Индекс(Стр), мПредЦвет); мПредНоменклатура = Стр.Номенклатура; мПредХарактеристика = Стр.Характеристика; КонецЦикла; КонецПроцедуры Процедура ТабличноеПоле1ПриПолученииДанных(Элемент, ОформленияСтрок) Для каждого ОформленияСтроки из ОформленияСтрок Цикл ОформлениеСтроки.ЦветФона = КэшОформления[ТЧ.Индекс(ОформленияСтроки.ДанныеСтроки)]; КонецЦикла; КонецПроцедуры КэшОформления = Новый Соответствие; |
|||
26
hhhh
14.08.12
✎
13:51
|
(25) не взлетит. Те строки, которые не участвуют в ПриПолученииДанных останутся старых цветов.
|
|||
27
hhhh
14.08.12
✎
13:58
|
(0) Автор - Петросян, ветку в юмор.
ТабличноеПоле (TableBox) ЧередованиеЦветовСтрок (UseAlternationRowColor) Использование: Чтение и запись. Описание: Тип: Булево. Содержит признак чередования цветов строк. Истина - цвета чередуются. Доступность: Толстый клиент. См. также: ТабличноеПоле, свойство ЦветФонаЧередованияСтрок |
|||
28
pessok
14.08.12
✎
14:02
|
(27) так там речь шла не о чередовании, а об условиях различных... или он нас всех наобманул?)
|
|||
29
Kashemir
14.08.12
✎
14:10
|
(26) С чего вдруг ? Данные кэша обновляются при изменениях ТЧ
|
|||
30
KindLion
14.08.12
✎
14:12
|
(27) тебя бы в юмор, как читать не умеющего.
Мне надо не через строку, а по условию |
|||
31
Kashemir
14.08.12
✎
14:12
|
(28) Ну да. У автора цвет должен меняться только изменении в сочетании номенклатура+характеристика
|
|||
32
Kashemir
14.08.12
✎
14:15
|
Вобщем этот код проверил - работает без проблем
Перем КэшОформления; Процедура ОбновитьКэшОформления() // при любом изменения данных формы и первом вызове КэшОформления = Новый Соответствие; КэшОформления.Очистить(); мПредНоменклатура = Неопределено; мПредХарактеристика = Неопределено; мЦвет = WebЦвета.ЗамшаСветлый; Для каждого Стр из ТЧ Цикл мЦвет= ?( мПредНоменклатура = Стр.Номенклатура И мПредХарактеристика = Стр.Характеристика ,мЦвет, ?(мЦвет=WebЦвета.ЗамшаСветлый,WebЦвета.Белый,WebЦвета.ЗамшаСветлый)); КэшОформления.Вставить(ТЧ.Индекс(Стр), мЦвет); мПредНоменклатура = Стр.Номенклатура; мПредХарактеристика = Стр.Характеристика; КонецЦикла; КонецПроцедуры Процедура ТабличноеПоле1ПриПолученииДанных(Элемент, ОформленияСтрок) ОбновитьКэшОформления(); Для каждого ОформлениеСтроки из ОформленияСтрок Цикл ОформлениеСтроки.ЦветФона = КэшОформления[ТЧ.Индекс(ОформлениеСтроки.ДанныеСтроки)]; КонецЦикла; КонецПроцедуры КэшОформления = Новый Соответствие; Только желательно ОбновлениеКэша() всунуть под события фактического изменении ТЧ - в текущем виде напостой будет пересчитывать - лишняя нагрузка |
|||
33
KindLion
14.08.12
✎
14:20
|
(32) Спасибо, сей попробую.
|
|||
34
KindLion
14.08.12
✎
14:32
|
(32) !!! Все летает без проблем!
Спасибо тебе огромное, Kashemir! |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |