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

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

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

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

ВидЭлемента: КомпонентИнтерфейса
Ид: b0e60afa-a5ed-4f1e-b34a-73a3962d43e9
Имя: ФормаПолеВводаФлажок
ОбластьВидимости: ВПодсистеме
Наследует:
    Тип: Форма
    Содержимое:
        Тип: ПроизвольныйШаблонФормы
        Содержимое:
            Тип: ФиксированнаяГруппа
            Ориентация: Горизонтальная
            Содержимое:
                -
                    Тип: Флажок
                    Имя: МойФлажок
                -
                    Тип: ПолеВвода<Строка>
                    Имя: МоеПолеВвода
                    Видимость: =Компоненты.МойФлажок.Значение

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

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

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

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

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

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

ВидЭлемента: КомпонентИнтерфейса
Ид: b0e60afa-a5ed-4f1e-b34a-73a3962d43e9
Имя: ФормаПолеВводаФлажок
Наследует:
    Тип: Форма
    Содержимое:
        Тип: ПроизвольныйШаблонФормы
        Содержимое:
            Тип: ФиксированнаяГруппа
            Ориентация: Горизонтальная
            Содержимое:
                -
                    Тип: Флажок
                    Имя: МойФлажок
                -
                    Тип: ПолеВвода<Строка>
                    Имя: МоеПолеВвода
                    Доступность: =Компоненты.МойФлажок.Значение
                    ЗамещающийТекст: =Компоненты.МойФлажок.Значение.Представление()

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

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

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

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

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

ВидЭлемента: КомпонентИнтерфейса
Ид: b0e60afa-a5ed-4f1e-b34a-73a3962d43e9
Имя: ФормаПолеВводаФлажок
Наследует:
    Тип: Форма
    Содержимое:
        Тип: ПроизвольныйШаблонФормы
        Содержимое:
            Тип: ФиксированнаяГруппа
            Ориентация: Горизонтальная
            Содержимое:
                -
                    Тип: Флажок
                    Имя: МойФлажок
                -
                    Тип: ПолеВвода<Строка>
                    Имя: МоеПолеВвода
                    Доступность: =Компоненты.МойФлажок.Значение
                    ЗамещающийТекст: =ЗначениеДляПоля(Компоненты.МойФлажок.Значение)

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

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

ВидЭлемента: КомпонентИнтерфейса
Ид: b0e60afa-a5ed-4f1e-b34a-73a3962d43e9
Имя: ФормаПолеВводаФлажок
ОбластьВидимости: ВПодсистеме
Наследует:
    Тип: Форма
    Содержимое:
        Тип: ПроизвольныйШаблонФормы
        Содержимое:
            Тип: ФиксированнаяГруппа
            Ориентация: Горизонтальная
            Содержимое:
                -
                    Тип: ФлажокИзПроекта
                    Имя: МойФлажокИзПроекта
                -
                    Тип: ПолеВвода<Строка>
                    Имя: МоеПолеВвода
                    Доступность: =Компоненты.МойФлажокИзПроекта.Значение
                    ЗамещающийТекст: =Компоненты.МойФлажокИзПроекта.СвоеЗначениеСтрокой()

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

@ВПодсистеме
метод СвоеЗначениеСтрокой(): Строка
    выбор Значение
    когда Истина
        возврат "Поле доступно"
    иначе
        возврат "Поле недоступно"
    ;
;

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

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

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

ВидЭлемента: КомпонентИнтерфейса
Ид: 7670d199-33a3-4eb6-943e-a631b6d24be0
Имя: ФормаТаблицы
ОбластьВидимости: ВПодсистеме
Наследует:
    Тип: Форма
    Содержимое:
        Тип: ШаблонФормыСРазделами
        ОсновнойРаздел:
            Тип: ОбластьРазделаФормы
            Содержимое:
                -
                    Тип: Таблица<ДинамическийСписок>
                    Имя: ФормаТаблицы
                    Источник:
                        ОсновнаяТаблица:
                            Таблица: Сотрудники
                        Поля:
                            -
                                Тип: ПолеДинамическогоСписка
                                Выражение: Код
                            -
                                Тип: ПолеДинамическогоСписка
                                Выражение: Фио
                            -
                                Тип: ПолеДинамическогоСписка
                                Выражение: Возраст
                    Колонки:
                        -
                            Тип: СтандартнаяКолонкаТаблицы<СтрокаДинамическогоСписка>
                            Имя: Код
                            ПолеЗначения: Код
                        -
                            Тип: СтандартнаяКолонкаТаблицы<СтрокаДинамическогоСписка>
                            Имя: Фио
                            ПолеЗначения: Фио
                        -
                            Тип: СтандартнаяКолонкаТаблицы<СтрокаДинамическогоСписка>
                            Имя: Возраст
                            ПолеЗначения: Возраст
                            ОценкаИнформации: =ОформлениеКолонки(ДанныеСтроки)

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

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

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

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

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

Вычисляемые выражения команд строки таблицы

Вычисляемые свойства можно также описывать для команд строки и команд над отмеченными строками в таблице (ФрагментКомандногоИнтерфейса). Вы можете выбрать подходящее оформление для команды строки или переопределить поведение команды в зависимости от содержимого строки.

  • Команда строки имеет параметр типа ТипИсточника.ТипДанных и содержит данные строки, для которой формируется команда.
  • Команда над отмеченными строками имеет параметр типа Массив<ТипИсточника.ТипИдентификатора> и содержит массив идентификаторов отмеченных строк.

Следующий пример демонстрирует вычисляемые выражения команд для строк таблицы на примере структуры МояСтруктура с полями Статус, Код, Задача и Ответственный.

Реализованы команды обработки выбранных строк, которые инвертируют статус задач и соответсвующим образом меняют изображение элемента команды:
  • ОбработчикКоманды для одной строки

  • ОбработчикМассовойКоманды для нескольких выделенных строк

ВидЭлемента: КомпонентИнтерфейса
Ид: 2684c391-d6cf-4854-b2f8-0cafb2264794
Имя: МояФорма
ОбластьВидимости: ВПроекте
Свойства:
    -
        Имя: ИспользоватьКомандыНадОтмеченными
        Тип: Булево
        ЗначениеПоУмолчанию: Ложь
Наследует:
    Тип: Форма
    Заголовок: Таблицы
    Содержимое:
        Тип: ШаблонФормыСРазделами
        ОсновнойРаздел:
            Тип: ОбластьРазделаФормы
            Содержимое:
                -
                    Тип: ФиксированнаяГруппа
                    Ориентация: Вертикальная
                    Содержимое:
                        -
                            Тип: Таблица<ИсточникДанныхМассив<МояСтруктура>>
                            Имя: МояТаблица
                            ТолькоЧтение: Истина
                            КомандыСтроки:
                                Тип: ФрагментКомандногоИнтерфейса<КомандаСПараметром<Массив<МояСтруктура>>|КомандаСПараметром<МояСтруктура>>
                                Элементы:
                                    -
                                        Тип: КомандаСПараметром<МояСтруктура>
                                        Представление: '= ДанныеСтроки.Статус ? "Остановить" : "Запустить"'
                                        Изображение: '= ДанныеСтроки.Статус ? Ресурс{Стоп.svg}.Ссылка : Ресурс{Старт.svg}.Ссылка'
                                        Обработчик: ОбработчикКоманды
                            КомандыНадОтмеченнымиСтроками:
                                Тип: ФрагментКомандногоИнтерфейса<КомандаСПараметром<Массив<МояСтруктура>>>
                                Элементы:
                                    -
                                        Тип: КомандаСПараметром<Массив<МояСтруктура>>
                                        Представление: =ПредставлениеМассовойКомандыСтроки(ОтмеченныеСтроки)
                                        Изображение: =ИзображениеМассовойКоманды(ОтмеченныеСтроки)
                                        Обработчик: ОбработчикМассовойКоманды
                            ИспользоватьОтметкиСтрок: Истина
                            Колонки:
                                -
                                    Тип: СтандартнаяКолонкаТаблицы<МояСтруктура>
                                    Имя: Статус
                                    ПолеЗначения: Статус
                                -
                                    Тип: СтандартнаяКолонкаТаблицы<МояСтруктура>
                                    Имя: Код
                                    ПолеЗначения: Код
                                -
                                    Тип: СтандартнаяКолонкаТаблицы<МояСтруктура>
                                    Имя: Задача
                                    ПолеЗначения: Задача
                                -
                                    Тип: СтандартнаяКолонкаТаблицы<МояСтруктура>
                                    Имя: Ответственный
                                    ПолеЗначения: Ответственный
Заполнение данных структуры МояСтруктура в модуле формы может выглядеть следующим образом:
@Обработчик
метод ПослеСоздания()
    ИсточникДанныхМоейТаблицы().Данные.ДобавитьВсе(ПолучитьДанныеДляТаблицы())
;

метод ИсточникДанныхМоейТаблицы(): ИсточникДанныхМассив<МояСтруктура>
    возврат Компоненты.МояТаблица.Источник
;

@НаСервере @ДоступноСКлиента
статический метод ПолучитьДанныеДляТаблицы(): ЧитаемыйМассив<МояСтруктура> 
    знч ДанныеДляТаблицы = <МояСтруктура>[]
    
    ДанныеДляТаблицы.Добавить(новый МояСтруктура(Статус = Истина, Код = 101, Задача = "Планирование", Ответственный = "Иванов И. И."))
    ДанныеДляТаблицы.Добавить(новый МояСтруктура(Статус = Истина, Код = 102, Задача = "Реализация", Ответственный = "Петров П. П."))
    ДанныеДляТаблицы.Добавить(новый МояСтруктура(Статус = Истина, Код = 103, Задача = "Проверка", Ответственный = "Сидоров С. С."))
    
    возврат ДанныеДляТаблицы
;
В модуле формы методы ОбработчикКоманды() и ОбработчикМассовойКоманды() могут выглядеть следующим образом:
// Метод обрабатывает данные одной строки
метод ОбработчикКоманды(Команда: КомандаСПараметром<МояСтруктура>, Параметр: МояСтруктура)
    Параметр.Статус = не Параметр.Статус
;    

// Метод обрабатывает данные нескольких выделенных строк
метод ОбработчикМассовойКоманды(Команда: КомандаСПараметром<Массив<МояСтруктура>>, Параметр: Массив<МояСтруктура>)
    пер НовыйСтатус = ТолькоОстановленные(Параметр)
    для Строка из Параметр
        Строка.Статус = НовыйСтатус
    ;
;

// Метод меняет отображаемое имя команды
метод ПредставлениеМассовойКомандыСтроки(ДанныеОтмеченныхСтрок: Массив<МояСтруктура>): Строка
    если ТолькоОстановленные(ДанныеОтмеченныхСтрок)
        возврат "Запустить (команда строки)"
    иначе
        возврат "Остановить (команда строки)"
    ;
;

// Метод меняет отображаемое изображение команды
метод ИзображениеМассовойКоманды(ДанныеОтмеченныхСтрок: Массив<МояСтруктура>): ДвоичныйОбъект.Ссылка
    если ТолькоОстановленные(ДанныеОтмеченныхСтрок)
        возврат Ресурс{Старт.svg}.Ссылка
    иначе
        возврат Ресурс{Стоп.svg}.Ссылка
    ;
;

// Метод определяет, все ли выделенные строки имеют одинаковый статус
метод ТолькоОстановленные(ДанныеСтроки: Массив<МояСтруктура>|МояСтруктура): Булево
    пер ТолькоОстановленные = Истина
    если ДанныеСтроки это Массив<МояСтруктура>
        для Объект из (ДанныеСтроки как Массив<МояСтруктура>)
            если Объект.Статус
                ТолькоОстановленные = Ложь
            ;
        ;
    иначе
        если (ДанныеСтроки как МояСтруктура).Статус
            ТолькоОстановленные = Ложь
        ;
    ;
    возврат ТолькоОстановленные
;