Имя: Пароль:
1C
1С v8
Оформление строк табличного поля
,
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!
AdBlock убивает бесплатный контент. 1Сергей