Есть документ с табличной частью. Необходимо в этой табличной части раскрашивать в одинаковый цвет строки имеющие одинаковую дату (дата это колонка табчасти). Как это сделать? 1С 8.3 (управляемые формы).
В 8.1 в событияэх табличной части есть: "ПриПолученииДанных" (Вызывается при получении данных табличным полем), можно написать:
Для каждого СтрокаСписка Из ОформленияСтрок Цикл
Если СтрокаСписка.Проведен тогда
СтрокаСписка.ЦветФона = Новый Цвет(155, 155, 155);
КонецЕсли;
КонецЦикла;
Проблема в том, что я имею дело с 8.3 УП. Там нет этого события.
(1) для управляемых форм есть свойство УсловноеОформление. Его можно заполнять вручную в конфигураторе, но в данном случае вам нужно его заполнять программно. Почитайте про его свойства, методы.
Вот небольшой пример:
Процедура УстановитьПодсветкуСертификации(ЭтаФорма, ПутьКПризнакуТребуетсяСертификация = "Объект.Товары.ТребуетсяСертификация", МассивИменКолонокДляПодсветки) Экспорт
Элементы = ЭтаФорма.Элементы;
УсловноеОформление = ЭтаФорма.УсловноеОформление;
ЭлементОформления = УсловноеОформление.Элементы.Добавить();
ЭлементОформления.Использование = Истина;
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветТекста", WebЦвета.Красный);
ЭлементУсловия = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементУсловия.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ПутьКПризнакуТребуетсяСертификация);
ЭлементУсловия.ПравоеЗначение = Истина;
ЭлементУсловия.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементУсловия.Использование = Истина;
Для каждого ТекЭлемент из МассивИменКолонокДляПодсветки Цикл
ОформляемоеПоле = ЭлементОформления.Поля.Элементы.Добавить();
ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных(ТекЭлемент);
КонецЦикла;
КонецПроцедуры
Показать
массив имен колонок формировался так:
МассивИменКолонокДляПодсветки = Новый Массив;
МассивИменКолонокДляПодсветки.Добавить(Элементы.Товары.ПодчиненныеЭлементы.ТоварыШтрихкод.Имя);
МассивИменКолонокДляПодсветки.Добавить(Элементы.Товары.ПодчиненныеЭлементы.ТоварыНоменклатура.Имя);
в расскраске использовал именно цвет текста, т.к. цвет фона перекрывается фоном выделения строки - т.е. не ясно каким же цветом показана выделенная строка
Все хорошо, но строка с:
УсловноеОформление =
будет выдавать ошибку, так как на форме зарезервировано имя "УсловноеОформление " переименуйте в "УсловноеОформление_моё"
Вот более верный вариант. Делал в УТ 11.4.5 на 8.3.11. В моделе формы документа Процедура УстановитьУсловноеОформление()
Процедура РаскраситьСтрокуТоварыЗеленым()
МассивИменКолонокДляПодсветки = Новый Массив;
Для каждого Стр из Элементы.Товары.ПодчиненныеЭлементы Цикл
МассивИменКолонокДляПодсветки.Добавить(Стр.Имя);
КонецЦикла;
ЭлементОформления = УсловноеОформление.Элементы.Добавить();
ЭлементОформления.Использование = Истина;
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветФона", Новый Цвет(204, 255, 204));
ЭлементУсловия = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементУсловия.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.ВариантОбеспечения");
ЭлементУсловия.ПравоеЗначение = Перечисления.ВариантыОбеспечения.Отгрузить;
ЭлементУсловия.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементУсловия.Использование = Истина;
Для каждого ТекЭлемент из МассивИменКолонокДляПодсветки Цикл
ОформляемоеПоле = ЭлементОформления.Поля.Элементы.Добавить();
ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных(ТекЭлемент);
КонецЦикла;
КонецПроцедуры
МассивИменКолонокДляПодсветки = Новый Массив;
Для каждого Стр из Элементы.Товары.ПодчиненныеЭлементы Цикл
МассивИменКолонокДляПодсветки.Добавить(Стр.Имя);
КонецЦикла;
Для каждого ТекЭлемент из МассивИменКолонокДляПодсветки Цикл
ОформляемоеПоле = ЭлементОформления.Поля.Элементы.Добавить();
ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных(ТекЭлемент);
КонецЦикла;
(8) Прост и удобен - да. Но ни разу не универсален. Сплошь и рядом если в форме программно устанавливается условное оформление, то ПриСозданииНаСервере мы имеем УсловноеОформление.Элементы.Очистить(); и весь наш простой и удобный вариант идет по бороде.
Прост и удобен - да. Но ни разу не универсален. Сплошь и рядом если в форме программно устанавливается условное оформление, то ПриСозданииНаСервере мы имеем УсловноеОформление.Элементы.Очистить(); и весь наш простой и удобный вариант идет по бороде.
УО = ЭтаФорма.УсловноеОформление;
УО.Элементы.Очистить();
ЭлементУО = УО.Элементы.Добавить();
Оформляемоеполе = ЭлементУО.Поля.Элементы.Добавить(); // Поля таблицы для которых будет действовать оформление
Оформляемоеполе.Поле = Новый ПолеКомпоновкиДанных("НаименованиеПолное");
Оформляемоеполе = ЭлементУО.Поля.Элементы.Добавить();
Оформляемоеполе.Поле = Новый ПолеКомпоновкиДанных("ИнвентарныйНомер");
Оформляемоеполе = ЭлементУО.Поля.Элементы.Добавить();
Оформляемоеполе.Поле = Новый ПолеКомпоновкиДанных("ШтрихКод");
Оформляемоеполе = ЭлементУО.Поля.Элементы.Добавить();
Оформляемоеполе.Поле = Новый ПолеКомпоновкиДанных("МестоХранения");
Оформляемоеполе.Использование = ИСТИНА;
ЭлементУсловия = ЭлементУО.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементУсловия.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Список.Ссылка");
ЭлементУсловия.ПравоеЗначение = СписокОтбора;
ЭлементУсловия.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке;
ЭлементУсловия.Использование = Истина;
ЭлементУО.Оформление.УстановитьЗначениеПараметра("ЦветФОна",WebЦвета.СветлоЗеленый);
Показать
Доброго дня всем! Подскажите, почему этот код не работает? Я не могу передать Список Значений в правое значение отбора?
СписокОтбора - реквизит формы, его получаю заранее.
(17) спасибо, но у меня все работает )
это процедура общего модуля и форма передается в качестве параметра.
Если у вас в форме самого объекта, то можно просто закомментить первые 2 строки.
Есть аналог оформления как в ОП 8.1.
Событие при получении данных на сервере, аналог ПриЧтенииДанных
У меня была задача расскрачить форму приемки от грузки в КА. Обычное условное оформление у меня сделать не получалось. Возможно, я что-то упустил, но настроить условным оформлением мне не удалось. Но удалось ПриПолученииДанныхНаСервере
&НаСервереБезКонтекста
Процедура АБОрдераВРаботеПриПолученииДанныхНаСервере(ИмяЭлемента, Настройки, Строки)
КлючиСтрок = Строки.ПолучитьКлючи();
Для каждого Ключ Из КлючиСтрок Цикл
КоличествоУпаковок = 0;
КоличествоУпаковокРаспоряжения = 0;
Если Строки[Ключ].Данные.Тип = Тип("ДокументСсылка.РасходныйОрдерНаТовары") Тогда
КоличествоУпаковок = Строки[Ключ].Данные.Ссылка.ОтгружаемыеТовары.Итог("КоличествоУпаковок");
КоличествоУпаковокРаспоряжения = Строки[Ключ].Данные.Ссылка.ТоварыПоРаспоряжениям.Итог("Количество");
ИначеЕсли Строки[Ключ].Данные.Тип = Тип("ДокументСсылка.ПриходныйОрдерНаТовары") Тогда
КоличествоУпаковок =Строки[Ключ].Данные.Ссылка.Товары.Итог("КоличествоУпаковок");
Если ТипЗнч(Строки[Ключ].Данные.Ссылка.Распоряжение) = Тип("СправочникСсылка.СоглашенияСКлиентами") Тогда
Продолжить;
КонецЕсли;
Если не Строки[Ключ].Данные.Ссылка.Распоряжение.Пустая() Тогда
Если Строки[Ключ].Данные.Ссылка.Распоряжение.Метаданные().ТабличныеЧасти.Найти("товары") <> Неопределено Тогда
КоличествоУпаковокРаспоряжения = Строки[Ключ].Данные.Ссылка.Распоряжение.Товары.Итог("КоличествоУпаковок");
ИначеЕсли Строки[Ключ].Данные.Ссылка.Распоряжение.Метаданные().ТабличныеЧасти.Найти("ВозвращаемыеТовары") <> Неопределено Тогда
КоличествоУпаковокРаспоряжения = Строки[Ключ].Данные.Ссылка.Распоряжение.ВозвращаемыеТовары.Итог("КоличествоУпаковок");
КонецЕсли;
КонецЕсли;
КонецЕсли;
НовыйЦвет = Новый Цвет();
Если КоличествоУпаковок < КоличествоУпаковокРаспоряжения Тогда
НовыйЦвет = WebЦвета.СветлоРозовый;
ИначеЕсли КоличествоУпаковок > КоличествоУпаковокРаспоряжения Тогда
НовыйЦвет = WebЦвета.СветлоЗеленый;
КонецЕсли;
Для каждого КлючОформления Из Строки[Ключ].Оформление Цикл
КлючОформления.Значение.Элементы[0].Значение = НовыйЦвет;
КонецЦикла;
КонецЦикла;
КонецПроцедуры