Имя: Пароль:
1C
1С v8
Чередование цветных строк в табличном поле.
0 Быдлокодер 80 lvl
 
24.08.11
11:51
Добрый день!
Есть табличное поле:
Контрагент    Колонка 1  Колонка N
Контрагент 1  Данные     Данные    <====цвет синий
Контрагент 1  Данные     Данные    <====цвет синий
Контрагент 2  Данные     Данные    <====цвет белый
Контрагент 3  Данные     Данные    <====цвет синий

Хочу сделать подобное выделение строк цветом, чтобы одинаковые контрагенты были отмечены одним цветом (одинаковые контрагенты в таблице всегда находятся рядом друг с другом). Алгоритм прост - при выводе строки, если предыдущая строка содержит такого же контрагента, то и цвет делаем такой же как у него. Но вопрос такой - когда включаем отбор, как мне определить, какая строка предыдущая? Т.е. в результате отбора могут быть показаны строки № 5, 35, 151.
1 Быдлокодер 80 lvl
 
24.08.11
11:52
+ (0) Забыл сказать, платформа 8.1.
2 mikecool
 
24.08.11
11:53
нафига определять предыдущую?
присваивай контрагентам определнный цвет, при выводе - указывай в оформлении
3 Axel2009
 
24.08.11
11:54
(0) и тут бац бац и в этот отбор попадают только клиенты, по которым нужен синий цвет. что делать?
4 Быдлокодер 80 lvl
 
24.08.11
11:54
(2) Ладно, пускай так. А если я присвою им определенный цвет, а потом в результате отбора рядом окажутся 2 разных контрагента с одинаковым цветом?
5 Быдлокодер 80 lvl
 
24.08.11
11:55
(3) Вот я и пытаюсь узнать, что тогда делать :)
6 butterbean
 
24.08.11
11:58
(4) при заполнении таблицы в отдельную колонку запихивай цвет
7 Быдлокодер 80 lvl
 
24.08.11
11:59
(6) См. (4).
8 Axel2009
 
24.08.11
11:59
(7) при получении данных обнуляй переменную, что начал перерисовывать таблицу.
в при выводе строки если переменная = обнулена, тогда присваивай первый цвет и заполняй ее чемнибудь. и далее чередуй.
9 Mort
 
24.08.11
11:59
(4) Если есть хотя бы два контра с одинаковым цветом, всегда можно установить отбор, чтобы они оказались рядом.
10 Axel2009
 
24.08.11
12:00
правда рябить будет шо пипец при прокрутке =)
11 Mort
 
24.08.11
12:01
+(9) А менять цвет не получится, т.к. при получении данных (как и при выводе строки) при прокрутке, напрмер, вызывается только для появившихся строк.
12 Axel2009
 
24.08.11
12:02
(11) при выводе строки для всех строк.
13 Быдлокодер 80 lvl
 
24.08.11
12:04
(10) Что поделаешь, воля заказчика. В 8.2 подсмотрел, только там просто через одну строку синим выделяет.
14 Mort
 
24.08.11
12:04
(12) А проверить?
15 Быдлокодер 80 lvl
 
24.08.11
12:07
Теоретически можно вызвать ТабличноеПоле.ОбновитьСтроки(), тогда можно будет обработать цвета для всех видимых строк, но как-то не нравится мне эта идея...
16 butterbean
 
24.08.11
12:09
(15) это таб часть документа?
17 Быдлокодер 80 lvl
 
24.08.11
12:09
(16) Нет, это табличное поле в обработке. Тип данных - ТЗ.
18 Быдлокодер 80 lvl
 
24.08.11
12:10
(17) Вру, не ТЗ, а табличная часть обработки.
19 Mort
 
24.08.11
12:11
Лучше хорошо узнать что хочет заказчик и предложить нормальное решение. Например сгруппировать по контрагентам в ДЗ.
20 Axel2009
 
24.08.11
12:11
(14) проверил. был не прав
21 Быдлокодер 80 lvl
 
24.08.11
12:12
(19) ДЗ предлагал, хотят таблицу.
22 butterbean
 
24.08.11
12:13
(18) сделай таб поле не привязанное к твоей таб части, заполняй по ней таб часть и сделай свои кнопки отбора, тогда сможешь установке отбора цвета пихать в строки
23 Axel2009
 
24.08.11
12:14
короче 100 баксов
24 ptiz
 
24.08.11
12:16
А что сложного в сравнении данных текущей строки с предыдущей?
Предыдущая получается по ТабЧасть[ИндексТекСтроки - 1]
25 Быдлокодер 80 lvl
 
24.08.11
12:18
(24) Да ничего сложного! Вся суть описана в (4). В результате отбора рядом могут оказаться строки с одинаковым цветом.
26 Быдлокодер 80 lvl
 
24.08.11
12:20
(24) Подождите ка, а индексы перестраиваются после отбора? *ушел проверять*
27 Быдлокодер 80 lvl
 
24.08.11
12:26
+(26) Нет, индексы остаются те же.
28 Arseny
 
24.08.11
12:29
А почему не использовать событие при выводе строки и глобальную переменную формы списка цветПредыдущей?
29 kosts
 
24.08.11
12:30
Сделай массив побольше цветов

В событии при получении данных ищи в соответствии контрагент-Цвет.
Если нашел выводи этот цвет
Если не нашел добавляй в соответствие контрагент-цвет (цвет следующий по таблице.
30 Быдлокодер 80 lvl
 
24.08.11
12:37
(29) Если будет много цветов, то все равно вероятность останется.
Такой вопрос: можно ли как то узнать предыдущую _видимую_ строку, а не предыдущую строку ТЧ?
31 kosts
 
24.08.11
12:38
(30) При установлении отбора очищай соответствие.
На оставшуюся маленькую вероятность забей.
32 Mort
 
24.08.11
12:39
(30) А что это даст. Тут ограничение исключительно теоретическое, т.е. вероятность нахождения цветов рядом всегда >0 и никакими программными извращениями его не обойдешь. А перекрашивать контрагентов каждый раз в новый цвет - это точно не то, что хотел заказчик.
33 Arseny
 
24.08.11
12:40
Событие привыводестроки возникает только для видимых строк! так что делай как я сказал и будет тебе щастье, а массив огранич двумя значениями, тогда будет просто красивое чередование
34 Arseny
 
24.08.11
12:41
Насчет того, что заказчик хотел, чтоб цвет был прицеплен к опрделенному контрагенту вроде никто не говорил
35 Быдлокодер 80 lvl
 
24.08.11
12:42
(33) А если мы покрутим на 1 строку вниз, а потом на одну вверх, то идея с цветом предыдущей не прокатит...
36 Быдлокодер 80 lvl
 
24.08.11
12:45
+(35) Я к тому, что отработает ПриВыводеСтроки для нижней, а потом для верхней, и вероятность установки правильного цвета во втором случае уже будет 50/50.
37 Arseny
 
24.08.11
12:45
А если обработать приполучении данных?
38 Arseny
 
24.08.11
12:46
(36) Я понял
39 Быдлокодер 80 lvl
 
24.08.11
12:47
(37) Только что крутил список, там оно при прокрутке 3 строк один раз отрабатывает.
40 ptiz
 
24.08.11
12:48
При возникновении события "ПриПолученииДанных" (оно срабатывает и при отбор), пробегать ВСЕ строки таб.части, игнорируя не соответствующие отбор (ТабПоле.ПроверитьСтроку()) и назначать им цвета.
Потом обойти ОформленияСтрок и раскрасить.
41 Быдлокодер 80 lvl
 
24.08.11
12:51
(40) Однозначно будет слишком долго все строки обходить, пусть даже и на соответствие условию... (там уже порядка 1500 строк, и будет увеличиваться). Хотя можно в принципе проверить, все равно нет вариантов.
42 kosts
 
24.08.11
12:57
Можно попробовать завязаться на порядок сортировки и снизить вероятность совпадения, а так же сделать таблицу не менее 100 цветов...
43 Arseny
 
24.08.11
13:06
ПриПолученииДанных сделать:
   Построитель = Новый ПостроительОтчета;
   Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(ДокументСписок);
   тз=Построитель.Результат.Выгрузить();
Получишь таблицу с тем, что будет выведено в список, оттуда вытащи контрагентов и назначь каждому свой цвет
Причем это уже с учетом фильтров
44 Arseny
 
24.08.11
13:09
А цвет генеришь рэндомом с проверкой был ли у кого из контрагентов такой цвет
45 Arseny
 
24.08.11
13:10
Самый красивый будет контрагент с цветом фона черным
46 Axel2009
 
24.08.11
13:35
привязывайся к номеру строки тогда раз у тебя это табличная часть.
47 Arseny
 
24.08.11
13:36
В соседних строках могут быть одинаковые контрагенты
48 Axel2009
 
24.08.11
13:38
(47) и что?
49 Arseny
 
24.08.11
14:52
нужно, чтоб они одинакового цвета были
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.