Клиент хочет выделять номенклатурные позиции с галочкой "Выгодно" красным шрифтом.
Но вот беда - в таблице значений для условного оформления нельзя использовать реквизиты полей таблицы.
Придется создавать под них реквизиты (программно) и заполнять их, отслеживая изменения номенклатуры.
По другому никак?

Вот такой код не работает:

```1c
    ЭлементОформления = УсловноеОформление.Элементы.Добавить();
    Элемент = ЭлементОформления.Оформление.Элементы.Найти("ЦветТекста");
    Элемент.Значение = WebЦвета.Красный;
    Элемент.Использование = Истина;
    ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
    ЭлементОтбора.Использование = Истина;
    ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ТЧНоменклатура.Номенклатура.дор_Выгодно");
    ЭлементОтбора.ПравоеЗначение = истина;
    ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить();
    ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("ТЧНоменклатураНоменклатура");
    ПолеОформления.Использование = Истина;
```
---
В общем тупо добавил реквизиты в табличную часть. Розница, редакция 3.0 (3.0.3.147)

Пересчет реквизитов модуль дор_К:

```1c
    &НаКлиенте
    Процедура ПересчитатьРеквизитыРаскраскиНоменклатурыДокумента(Форма, ТаблицаТоваров, ИмяПоляНоменклатуры) Экспорт

    М = Новый Массив();

    Для Каждого Строка ИЗ ТаблицаТоваров Цикл
    ТекНоменклатура = Строка[ИмяПоляНоменклатуры];
    М.Добавить(ТекНоменклатура);
    КонецЦикла;

    РеквизитыВсе = дор_С.ЗначенияРеквизитовОбъектов(М, "дор_Выгодно, дор_МинМаксЗаполнено");

    Для Каждого Строка ИЗ ТаблицаТоваров Цикл
    ТекНоменклатура = Строка[ИмяПоляНоменклатуры];
    РеквизитыТекущие = РеквизитыВсе[ТекНоменклатура];
    Если РеквизитыТекущие <> Неопределено Тогда
    Строка.дор_МинМаксЗаполнено = РеквизитыТекущие.дор_МинМаксЗаполнено;
    Строка.дор_Выгодно = РеквизитыТекущие.дор_Выгодно;
    КонецЕсли;
    КонецЦикла;

    КонецПроцедуры
```

На сервере Дор_С:

```1c
    Процедура РаскраситьНоменклатуруСписка(Форма, СписокЗапасы, ПутьКТЧНоменклатуры, ИдентификаторПоляНоменклатуры, ИмяПоляРаскраскиНоменклатуры) Экспорт
    Перем УсловноеОформление;

    Если ТипЗнч(СписокЗапасы) = Тип("ДинамическийСписок") Тогда
    УсловноеОформление = СписокЗапасы.КомпоновщикНастроек.ФиксированныеНастройки.УсловноеОформление;
    ПутьКНоменклатуре = ИдентификаторПоляНоменклатуры;
    Иначе
    //Также нужно добавить реквизиты
    УсловноеОформление = Форма.УсловноеОформление;
    НовыеРеквизиты = Новый Массив;
    НовыеРеквизиты.Добавить(Новый РеквизитФормы("дор_МинМаксЗаполнено", Новый ОписаниеТипов("Булево"), ПутьКТЧНоменклатуры, ", ложь));
    НовыеРеквизиты.Добавить(Новый РеквизитФормы("дор_Выгодно", Новый ОписаниеТипов("Булево"), ПутьКТЧНоменклатуры, ", ложь));
    Форма.ИзменитьРеквизиты(НовыеРеквизиты);
    ПутьКНоменклатуре = ПутьКТЧНоменклатуры; // + ?(ЗначениеЗаполнено(ИдентификаторПоляНоменклатуры), "." + ИдентификаторПоляНоменклатуры, ");

    КонецЕсли;

    //=== Оформление поля мин-макс
    ЭлементОформления = УсловноеОформление.Элементы.Добавить();
    Элемент = ЭлементОформления.Оформление.Элементы.Найти("ЦветФона");
    Элемент.Значение = WebЦвета.СеребристоСерый;
    Элемент.Использование = Истина;
    ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
    ЭлементОтбора.Использование = Истина;
    ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ПутьКНоменклатуре + ".дор_МинМаксЗаполнено");
    ЭлементОтбора.ПравоеЗначение = Ложь;
    ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить();
    ПолеОформления.Поле = Новый ПолеКомпоновкиДанных(ИмяПоляРаскраскиНоменклатуры);
    ПолеОформления.Использование = Истина;

    //=== Оформление поля выгодно

    ЭлементОформления = УсловноеОформление.Элементы.Добавить();
    Элемент = ЭлементОформления.Оформление.Элементы.Найти("ЦветТекста");
    Элемент.Значение = WebЦвета.Красный;
    Элемент.Использование = Истина;
    ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
    ЭлементОтбора.Использование = Истина;
    ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ПутьКНоменклатуре + ".дор_Выгодно");
    ЭлементОтбора.ПравоеЗначение = истина;
    ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить();
    ПолеОформления.Поле = Новый ПолеКомпоновкиДанных(ИмяПоляРаскраскиНоменклатуры);
    ПолеОформления.Использование = Истина;

    КонецПроцедуры
```

В форме списка номенклатуры:

```1c
    &НаСервере
    Процедура M_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)

    дор_С.РаскраситьНоменклатуруСписка(ЭтаФорма, СписокЗапасы, "СписокЗапасы", "Номенклатура", "Наименование");

    КонецПроцедуры
```

В форме документа установки цен:

```1c
    &НаСервере
    Процедура M_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)

    дор_С.РаскраситьНоменклатуруСписка(ЭтаФорма, ТЧНоменклатура, "ТЧНоменклатура", "Номенклатура", "ТЧНоменклатураНоменклатура");

    КонецПроцедуры

    &НаКлиенте
    Процедура M_ОбновитьНомераСтрок() Экспорт
    Сч = 0;
    Для Каждого Строка ИЗ ТЧНоменклатура Цикл
    Сч = Сч + 1;
    Строка.дор_НомерСтроки = Сч;
    КонецЦикла;
    //Раскрашиваем
    дор_К.ПересчитатьРеквизитыРаскраскиНоменклатурыДокумента(ЭтаФорма, ТЧНоменклатура, "Номенклатура");
    КонецПроцедуры

    &НаКлиенте
    &После("ОбновитьКоличествоЗаписейПоДокументу")
    Процедура M_ОбновитьКоличествоЗаписейПоДокументу()
    M_ОбновитьНомераСтрок();
    КонецПроцедуры

    &НаКлиенте
    Процедура M_ПриОткрытииПосле(Отказ)
    M_ОбновитьНомераСтрок();
    КонецПроцедуры

    &НаКлиенте
    &После("ОбработатьЗаполненияДокументаПриОткрытии")
    Процедура M_ОбработатьЗаполненияДокументаПриОткрытии(Результат, ДополнительныеПараметры)
    //Если документ грузится фоновым заданием
    M_ОбновитьНомераСтрок();
    КонецПроцедуры
```

И в обработке печати ценников:

```1c
    &НаСервере
    Процедура M_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
    дор_С.РаскраситьНоменклатуруСписка(ЭтаФорма, Объект.Товары, "Объект.Товары", "Номенклатура", "ТоварыНоменклатура");
    КонецПроцедуры

    &НаКлиенте
    Процедура ОбновитьРеквизитыТоваров() Экспорт
    дор_К.ПересчитатьРеквизитыРаскраскиНоменклатурыДокумента(ЭтаФорма, Объект.Товары, "Номенклатура");
    КонецПроцедуры

    &НаКлиенте
    &После("ОповещениеПодборПроизведен")
    Процедура M_ОповещениеПодборПроизведен(РезультатЗакрытия, ДополнительныеПараметры)
    ОбновитьРеквизитыТоваров();
    КонецПроцедуры

    &НаКлиенте
    Процедура M_ЗаполнитьПоОтборуПосле(Команда)
    ОбновитьРеквизитыТоваров();
    КонецПроцедуры

    &НаКлиенте
    &После("ОповещениеЗаполнитьТаблицуТоваров")
    Процедура M_ОповещениеЗаполнитьТаблицуТоваров(Результат, ДополнительныеПараметры)
    ОбновитьРеквизитыТоваров();
    КонецПроцедуры

    &НаКлиенте
    Процедура M_ПриОткрытииПосле(Отказ)
    ОбновитьРеквизитыТоваров();
    КонецПроцедуры

    &НаКлиенте
    &После("ЗаполнитьПоПакетамЦенников")
    Процедура M_ЗаполнитьПоПакетамЦенников(СтруктураТоваров, Параметры)
    ОбновитьРеквизитыТоваров();
    КонецПроцедуры
```

Процедура раскраски используется общая для номенклатуры и документа.
Реквизиты получаются одним типовым запросом по всей номенклатуре документа и обновляются в цикле по строкам.
---
Либо заполнять колонку, либо динамически менять отбор в условном оформлении.
То есть задать отбор по номенклатуре в документе, подходящей под условия.
При изменении состава табличной части/номенклатуры - обновлять отбор в условном оформлении.
---
ТЧНоменклатура Доброго дня.
Нельзя программно? Просто настройка оформления в режиме клиента позволяет такое настроить ручками.

И тут Новый ПолеКомпоновкиДанных("ТЧНоменклатураНоменклатура"); точно точка не нужна?

Или я вопрос не понял?
---
Посмотри на сайте у Гения 1С, там должен быть ответ.
---
у Гения 1С Думаете, автор знает - кто это такой?
---
условие некорректно

```1c
    ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ТЧНоменклатура.Номенклатура.дор_Выгодно");
    ЭлементОтбора.ПравоеЗначение = истина;
```

надо что-то вроде

```1c
    ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ТЧНоменклатура.Номенклатура.дор_Выгодно");
    ЭлементОтбора.ПравоеЗначение = Справочники.Номенклатура.НайтиПоКоду("аиваиа");
```
---
а не чет я прогнал дор_Выгодно не заметил
---
создайте список номенклатуры где дор_Выгодно равна истине, и проверяйте на вхождения Новый ПолеКомпоновкиДанных("ТЧНоменклатура.Номенклатура.дор_Выгодно") в этот список
---
надо отслеживать состав номенклатуры в исходной ТЧ, формировать этот список. Тоже не прозрачная штука.
---
Как вариант, получите полный список номенклатуры с флагом дор_Выгодно вне зависимости от наполнения ТЧ.
---
память не бесконечная на клиенте... но способ рабочий, в принципе. 1 СМ отдаю.
Он рабочий только в принципе, на практике его применять не буду. Все же это изнасилование памяти.
Конечно, акционных товаров менье, чем вся номенклатура, но тоже 1000 элементов держать в памяти...

Упс. Ошибочно отдал 1см себе. Поправил, отдал и автору ответа.
---
отдал и автору ответа Ага!
---
Упс. Ошибочно отдал 1см себе. Поправил, отдал и автору ответа.
это называется синхронность.
---
(7) там проблема в том, чтобы поддерживать реквизит в актуальном состоянии, потому что у платформы нет событий по изменению таблицы, нужно отслеживать все возможные события по смену номенклатуры в строке и добавлению строк.
---
не понял, как это нету(ПриИзменении)? ну как еще один вариант подключить обработчик ожидания и каджую секунду - две перезаполнять)
---
нету. там 100500 способов изменения этой ТЧ, в т.ч. и программное добавление. Обработчик - это знатный костыль. Тогда уж для ускорения еще и колонку со значением номенклатуры, для которой посчитан реквизит, чтобы сервер не дергать, но тогда если реквизит номенклатуры обновится, поле не обновится. Но это уж ладно. Возможно, придется так и поступить, хотя я думаю, в типовой есть события пересчета итогов документа, к ним подвязаться.
---
тогда 2 колонки, во второй записывать что первая обновлена, и на клиенте каждые пару секунд проверять вся ли номенклатура из первой колонки обновлена, чтоб каждый раз на сервер без необходимости не бегать)
---
че эт вы текст свой изменили и глупцом меня выставили, ну ок
---
это называется синхронность.
---
и часто вы синхронизируете?
---
за 2 стартмани удавиться готов
---
за 2 стартмани удавиться готов Вы и этому должны радоваться - в прошлый раз было и того хуже.
---
это ж Гений ) что с него взять. Рейтинг 4191, а не может с условным оформлением справиться )
---
А вы можете справиться? Расскажите про способ, который еще тут не озвучивали?
---
Сообщение было скрыто модератором.
---
Сообщение было скрыто модератором.
---
Это ДС на скрине. Реч про ТЧ.
---
Ну сделать с ДС. Посмотреть как это выглядит в отладчике, попробовать реализовать тоже для ТЧ.

А вообще на ютуб канале желтого клуба в начале видео "Ошибки в коде 90% программистов", первых минут30-40 как раз что-то подобное описано, но они там условным оформлением отметку обязательности заполнения убирали, ну и да, добавляли колонку без вывода её на форму и заполняли её привязываясь к 4м событиям, если не ошибаюсь...
---
с ДС тоже с реквизитами не работает, там работает с компоновщиком настроек.https://geniy1s.ru/koe-chto-vazhnoe-ob-uslovnom-oformlenii/
Но в таблице компоновщика нет.
---
В общем тупо добавил реквизиты в табличную часть. Розница, редакция 3.0 (3.0.3.147)

Пересчет реквизитов модуль дор_К:

```1c
    &НаКлиенте
    Процедура ПересчитатьРеквизитыРаскраскиНоменклатурыДокумента(Форма, ТаблицаТоваров, ИмяПоляНоменклатуры) Экспорт

    М = Новый Массив();

    Для Каждого Строка ИЗ ТаблицаТоваров Цикл
    ТекНоменклатура = Строка[ИмяПоляНоменклатуры];
    М.Добавить(ТекНоменклатура);
    КонецЦикла;

    РеквизитыВсе = дор_С.ЗначенияРеквизитовОбъектов(М, "дор_Выгодно, дор_МинМаксЗаполнено");

    Для Каждого Строка ИЗ ТаблицаТоваров Цикл
    ТекНоменклатура = Строка[ИмяПоляНоменклатуры];
    РеквизитыТекущие = РеквизитыВсе[ТекНоменклатура];
    Если РеквизитыТекущие <> Неопределено Тогда
    Строка.дор_МинМаксЗаполнено = РеквизитыТекущие.дор_МинМаксЗаполнено;
    Строка.дор_Выгодно = РеквизитыТекущие.дор_Выгодно;
    КонецЕсли;
    КонецЦикла;

    КонецПроцедуры
```

На сервере Дор_С:

```1c
    Процедура РаскраситьНоменклатуруСписка(Форма, СписокЗапасы, ПутьКТЧНоменклатуры, ИдентификаторПоляНоменклатуры, ИмяПоляРаскраскиНоменклатуры) Экспорт
    Перем УсловноеОформление;

    Если ТипЗнч(СписокЗапасы) = Тип("ДинамическийСписок") Тогда
    УсловноеОформление = СписокЗапасы.КомпоновщикНастроек.ФиксированныеНастройки.УсловноеОформление;
    ПутьКНоменклатуре = ИдентификаторПоляНоменклатуры;
    Иначе
    //Также нужно добавить реквизиты
    УсловноеОформление = Форма.УсловноеОформление;
    НовыеРеквизиты = Новый Массив;
    НовыеРеквизиты.Добавить(Новый РеквизитФормы("дор_МинМаксЗаполнено", Новый ОписаниеТипов("Булево"), ПутьКТЧНоменклатуры, ", ложь));
    НовыеРеквизиты.Добавить(Новый РеквизитФормы("дор_Выгодно", Новый ОписаниеТипов("Булево"), ПутьКТЧНоменклатуры, ", ложь));
    Форма.ИзменитьРеквизиты(НовыеРеквизиты);
    ПутьКНоменклатуре = ПутьКТЧНоменклатуры; // + ?(ЗначениеЗаполнено(ИдентификаторПоляНоменклатуры), "." + ИдентификаторПоляНоменклатуры, ");

    КонецЕсли;

    //=== Оформление поля мин-макс
    ЭлементОформления = УсловноеОформление.Элементы.Добавить();
    Элемент = ЭлементОформления.Оформление.Элементы.Найти("ЦветФона");
    Элемент.Значение = WebЦвета.СеребристоСерый;
    Элемент.Использование = Истина;
    ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
    ЭлементОтбора.Использование = Истина;
    ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ПутьКНоменклатуре + ".дор_МинМаксЗаполнено");
    ЭлементОтбора.ПравоеЗначение = Ложь;
    ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить();
    ПолеОформления.Поле = Новый ПолеКомпоновкиДанных(ИмяПоляРаскраскиНоменклатуры);
    ПолеОформления.Использование = Истина;

    //=== Оформление поля выгодно

    ЭлементОформления = УсловноеОформление.Элементы.Добавить();
    Элемент = ЭлементОформления.Оформление.Элементы.Найти("ЦветТекста");
    Элемент.Значение = WebЦвета.Красный;
    Элемент.Использование = Истина;
    ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
    ЭлементОтбора.Использование = Истина;
    ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ПутьКНоменклатуре + ".дор_Выгодно");
    ЭлементОтбора.ПравоеЗначение = истина;
    ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить();
    ПолеОформления.Поле = Новый ПолеКомпоновкиДанных(ИмяПоляРаскраскиНоменклатуры);
    ПолеОформления.Использование = Истина;

    КонецПроцедуры
```

В форме списка номенклатуры:

```1c
    &НаСервере
    Процедура M_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)

    дор_С.РаскраситьНоменклатуруСписка(ЭтаФорма, СписокЗапасы, "СписокЗапасы", "Номенклатура", "Наименование");

    КонецПроцедуры
```

В форме документа установки цен:

```1c
    &НаСервере
    Процедура M_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)

    дор_С.РаскраситьНоменклатуруСписка(ЭтаФорма, ТЧНоменклатура, "ТЧНоменклатура", "Номенклатура", "ТЧНоменклатураНоменклатура");

    КонецПроцедуры

    &НаКлиенте
    Процедура M_ОбновитьНомераСтрок() Экспорт
    Сч = 0;
    Для Каждого Строка ИЗ ТЧНоменклатура Цикл
    Сч = Сч + 1;
    Строка.дор_НомерСтроки = Сч;
    КонецЦикла;
    //Раскрашиваем
    дор_К.ПересчитатьРеквизитыРаскраскиНоменклатурыДокумента(ЭтаФорма, ТЧНоменклатура, "Номенклатура");
    КонецПроцедуры

    &НаКлиенте
    &После("ОбновитьКоличествоЗаписейПоДокументу")
    Процедура M_ОбновитьКоличествоЗаписейПоДокументу()
    M_ОбновитьНомераСтрок();
    КонецПроцедуры

    &НаКлиенте
    Процедура M_ПриОткрытииПосле(Отказ)
    M_ОбновитьНомераСтрок();
    КонецПроцедуры

    &НаКлиенте
    &После("ОбработатьЗаполненияДокументаПриОткрытии")
    Процедура M_ОбработатьЗаполненияДокументаПриОткрытии(Результат, ДополнительныеПараметры)
    //Если документ грузится фоновым заданием
    M_ОбновитьНомераСтрок();
    КонецПроцедуры
```

И в обработке печати ценников:

```1c
    &НаСервере
    Процедура M_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
    дор_С.РаскраситьНоменклатуруСписка(ЭтаФорма, Объект.Товары, "Объект.Товары", "Номенклатура", "ТоварыНоменклатура");
    КонецПроцедуры

    &НаКлиенте
    Процедура ОбновитьРеквизитыТоваров() Экспорт
    дор_К.ПересчитатьРеквизитыРаскраскиНоменклатурыДокумента(ЭтаФорма, Объект.Товары, "Номенклатура");
    КонецПроцедуры

    &НаКлиенте
    &После("ОповещениеПодборПроизведен")
    Процедура M_ОповещениеПодборПроизведен(РезультатЗакрытия, ДополнительныеПараметры)
    ОбновитьРеквизитыТоваров();
    КонецПроцедуры

    &НаКлиенте
    Процедура M_ЗаполнитьПоОтборуПосле(Команда)
    ОбновитьРеквизитыТоваров();
    КонецПроцедуры

    &НаКлиенте
    &После("ОповещениеЗаполнитьТаблицуТоваров")
    Процедура M_ОповещениеЗаполнитьТаблицуТоваров(Результат, ДополнительныеПараметры)
    ОбновитьРеквизитыТоваров();
    КонецПроцедуры

    &НаКлиенте
    Процедура M_ПриОткрытииПосле(Отказ)
    ОбновитьРеквизитыТоваров();
    КонецПроцедуры

    &НаКлиенте
    &После("ЗаполнитьПоПакетамЦенников")
    Процедура M_ЗаполнитьПоПакетамЦенников(СтруктураТоваров, Параметры)
    ОбновитьРеквизитыТоваров();
    КонецПроцедуры
```

Процедура раскраски используется общая для номенклатуры и документа.
Реквизиты получаются одним типовым запросом по всей номенклатуре документа и обновляются в цикле по строкам.