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

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

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

Пример:

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


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

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

// Добавляет в коллекцию оформляемых полей компоновки данных новое поле
//
// Параметры:
//    КоллекцияОформляемыхПолей     - коллекция оформляемых полей КД
//    ИмяПоля                        - Строка - имя поля
//
// Возвращаемое значение:
//    ОформляемоеПолеКомпоновкиДанных - созданное поле
//
// Пример:
//     Форма.УсловноеОформление.Элементы[0].Поля
//
Функция ДобавитьОформляемоеПоле(КоллекцияОформляемыхПолей, ИмяПоля) Экспорт
    
    ПолеЭлемента         = КоллекцияОформляемыхПолей.Элементы.Добавить();
    ПолеЭлемента.Поле     = Новый ПолеКомпоновкиДанных(ИмяПоля);

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

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

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

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

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

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

Тему можно считать закрытой.
Закон Брукера: Даже маленькая практика стоит большой теории.