Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Не найдено поле в условном оформлении формы (программно). Как правильно обратиться?

Не найдено поле в условном оформлении формы (программно). Как правильно обратиться?
Я
   synapce
 
04.06.21 - 13:20
Доброго дня!
У меня есть поле на форме списка = Список.Ссылка.Мой_Реквизит. Значение булево и необходимо его закрасить красным, если оно в значении нет. Условие проще некуда.
Пробовал в настройке условного имя задавать и "список.МойРеквизит", и "ссылка..МойРеквизит" - нифига.
Со стандартными, типа "Дата", "Номер" - все отлично, условное оформление работает.

Но факт в том, что в форме списка, если смотреть не кодом, а через конфигуратор - условное оформление у формы - видно, что он видит только ссылку, а вот реквизиты ссылки в отборе - не видит(
Как исправить такую ситуацию?

Заранее всем спасибо за ответы!
 
 Партнерская программа EFSOL Oblako
   DrZombi
 
1 - 04.06.21 - 13:28
(0) Используете Условное оформление.

Пример:

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


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

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

// Добавляет в коллекцию оформляемых полей компоновки данных новое поле

//
// Параметры:

//    КоллекцияОформляемыхПолей     - коллекция оформляемых полей КД
//    ИмяПоля                        - Строка - имя поля

//
// Возвращаемое значение:

//    ОформляемоеПолеКомпоновкиДанных - созданное поле
//

// Пример:
//     Форма.УсловноеОформление.Элементы[0].Поля

//
Функция ДобавитьОформляемоеПоле(КоллекцияОформляемыхПолей, ИмяПоля) Экспорт
    
    ПолеЭлемента         = КоллекцияОформляемыхПолей.Элементы.Добавить();
    ПолеЭлемента.Поле     = Новый ПолеКомпоновкиДанных(ИмяПоля);

    Возврат ПолеЭлемента;
    
КонецФункции

// Добавить элемент компоновки в контейнер элементов компоновки.

//
// Параметры:

//  ОбластьДобавления - КоллекцияЭлементовОтбораКомпоновкиДанных - контейнер с элементами и группами отбора,
//                                                                 например, Список.Отбор или группа в отборе.

//  ИмяПоля                 - Строка - имя поля компоновки данных (заполняется всегда).
//  ВидСравнения            - ВидСравненияКомпоновкиДанных - вид сравнения.

//  ПравоеЗначение          - Произвольный - сравниваемое значение.
//  Представление           - Строка - представление элемента компоновки данных.

//  Использование           - Булево - использование элемента.
//  РежимОтображения        - РежимОтображенияЭлементаНастройкиКомпоновкиДанных - режим отображения.

//  ИдентификаторПользовательскойНастройки - Строка - см. ОтборКомпоновкиДанных.ИдентификаторПользовательскойНастройки
//                                                    в синтакс-помощнике.

// Возвращаемое значение:
//  ЭлементОтбораКомпоновкиДанных - элемент компоновки.

//
Функция ДобавитьЭлементКомпоновки(ОбластьДобавления,
                                    Знач ИмяПоля,
                                    Знач ВидСравнения,
                                    Знач ПравоеЗначение = Неопределено,
                                    Знач Представление  = Неопределено,
                                    Знач Использование  = Неопределено,
                                    знач РежимОтображения = Неопределено,
                                    знач ИдентификаторПользовательскойНастройки = Неопределено) Экспорт
    
    Элемент = ОбластьДобавления.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    Элемент.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ИмяПоля);
    Элемент.ВидСравнения = ВидСравнения;
    
    Если РежимОтображения = Неопределено Тогда
        Элемент.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;
    Иначе
        Элемент.РежимОтображения = РежимОтображения;
    КонецЕсли;
    
    Если ПравоеЗначение <> Неопределено Тогда
        Элемент.ПравоеЗначение = ПравоеЗначение;
    КонецЕсли;
    
    Если Представление <> Неопределено Тогда
        Элемент.Представление = Представление;
    КонецЕсли;
    
    Если Использование <> Неопределено Тогда
        Элемент.Использование = Использование;
    КонецЕсли;
    
    // Важно: установка идентификатора должна выполняться

    // в конце настройки элемента, иначе он будет скопирован

    // в пользовательские настройки частично заполненным.

    Если ИдентификаторПользовательскойНастройки <> Неопределено Тогда
        Элемент.ИдентификаторПользовательскойНастройки = ИдентификаторПользовательскойНастройки;
    ИначеЕсли Элемент.РежимОтображения <> РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный Тогда
        Элемент.ИдентификаторПользовательскойНастройки = ИмяПоля;
    КонецЕсли;
    
    Возврат Элемент;
    
КонецФункции
   DrZombi
 
2 - 04.06.21 - 13:30
+(0) На поле списка "Мой_Реквизит" должна быть галочка "Использовать всегда"
   synapce
 
3 - 04.06.21 - 13:35
(1) делаю также, с помощью программного кода. Пишет "Поле не найдено".
(2) Галочка стоит только на Ссылке. У "Мой_реквизит", который её дочерний элемент- нет галки и нет возможности поставить галку (
   acht
 
4 - 04.06.21 - 13:42
(0) Произвольный запрос
   synapce
 
5 - 04.06.21 - 13:43
(4) например?
   synapce
 
6 - 04.06.21 - 13:43
(4) запросом выцедить поле и присвоить его реквизиту?
   acht
 
7 - 04.06.21 - 13:59
(6) Точно. Вытащить его в отдельную колонку, убрать ее из пользовательских настроек и т.п.
   synapce
 
8 - 04.06.21 - 14:04
(7) форма списка же. Каждый раз при открытии - будет выполнять запрос? оч замедлит работу программы
   acht
 
9 - 04.06.21 - 14:10
(8) Ты понимаешь, как работают динамические списки?
   synapce
 
10 - 04.06.21 - 14:13
(9) мог бы этот момент прояснить? возможно, что-то путаю, не отрицаю)
   DrZombi
 
11 - 04.06.21 - 14:19
(3) Код покажи.
Картинку с реквизитами списка тоже, снап-шоть. И тут выложи.
   acht
 
12 - 04.06.21 - 14:22
(10) Там внутри куски СКД. Если ты указываешь произвольный запрос, то он являеся текстом запроса набора-запроса. Если не указываешь - он генерируется автоматически по основной таблице. Потом этот запрос, как и в СКД, модифицируется с разными отборами и группировками и уходит в SQL.
Поэтому запрос к базе выполняется всегда, при каждом обновлении списка. Произвольный он или нет - роли не играет никакой. Так что да - при открытии будет выполнен запрос.

Тебе и предлагают повлиять на неявную схему компоновки, изменив набор данных.
   synapce
 
13 - 04.06.21 - 14:24
(11) делаю  в процедуре журнала документов отпуска

&НаСервере
Процедура ш_ПриОткрытииПередНаСервере()
    
        
    УО = Список.КомпоновщикНастроек.Настройки.УсловноеОформление.Элементы;
    Если УО.Количество() > 0 Тогда
        
        Сообщение = Новый СообщениеПользователю;
        Сообщение.Текст = "Условное оформление уже задано. Команда не выполнена.";
        Сообщение.Сообщить();
        Возврат;
    КонецЕсли;
    ЭлементУО = УО.Добавить();
    // Оформление: цвет фона – светлый лосось

    
    ЭлементУО.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.Красный);
    //ЭлементУО.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь);

    // Условие: поле НаКонтроле равно Истина

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

Скриншот не прилагается)
   acht
 
14 - 04.06.21 - 14:31
(13) Оформляемые поля не указаны.

И если поле "Статус" у тебя в шапке документа, то оно по умолчанию должно быть доступно непосредственно. Не надо ничего через ссылку получать, надо на него "использовать всегда" поставить.
   synapce
 
15 - 04.06.21 - 14:40
(14) на нем "использовать всегда" недоступно, даже нет квадрата, куда галку ставить. Оно есть только у ссылки, уже упоминал об этом.
По поводу оформляемых полей - я говорю ,с другими полями работает, которые вставлены в форму списка по умолчанию - с ними все работает - фильтрует, раскрашивает. А здесь - непонятно, как к нему обратиться.
   acht
 
16 - 04.06.21 - 14:47
(15) Скриншот с полями
   synapce
 
17 - 04.06.21 - 14:49
(16) здесь не получается отправить скрин, почему-то. Могу с вами отдельно списаться где-то временно?
   acht
 
18 - 04.06.21 - 14:53
(17) Нет уж, давай перед всеми раскрывайся.
Выбери хостинг картинок по вкусу, туда скриншот, сюда - ссылку.
   synapce
 
19 - 04.06.21 - 14:58
(18) https://ibb.co/bQb9YGv
пожалуйста)
   acht
 
20 - 04.06.21 - 15:05
(19) Так он у тебя принадлежит только одну виду документа что-ли? Ну все, вытаскивай его в графу журнала или пиши произвольный запрос с "ВЫБОР КОГДА" или на крайний случай вешай обработчик ПриПолученииДанныхНаСервере
   synapce
 
21 - 04.06.21 - 15:10
(20) Работает, я просто не сразу понял, что ты имел ввиду)
думал, где-то отдельно надо запрос замутить, а нужн было  в самом динамическом списке вынести поле, как отдельный реквизит и уже обращаться к нему)
спасиб)

Тему можно считать закрытой.


Список тем форума
 
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.