Имя: Пароль:
1C
1С v8
Окраска строки табличного поля по условию
0 lia171
 
17.11.12
16:14
Добрый день! Есть задача,в УТ 10.3, в документе "Перемещение товаров" имеется два табличных поля на разных закладках и нужно сравнить позиции номенклатуры, т.е. если во второй ТЧ нет позиции а в первой есть то она окрашивается в красный цвет, а если совпадают позиции то цвет остается неизменным. Позиции сравниваются по наименованию. Попробовал накидать код, вот все что удалось сделать, но ни чего не получается  . я новичек в программировании поэтому прошу помощи!



Процедура ТоварыПриПолученииДанных(Элемент, ОформленияСтрок)
  СтруктураДляПоиска1 = Новый Структура("Номенклатура", ЭлементыФормы.Товары.ТекущаяСтрока.Номенклатура);
  МассивСтрок1 = Товары.НайтиСтроки(СтруктураДляПоиска1);

     
       СтруктураДляПоиска2 = Новый Структура("Номенклатура", Прием.ТекущаяСтрока.Номенклатура);
  МассивСтрок2 = ПриемНаСклад.НайтиСтроки(СтруктураДляПоиска2);



Для каждого СтрокаСписка Из МассивСтрок1 Цикл      
  Если ????    тогда
     СтрокаСписка.ЦветФона = Новый Цвет(155, 155, 155);      
  КонецЕсли;
КонецЦикла;  
КонецПроцедуры
1 GANR
 
17.11.12
16:27
(0) Условное оформление никак не прикрутить?
2 hhhh
 
17.11.12
16:53
ОформленияСтрок же есть. Там и меняйте цвет.
3 lia171
 
17.11.12
16:59
с оформлением понятно, а как правильно сравнить строки табличных полей?
4 EvgeniuXP
 
17.11.12
23:53
(2) не всегда работает, если захочешь в одной строке сравнить между собой колонки и выдать цвет :)
5 Азат
 
18.11.12
00:00
(3) ну типа так:

Процедура ПриВыводеСТроки(бла-бла-бла)
Если ТЧ2.Найти(ДанныеСтроки.Номенклатура, "Номенклатура") = Неопределено Тогда
   ОформлениеСтроки.ЦветФорма = Новый Цвет(255, 0, 0);
Иначе
    Сообщить("А ВОТ НАШЛИ!!!");
КонецЕсли;
КОнецПроцедуры
6 lia171
 
18.11.12
10:27
а если нужно количество сравнить?
7 Азат
 
19.11.12
01:18
(6) я тебе уже все написал, чуток додумать мозгов не хватает? тогда 500 рублей на киви или яд
8 vmv
 
19.11.12
01:43
вот, для каждой сущности(справочник, отчет и т.д. у меня есль справочник, где наборы цветов сохранены в виде Красный,Зклкный,Синий, (например 255,255,255 - это белый)

но набор цветов можно без справочника создать программного в список, а не выбирать из справочника готовое

собственно дальше код из общего модуля для прорисовки фонов, цветов текста и т.д. если есть необходимость, на любителя(предпоследний метод - задает список отбора и элементы условного оформелния, последний метод - инициализирует УО цветовой палитрой)

//----------- Методы типа данных "Цвет"

//
// Add_ComM_ОтчетыКС.ПолучитьАбсолютныйЦвет(ИсходныйЦвет);
//
Функция ПолучитьАбсолютныйЦвет(ИсходныйЦвет) Экспорт
   
   Если ИсходныйЦвет.Вид = ВидЦвета.Абсолютный Тогда
       Возврат ИсходныйЦвет;
   КонецЕсли;
   
   ТабДок = Новый ТабличныйДокумент;
   ТабДок.Область("R1C1").ЦветФона = ИсходныйЦвет;
   ТабДок.Записать("ПреобразованиеЦвета.mxl", ТипФайлаТабличногоДокумента.MXL7);
   ТабДок.Прочитать("ПреобразованиеЦвета.mxl");
   
   АЦвет = ТабДок.Область("R1C1").ЦветФона;
   
   Возврат АЦвет;
   
КонецФункции

//
// Add_ComM_ОтчетыКС.ПолучитьСтроку10АбсолютногоЦвета(АЦвет);
//
Функция ПолучитьСтроку10АбсолютногоЦвета(АЦвет) Экспорт
   
   // Форматная строка составляющей цвета
   ФсСц = "ЧЦ=3; ЧН=; ЧВН=; ЧГ=";
   
   // Допустим, что АЦвет равен (0, 0, 0) или (24, 15, 255). Где составляющие цвета - это числа
   
   RGB10 =
   Формат(АЦвет.Красный, ФсСц) + "," +
   Формат(АЦвет.Зеленый, ФсСц) + "," +
   Формат(АЦвет.Синий  , ФсСц);
   
   // Для примера выше получим строки "000,000,000" или "024,015,255", т.е. строго фиксированные строки.
   
   Возврат RGB10;
   
КонецФункции

//
// Add_ComM_ОтчетыКС.ПолучитьАбсолютныйЦветИзСтроки10(RGB10);
//
// RGB10 = это строка в формате "ККК,ЗЗЗ,ССС"
// Где ККК: десятичное число Красной составляющей цвета, строкой
// Где ЗЗЗ: десятичное число Зеленой составляющей цвета, строкой
// Где ССС: десятичное число Синей   составляющей цвета, строкой
//
// Проверка правильного формата строки составляющих цвета в этом методе не производится,
// т.к. задавать правильный формат нужно при сохранении этой строки в различных объектах
// см. метод ПолучитьСтроку10АбсолютногоЦвета(АЦвет)
//
// Представление цвета в виде "ККК,ЗЗЗ,ССС" в отличие от шестнадцатеричного более наглядно отображается
// в условном оформлении при программном формировании элементов оформления, например,
// RGB10 = "255,255,255"
//
Функция ПолучитьАбсолютныйЦветИзСтроки10(Знач RGB10, КрПоУмолчанию = 255, ЗлПоУмолчанию = 255, СнПоУмолчанию = 255) Экспорт
       
   // Удалим пробелы на случай если RGB10 получен из реквизита-строки с НЕ фиксированной длиной строки.
   RGB10 = СокрЛП(RGB10);
   
   Если СтрДлина(RGB10) = 11 Тогда
       Красный = Мин(ОбщегоНазначения.ПреобразоватьВЧисло(Лев (RGB10, 3))   , 255);
       Зеленый = Мин(ОбщегоНазначения.ПреобразоватьВЧисло(Сред(RGB10, 5, 3)), 255);
       Синий   = Мин(ОбщегоНазначения.ПреобразоватьВЧисло(Прав(RGB10, 3))   , 255);
   Иначе    
       Красный = КрПоУмолчанию;
       Зеленый = ЗлПоУмолчанию;
       Синий   = СнПоУмолчанию;
   КонецЕсли;
   
   Возврат Новый Цвет(Красный, Зеленый, Синий);
   
КонецФункции

//----------- Методы типа данных "УсловноеОформление"


//
// Add_ComM_ОтчетыКС.ПолучитьСписокЦветовУо(РодительЦветов, "RGB10", "Счет", Истина);
//
Функция ПолучитьСписокЦветовУо(Знач РодительЦветов = Неопределено, RGB10ПолеКдИмя, ПолеКдИмя = "", ПолеКдПроверкаЗаполнения = Истина) Экспорт
   
   СзЦвета   = Add_ComM_ОтчетыС.ПолучитьСписокЦветов(РодительЦветов, Ложь);
   СзЦветаУо = Новый СписокЗначений;
   
   НомерПп = 0;
   
   Для каждого ЭлементСз Из СзЦвета Цикл
   
       СтвОтбора = Новый Соответствие;
       
       СтвЭлементаОтбора = Новый Соответствие;
       СтвЭлементаОтбора.Вставить("ЛевоеЗначение" , Новый ПолеКомпоновкиДанных(RGB10ПолеКдИмя));
       СтвЭлементаОтбора.Вставить("ВидСравнения"  , ВидСравненияКомпоновкиДанных.Равно);
       СтвЭлементаОтбора.Вставить("ПравоеЗначение", ЭлементСз.Представление);
       СтвОтбора.Вставить("СтвЭлементаОтбора1", СтвЭлементаОтбора);
       
       Если ЗначениеЗаполнено(ПолеКдИмя) И ПолеКдПроверкаЗаполнения Тогда
           
           СтвЭлементаОтбора = Новый Соответствие;
           СтвЭлементаОтбора.Вставить("ЛевоеЗначение" , Новый ПолеКомпоновкиДанных(ПолеКдИмя));
           СтвЭлементаОтбора.Вставить("ВидСравнения"  , ?(ЗначениеЗаполнено(ПолеКдИмя), ВидСравненияКомпоновкиДанных.Заполнено, ВидСравненияКомпоновкиДанных.НеЗаполнено));
           СтвЭлементаОтбора.Вставить("ПравоеЗначение", Неопределено);
           СтвОтбора.Вставить("СтвЭлементаОтбора2", СтвЭлементаОтбора);
           
       КонецЕсли;
       
       СтвЗнчПараметров = Новый Соответствие;
       СтвЗнчПараметров.Вставить("ЦветФона", ЭлементСз.Значение);
       //... установка прочих значений параметров
       
       СтруктураЭлементаУо = Новый Структура;
       СтруктураЭлементаУо.Вставить("СтвЗнчПараметров", СтвЗнчПараметров);
       СтруктураЭлементаУо.Вставить("СтвОтбора"       , СтвОтбора);
       
       НомерПп = НомерПп + 1;
       КодПп   = Формат(НомерПп, "ЧЦ=5; ЧН=; ЧВН=; ЧГ=");
       
       СзЦветаУо.Добавить(СтруктураЭлементаУо, КодПп);
       
   КонецЦикла;

   СзЦветаУо.СортироватьПоПредставлению();
   
   Возврат СзЦветаУо;
   
КонецФункции

//
// Варианты вызова:
//
// Add_ComM_ОтчетыКС.УстановитьЦветаУо(Уо, РодительЦветов, "RGB10",, Ложь);
//
// Add_ComM_ОтчетыКС.УстановитьЦветаУо(Уо, РодительЦветов, "СтрокаБ.RGB10",, Ложь);
//
// Add_ComM_ОтчетыКС.УстановитьЦветаУо(Уо, РодительЦветов, "RGB10", "Счет", Истина);
//
Функция УстановитьЦветаУо(Уо, РодительЦветов = Неопределено, RGB10ПолеКдИмя, ПолеКдИмя = "", ПолеКдПроверкаЗаполнения = Истина, ПоляРесурсов = Ложь) Экспорт
   
   // Получим УИД текущего пользователя строкой и ключ поиска элемента в ПредставлениеПользовательскойНастройки
   УидПлзСтр = Add_ComM_ОтчетыС.ТекущийПользовательИд(Истина);
   Если ЗначениеЗаполнено(ПолеКдИмя) Тогда
       КлючВПредставлениеПлзНс = ПолеКдИмя + "/" + УидПлзСтр;
   ИначеЕсли ПоляРесурсов Тогда
       КлючВПредставлениеПлзНс = "ПоляРесурсов" + "/" + УидПлзСтр;
   Иначе    
       КлючВПредставлениеПлзНс = УидПлзСтр;
   КонецЕсли;
   
   СзЦветаУо  = ПолучитьСписокЦветовУо(РодительЦветов, RGB10ПолеКдИмя, ПолеКдИмя, ПолеКдПроверкаЗаполнения);
   ЭлементыУо = Уо.Элементы;
   
   // Получим в массив все добавленные ранее этим методом элементы условного оформления по УидПлзСтр и ПолеКдИмя
   мЭлементыУо = Новый Массив;
   Для каждого ЭлементУо Из ЭлементыУо Цикл
       Если Найти(ЭлементУо.ПредставлениеПользовательскойНастройки, КлючВПредставлениеПлзНс) Тогда
           мЭлементыУо.Добавить(ЭлементУо);
       КонецЕсли;
       Если Найти(ЭлементУо.ИдентификаторПользовательскойНастройки, КлючВПредставлениеПлзНс) Тогда
           мЭлементыУо.Добавить(ЭлементУо);
       КонецЕсли;
   КонецЦикла;
   
   // Удалим все добавленные ранее этим методом элементы условного оформления по ИдПн
   Для каждого ЭлементУо Из мЭлементыУо Цикл
       ЭлементыУо.Удалить(ЭлементУо);
   КонецЦикла;
       
   Для каждого СзЦветаУоЭлемент Из СзЦветаУо Цикл
       
       СтруктураЭлементаУо = СзЦветаУоЭлемент.Значение;
       
       // Соответствие значений парметров условного оформления текущего элемента условного оформления
       СтвЗнчПараметров = СтруктураЭлементаУо.СтвЗнчПараметров;
       СтвЗнчПараметровКво = СтвЗнчПараметров.Количество();
       Если НЕ СтвЗнчПараметровКво Тогда
           Продолжить;
       КонецЕсли;
       
       // Соответствие отбора условного оформления текущего элемента условного оформления
       СтвОтбора    = СтруктураЭлементаУо.СтвОтбора;
       СтвОтбораКво = СтвОтбора.Количество();
       Если НЕ СтвОтбораКво Тогда
           Продолжить;
       КонецЕсли;
       
       // Инициализация текущего элемента условного оформления
       ЭлементУо = ЭлементыУо.Добавить();
       ЭлементУо.Представление = СзЦветаУоЭлемент.Представление + "/" + RGB10ПолеКдИмя;
       ЭлементУо.ПредставлениеПользовательскойНастройки = ЭлементУо.Представление + "/" + КлючВПредставлениеПлзНс;
       
       Для каждого СтвЗнчПараметровЭлемент Из СтвЗнчПараметров Цикл
           ТекущийПараметрКД = Новый ПараметрКомпоновкиДанных(СтвЗнчПараметровЭлемент.Ключ);
           ЗнчПараметраНастроекКД = ЭлементУо.Оформление.НайтиЗначениеПараметра(ТекущийПараметрКД);
           Если ЗнчПараметраНастроекКД = Неопределено Тогда
               Продолжить;
           КонецЕсли;
           ЗнчПараметраНастроекКД.Использование = Истина;
           ЗнчПараметраНастроекКД.Значение = СтвЗнчПараметровЭлемент.Значение;
       КонецЦикла;
       
       // Инициализация отбора по текущему элементу условного оформления
       Если СтвОтбораКво = 1 Тогда
           
           // Если соответствие содержит один элемент, то это элемент Уо с простым отбором.
           СтвЭлементаОтбора = СтвОтбора.Получить("СтвЭлементаОтбора1");
           
           ЭлементОтбора = ЭлементУо.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
           
           ЭлементОтбора.Использование  = Истина;
           ЭлементОтбора.ЛевоеЗначение  = СтвЭлементаОтбора.Получить("ЛевоеЗначение");
           ЭлементОтбора.ВидСравнения   = СтвЭлементаОтбора.Получить("ВидСравнения");
           ЭлементОтбора.ПравоеЗначение = СтвЭлементаОтбора.Получить("ПравоеЗначение");
           
       ИначеЕсли СтвОтбораКво > 1 Тогда
           
           // Если соответствие содержит более чем один элемент, то это элемент Уо с групповым отбором.
           // Инициализируем группу элементов отбора по текущему элементу условного оформления
           ГруппаИОтбораУо = ЭлементУо.Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
           ГруппаИОтбораУо.Использование = Истина;
           ГруппаИОтбораУо.ТипГруппы     = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИ;
           
           Для каждого СтвЭлементаОтбораКЗ Из СтвОтбора Цикл
               Если СтвЭлементаОтбораКЗ.Ключ = "Цвет" Тогда
                   Продолжить;
               КонецЕсли;
               ЭлементОтбора                = ГруппаИОтбораУо.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
               ЭлементОтбора.Использование  = Истина;
               ЭлементОтбора.ЛевоеЗначение  = СтвЭлементаОтбораКЗ.Значение.Получить("ЛевоеЗначение");
               ЭлементОтбора.ВидСравнения   = СтвЭлементаОтбораКЗ.Значение.Получить("ВидСравнения");
               ЭлементОтбора.ПравоеЗначение = СтвЭлементаОтбораКЗ.Значение.Получить("ПравоеЗначение");
           КонецЦикла;
           
       Иначе    
           
           Продолжить;
           
       КонецЕсли;
       
       // Инициализация полей по текущему элементу условного оформления
       ЭлементУоПоляЭлементы = ЭлементУо.Поля.Элементы;
       
       Если ЗначениеЗаполнено(ПолеКдИмя) Тогда
           ПолеОформления = ЭлементУоПоляЭлементы.Добавить();
           ПолеОформления.Использование = Истина;
           ПолеОформления.Поле = Новый ПолеКомпоновкиДанных(ПолеКдИмя);
           
       ИначеЕсли ПоляРесурсов Тогда    
           Для каждого ДоступноеПолеКд Из Уо.ДоступныеПоляПолей.Элементы Цикл
               Если ДоступноеПолеКд.Ресурс И (НЕ ДоступноеПолеКд.Папка) И (НЕ ДоступноеПолеКд.Таблица) Тогда
                   ПолеОформления = ЭлементУоПоляЭлементы.Добавить();
                   ПолеОформления.Использование = Истина;
                   ПолеОформления.Поле = ДоступноеПолеКд.Поле;
                   
               КонецЕсли;
           КонецЦикла;
           
       КонецЕсли;
       
   КонецЦикла;
   
   Возврат Истина;
   
КонецФункции
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан