Клиент хочет выделять номенклатурные позиции с галочкой "Выгодно" красным шрифтом.
Но вот беда - в таблице значений для условного оформления нельзя использовать реквизиты полей таблицы.
Придется создавать под них реквизиты (программно) и заполнять их, отслеживая изменения номенклатуры.
По другому никак?
В общем тупо добавил реквизиты в табличную часть. Розница, редакция 3.0 (3.0.3.147)
Пересчет реквизитов модуль дор_К:
&НаКлиенте
Процедура ПересчитатьРеквизитыРаскраскиНоменклатурыДокумента(Форма, ТаблицаТоваров, ИмяПоляНоменклатуры) Экспорт
М = Новый Массив();
Для Каждого Строка ИЗ ТаблицаТоваров Цикл
ТекНоменклатура = Строка[ИмяПоляНоменклатуры];
М.Добавить(ТекНоменклатура);
КонецЦикла;
РеквизитыВсе = дор_С.ЗначенияРеквизитовОбъектов(М, "дор_Выгодно, дор_МинМаксЗаполнено");
Для Каждого Строка ИЗ ТаблицаТоваров Цикл
ТекНоменклатура = Строка[ИмяПоляНоменклатуры];
РеквизитыТекущие = РеквизитыВсе[ТекНоменклатура];
Если РеквизитыТекущие <> Неопределено Тогда
Строка.дор_МинМаксЗаполнено = РеквизитыТекущие.дор_МинМаксЗаполнено;
Строка.дор_Выгодно = РеквизитыТекущие.дор_Выгодно;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Показать
На сервере Дор_С:
Процедура РаскраситьНоменклатуруСписка(Форма, СписокЗапасы, ПутьКТЧНоменклатуры, ИдентификаторПоляНоменклатуры, ИмяПоляРаскраскиНоменклатуры) Экспорт
Перем УсловноеОформление;
Если ТипЗнч(СписокЗапасы) = Тип("ДинамическийСписок") Тогда
УсловноеОформление = СписокЗапасы.КомпоновщикНастроек.ФиксированныеНастройки.УсловноеОформление;
ПутьКНоменклатуре = ИдентификаторПоляНоменклатуры;
Иначе
//Также нужно добавить реквизиты
УсловноеОформление = Форма.УсловноеОформление;
НовыеРеквизиты = Новый Массив;
НовыеРеквизиты.Добавить(Новый РеквизитФормы("дор_МинМаксЗаполнено", Новый ОписаниеТипов("Булево"), ПутьКТЧНоменклатуры, "", ложь));
НовыеРеквизиты.Добавить(Новый РеквизитФормы("дор_Выгодно", Новый ОписаниеТипов("Булево"), ПутьКТЧНоменклатуры, "", ложь));
Форма.ИзменитьРеквизиты(НовыеРеквизиты);
ПутьКНоменклатуре = ПутьКТЧНоменклатуры; // + ?(ЗначениеЗаполнено(ИдентификаторПоляНоменклатуры), "." + ИдентификаторПоляНоменклатуры, "");
КонецЕсли;
//=== Оформление поля мин-макс
ЭлементОформления = УсловноеОформление.Элементы.Добавить();
Элемент = ЭлементОформления.Оформление.Элементы.Найти("ЦветФона");
Элемент.Значение = WebЦвета.СеребристоСерый;
Элемент.Использование = Истина;
ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.Использование = Истина;
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ПутьКНоменклатуре + ".дор_МинМаксЗаполнено");
ЭлементОтбора.ПравоеЗначение = Ложь;
ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить();
ПолеОформления.Поле = Новый ПолеКомпоновкиДанных(ИмяПоляРаскраскиНоменклатуры);
ПолеОформления.Использование = Истина;
//=== Оформление поля выгодно
ЭлементОформления = УсловноеОформление.Элементы.Добавить();
Элемент = ЭлементОформления.Оформление.Элементы.Найти("ЦветТекста");
Элемент.Значение = WebЦвета.Красный;
Элемент.Использование = Истина;
ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.Использование = Истина;
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ПутьКНоменклатуре + ".дор_Выгодно");
ЭлементОтбора.ПравоеЗначение = истина;
ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить();
ПолеОформления.Поле = Новый ПолеКомпоновкиДанных(ИмяПоляРаскраскиНоменклатуры);
ПолеОформления.Использование = Истина;
КонецПроцедуры
Процедура раскраски используется общая для номенклатуры и документа.
Реквизиты получаются одним типовым запросом по всей номенклатуре документа и обновляются в цикле по строкам.
(1)Либо заполнять колонку, либо динамически менять отбор в условном оформлении.
То есть задать отбор по номенклатуре в документе, подходящей под условия.
При изменении состава табличной части/номенклатуры - обновлять отбор в условном оформлении.
(5) создайте список номенклатуры где дор_Выгодно равна истине, и проверяйте на вхождения Новый ПолеКомпоновкиДанных("ТЧНоменклатура.Номенклатура.дор_Выгодно") в этот список
(24) память не бесконечная на клиенте... но способ рабочий, в принципе. 1 СМ отдаю.
Он рабочий только в принципе, на практике его применять не буду. Все же это изнасилование памяти.
Конечно, акционных товаров менье, чем вся номенклатура, но тоже 1000 элементов держать в памяти...
Упс. Ошибочно отдал 1см себе. Поправил, отдал и автору ответа.
(6) (7) там проблема в том, чтобы поддерживать реквизит в актуальном состоянии, потому что у платформы нет событий по изменению таблицы, нужно отслеживать все возможные события по смену номенклатуры в строке и добавлению строк.
(9) нету. там 100500 способов изменения этой ТЧ, в т.ч. и программное добавление. Обработчик - это знатный костыль. Тогда уж для ускорения еще и колонку со значением номенклатуры, для которой посчитан реквизит, чтобы сервер не дергать, но тогда если реквизит номенклатуры обновится, поле не обновится. Но это уж ладно. Возможно, придется так и поступить, хотя я думаю, в типовой есть события пересчета итогов документа, к ним подвязаться.
(10) тогда 2 колонки, во второй записывать что первая обновлена, и на клиенте каждые пару секунд проверять вся ли номенклатура из первой колонки обновлена, чтоб каждый раз на сервер без необходимости не бегать)
(22) Ну сделать с ДС. Посмотреть как это выглядит в отладчике, попробовать реализовать тоже для ТЧ.
А вообще на ютуб канале желтого клуба в начале видео "Ошибки в коде 90% программистов", первых минут30-40 как раз что-то подобное описано, но они там условным оформлением отметку обязательности заполнения убирали, ну и да, добавляли колонку без вывода её на форму и заполняли её привязываясь к 4м событиям, если не ошибаюсь...
В общем тупо добавил реквизиты в табличную часть. Розница, редакция 3.0 (3.0.3.147)
Пересчет реквизитов модуль дор_К:
&НаКлиенте
Процедура ПересчитатьРеквизитыРаскраскиНоменклатурыДокумента(Форма, ТаблицаТоваров, ИмяПоляНоменклатуры) Экспорт
М = Новый Массив();
Для Каждого Строка ИЗ ТаблицаТоваров Цикл
ТекНоменклатура = Строка[ИмяПоляНоменклатуры];
М.Добавить(ТекНоменклатура);
КонецЦикла;
РеквизитыВсе = дор_С.ЗначенияРеквизитовОбъектов(М, "дор_Выгодно, дор_МинМаксЗаполнено");
Для Каждого Строка ИЗ ТаблицаТоваров Цикл
ТекНоменклатура = Строка[ИмяПоляНоменклатуры];
РеквизитыТекущие = РеквизитыВсе[ТекНоменклатура];
Если РеквизитыТекущие <> Неопределено Тогда
Строка.дор_МинМаксЗаполнено = РеквизитыТекущие.дор_МинМаксЗаполнено;
Строка.дор_Выгодно = РеквизитыТекущие.дор_Выгодно;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Показать
На сервере Дор_С:
Процедура РаскраситьНоменклатуруСписка(Форма, СписокЗапасы, ПутьКТЧНоменклатуры, ИдентификаторПоляНоменклатуры, ИмяПоляРаскраскиНоменклатуры) Экспорт
Перем УсловноеОформление;
Если ТипЗнч(СписокЗапасы) = Тип("ДинамическийСписок") Тогда
УсловноеОформление = СписокЗапасы.КомпоновщикНастроек.ФиксированныеНастройки.УсловноеОформление;
ПутьКНоменклатуре = ИдентификаторПоляНоменклатуры;
Иначе
//Также нужно добавить реквизиты
УсловноеОформление = Форма.УсловноеОформление;
НовыеРеквизиты = Новый Массив;
НовыеРеквизиты.Добавить(Новый РеквизитФормы("дор_МинМаксЗаполнено", Новый ОписаниеТипов("Булево"), ПутьКТЧНоменклатуры, "", ложь));
НовыеРеквизиты.Добавить(Новый РеквизитФормы("дор_Выгодно", Новый ОписаниеТипов("Булево"), ПутьКТЧНоменклатуры, "", ложь));
Форма.ИзменитьРеквизиты(НовыеРеквизиты);
ПутьКНоменклатуре = ПутьКТЧНоменклатуры; // + ?(ЗначениеЗаполнено(ИдентификаторПоляНоменклатуры), "." + ИдентификаторПоляНоменклатуры, "");
КонецЕсли;
//=== Оформление поля мин-макс
ЭлементОформления = УсловноеОформление.Элементы.Добавить();
Элемент = ЭлементОформления.Оформление.Элементы.Найти("ЦветФона");
Элемент.Значение = WebЦвета.СеребристоСерый;
Элемент.Использование = Истина;
ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.Использование = Истина;
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ПутьКНоменклатуре + ".дор_МинМаксЗаполнено");
ЭлементОтбора.ПравоеЗначение = Ложь;
ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить();
ПолеОформления.Поле = Новый ПолеКомпоновкиДанных(ИмяПоляРаскраскиНоменклатуры);
ПолеОформления.Использование = Истина;
//=== Оформление поля выгодно
ЭлементОформления = УсловноеОформление.Элементы.Добавить();
Элемент = ЭлементОформления.Оформление.Элементы.Найти("ЦветТекста");
Элемент.Значение = WebЦвета.Красный;
Элемент.Использование = Истина;
ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.Использование = Истина;
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ПутьКНоменклатуре + ".дор_Выгодно");
ЭлементОтбора.ПравоеЗначение = истина;
ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить();
ПолеОформления.Поле = Новый ПолеКомпоновкиДанных(ИмяПоляРаскраскиНоменклатуры);
ПолеОформления.Использование = Истина;
КонецПроцедуры
Процедура раскраски используется общая для номенклатуры и документа.
Реквизиты получаются одним типовым запросом по всей номенклатуре документа и обновляются в цикле по строкам.