|   |   | 
| 
 | Оформление строк табличного поля | ☑ | ||
|---|---|---|---|---|
| 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! | 
 
 | Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |