Вычисляемые свойства экземпляров компонентов

Свойства экземпляров компонентов интерфейса могут быть заданы не конкретным значением, а некоторой функцией. Иными словами они могут быть вычисляемыми. Прямым аналогом этого являются формулы ячеек в Excel.

Например, в форме расположены поле ввода и флажок.

Вы можете указать, что видимость поля ввода будет зависеть от состояния флажка, установлен он или нет.

ВидЭлемента: КомпонентИнтерфейса
Ид: 29354d98-2467-4f72-a2b0-985e28106372
Имя: ФормаПолеВводаФлажок
Наследует:
    Тип: Форма
    ВключатьВАвтоИнтерфейс: Ложь
    Содержимое:
        Тип: ОбычнаяГруппа
        Ориентация: Горизонтальная
        Содержимое:
            -
                Тип: Флажок
                Имя: МойФлажок
            -
                Тип: ПолеВвода
                Имя: МоеПолеВвода
                Видимость: =Компоненты.МойФлажок.Значение

Важным моментом здесь является то, что свойства компонентов не только вычисляемые, но и наблюдаемые. То есть при их изменении (МойФлажок.Значение) автоматически выполняется пересчет зависящих от них вычисляемых свойств (МоеПолеВвода.Видимость).

отслеживает изменение свойств компонентов и автоматически выполняет зависящую от них системную логику, например:

  • обновление интерфейса, если свойство влияет на внешний вид компонента;
  • обновление данных, если свойство влияет на их выборку;
  • обновление отображаемых в компоненте данных при изменении свойства, ссылающегося на эти данные.
В результате пример будет работать следующим образом:
  • если флажок сброшен, то виден только он;
  • если флажок установлен, то виден он и поле ввода.

Методы значений

Как вы наверное заметили Компоненты.МойФлажок.Значение — это конструкция встроенного языка, которая обращается к экземпляру типа ФормаПолеВводаФлажок.Компоненты (подробнее) и получает от него именованный компонент содержимого МойФлажок и далее значение этого флажка типа Булево.

Это говорит о том, что при описании свойств компонентов вы можете использовать и другие возможности встроенного языка, например, методы значений.

В этом примере значение флажка регулирует доступность поля ввода, а в само поле ввода записывается представление значения флажка:

ВидЭлемента: КомпонентИнтерфейса
Ид: 29354d98-2467-4f72-a2b0-985e28106372
Имя: ФормаПолеВводаФлажок
Наследует:
    Тип: Форма
    ВключатьВАвтоИнтерфейс: Ложь
    Содержимое:
        Тип: ОбычнаяГруппа
        Ориентация: Горизонтальная
        Содержимое:
            -
                Тип: Флажок
                Имя: МойФлажок
            -
                Тип: ПолеВвода
                Имя: МоеПолеВвода
                Доступность: =Компоненты.МойФлажок.Значение
                Значение: =Компоненты.МойФлажок.Значение.Представление()

Пример работает следующим образом:

Методы модулей

Если для вычисления значения свойства компонента вам требуется более сложный алгоритм, вы можете разместить его в одном из модулей. Например в модуле самого компонента интерфейса, в данном случае в модуле формы ФормаПолеВводаФлажок:

метод ЗначениеДляПоля(Флажок: Булево): Строка
    выбор Флажок
    когда Истина
        возврат "Поле доступно"
    иначе
        возврат "Поле недоступно"
    ;
;

А в свойстве компонента просто обратиться к этому методу:

ВидЭлемента: КомпонентИнтерфейса
Ид: 29354d98-2467-4f72-a2b0-985e28106372
Имя: ФормаПолеВводаФлажок
Наследует:
    Тип: Форма
    ВключатьВАвтоИнтерфейс: Ложь
    Содержимое:
        Тип: ОбычнаяГруппа
        Ориентация: Горизонтальная
        Содержимое:
            -
                Тип: Флажок
                Имя: МойФлажок
            -
                Тип: ПолеВвода
                Имя: МоеПолеВвода
                Доступность: =Компоненты.МойФлажок.Значение
                Значение: =ЗначениеДляПоля(Компоненты.МойФлажок.Значение) 

Пример работает следующим образом:

Если, например, в качестве флажка вы хотите использовать не стандартный компонент, экземпляр которого вы описываете прямо тут, а компонент интерфейса, добавленный в проект, то вы тоже можете обращаться к методам, описанным в его модулях. Например, к методу СвоеЗначениеСтрокой():

Единственное, о чем нужно позаботиться, это о том, чтобы метод был виден снаружи модуля. Например, с помощью аннотации @подсистема (подробнее):

@подсистема
метод СвоеЗначениеСтрокой(): Строка

    выбор Значение
    когда Истина
        возврат "Поле доступно"
    иначе
        возврат "Поле недоступно"
    ;
;

Вычисляемые свойства таблиц

При описании вычисляемых свойств колонок таблицы (СтандартнаяКолонкаТаблицы, ПроизвольнаяКолонкаТаблицы) вы можете использовать дополнительный параметр ДанныеСтроки. В него передаются данные строки таблицы, тип которых зависит от источника таблицы.

Например, источником таблицы может являться динамический список и тогда ДанныеСтроки будут иметь тип СтрокаДинамическогоСписка. Эти данные вы можете использовать для того, чтобы выбрать подходящее оформление для колонки Возраст, например:

ВидЭлемента: КомпонентИнтерфейса
Ид: 1612399b-4b7d-4dda-82e0-9d4110d9bcc8
Имя: ФормаТаблица
Наследует:
    Тип: Форма
    ВключатьВАвтоИнтерфейс: Ложь
    Содержимое:
        Тип: Таблица
        Имя: Сетка
        Источник:
            Тип: ДинамическийСписок
            ОсновнаяТаблица:
                Таблица: Сотрудники
            Поля:
                -
                    Выражение: Код
                -
                    Выражение: ФИО
                -
                    Выражение: Возраст
            Порядок: 
                -
                    Тип: ЭлементПорядка
                    Поле: Код
                    НаправлениеСортировки: ПоВозрастанию                            
        Колонки:
            -
                Тип: СтандартнаяКолонкаТаблицы
                Заголовок: Код
                ПолеЗначения: Код
            -
                Тип: СтандартнаяКолонкаТаблицы
                Заголовок: ФИО
                ПолеЗначения: ФИО
            -
                Тип: СтандартнаяКолонкаТаблицы
                Заголовок: Возраст
                ПолеЗначения: Возраст
                СтилиОформления: =ОформлениеКолонки(ДанныеСтроки)

В модуле формы метод ОформлениеКолонки() может выглядеть следующим образом:

метод ОформлениеКолонки(ДанныеСтроки: Объект?):  Массив<СтильОформления>
    если ((ДанныеСтроки как СтрокаДинамическогоСписка).Данные["Возраст"] как Число) < 40
        возврат [СтильОформления.ЦветКоннотацияПоложительная]
    иначе
        возврат [СтильОформления.ЦветКоннотацияОтрицательная]
    ;
;

Здесь сначала ДанныеСтроки нужно привести к типу СтрокаДинамическогоСписка, так как не может самостоятельно определить их тип. После этого возраст, полученный из соответствия Данные, тоже нужно привести к типу Число, чтобы была возможность использовать его в операции сравнения.

Метод возвращает один из стилей оформления, которые применит к колонке таблицы.

В результате возраст меньше сорока будет показан зеленым цветом, а остальные значения — красным.