Вычисляемые свойства экземпляров компонентов
Свойства экземпляров компонентов интерфейса могут задаваться не конкретным значением, а некоторой функцией. Иными словами, они могут быть вычисляемыми. Прямым аналогом этого являются формулы ячеек в Excel.
Например, в форме расположены поле ввода и флажок:
Вы можете указать, что видимость поля ввода будет зависеть от состояния флажка: установлен он или нет.
ВидЭлемента: КомпонентИнтерфейса
Ид: b0e60afa-a5ed-4f1e-b34a-73a3962d43e9
Имя: ФормаПолеВводаФлажок
ОбластьВидимости: ВПодсистеме
Наследует:
Тип: Форма
Содержимое:
Тип: ПроизвольныйШаблонФормы
Содержимое:
Тип: ФиксированнаяГруппа
Ориентация: Горизонтальная
Содержимое:
-
Тип: Флажок
Имя: МойФлажок
-
Тип: ПолеВвода<Строка>
Имя: МоеПолеВвода
Видимость: =Компоненты.МойФлажок.Значение
Важным моментом здесь является то, что свойства компонентов не только вычисляемые, но и наблюдаемые. То есть при их изменении (МойФлажок.Значение
) автоматически выполняется пересчет зависящих от них вычисляемых свойств (МоеПолеВвода.Видимость
).
«1С:Шина» отслеживает изменение свойств компонентов и автоматически выполняет зависящую от них системную логику, например:
- обновление интерфейса, если свойство влияет на внешний вид компонента;
- обновление данных, если свойство влияет на их выборку;
- обновление отображаемых в компоненте данных при изменении свойства, ссылающегося на эти данные.
В результате пример будет работать следующим образом:
- если флажок сброшен, то виден только он;
- если флажок установлен, то виден он и поле ввода.
Методы значений
Компоненты.МойФлажок.Значение
— это конструкция встроенного языка, которая обращается к экземпляру типа ФормаПолеВводаФлажок.Компоненты
(подробнее) и получает от него именованный компонент содержимого МойФлажок
, а затем значение этого флажка типа Булево
. Это говорит о том, что при описании свойств компонентов вы можете использовать и другие возможности встроенного языка, например, методы значений.
В следующем примере значение флажка регулирует доступность поля ввода, а в замещающий текст поля ввода записывается представление значения флажка:
ВидЭлемента: КомпонентИнтерфейса
Ид: b0e60afa-a5ed-4f1e-b34a-73a3962d43e9
Имя: ФормаПолеВводаФлажок
Наследует:
Тип: Форма
Содержимое:
Тип: ПроизвольныйШаблонФормы
Содержимое:
Тип: ФиксированнаяГруппа
Ориентация: Горизонтальная
Содержимое:
-
Тип: Флажок
Имя: МойФлажок
-
Тип: ПолеВвода<Строка>
Имя: МоеПолеВвода
Доступность: =Компоненты.МойФлажок.Значение
ЗамещающийТекст: =Компоненты.МойФлажок.Значение.Представление()
Пример работает следующим образом:
Методы модулей
Если для вычисления значения свойства компонента требуется более сложный алгоритм, вы можете разместить его в одном из модулей. Например, в модуле самого компонента интерфейса, в данном случае в модуле формы ФормаПолеВводаФлажок:
// Метод возвращает информацию о доступности поля ввода в зависимости от значения флажка
метод ЗначениеДляПоля(Флажок: Булево): Строка
выбор Флажок
когда Истина
возврат "Поле доступно"
иначе
возврат "Поле недоступно"
;
;
А в свойс тве компонента просто обратиться к этому методу:
ВидЭлемента: КомпонентИнтерфейса
Ид: b0e60afa-a5ed-4f1e-b34a-73a3962d43e9
Имя: ФормаПолеВводаФлажок
Наследует:
Тип: Форма
Содержимое:
Тип: ПроизвольныйШаблонФормы
Содержимое:
Тип: ФиксированнаяГруппа
Ориентация: Горизонтальная
Содержимое:
-
Тип: Флажок
Имя: МойФлажок
-
Тип: ПолеВвода<Строка>
Имя: МоеПолеВвода
Доступность: =Компоненты.МойФлажок.Значение
ЗамещающийТекст: =ЗначениеДляПоля(Компоненты.МойФлажок.Значение)
Пример работает следующим образом:
Если, например, в качестве флажка вы хотите использовать не стандартный компонент, экземпляр которого вы описываете прямо тут, а компонент интерфейса, добавленный в проект, то таким же образом вы можете обращаться к методам, описанным в его модулях. Например, к методу СвоеЗначениеСтрокой()
элемента проекта ФлажокИзПроекта типа Флажок
:
ВидЭлемента: КомпонентИнтерфейса
Ид: b0e60afa-a5ed-4f1e-b34a-73a3962d43e9
Имя: ФормаПолеВводаФлажок
ОбластьВидимости: ВПодсистеме
Наследует:
Тип: Форма
Содержимое:
Тип: ПроизвольныйШаблонФормы
Содержимое:
Тип: ФиксированнаяГруппа
Ориентация: Горизонтальная
Содержимое:
-
Тип: ФлажокИзПроекта
Имя: МойФлажокИзПроекта
-
Тип: ПолеВвода<Строка>
Имя: МоеПолеВвода
Доступность: = Компоненты.МойФлажокИзПроекта.Значение
ЗамещающийТекст: = Компоненты.МойФлажокИзПроекта.СвоеЗначениеСтрокой()
Единственное, о чем нужно позаботиться, — это о том, чтобы метод был виден снаружи модуля. Например, с помощью аннотации @ВПодсистеме
(подробнее):
@ВПодсистеме
метод СвоеЗначениеСтрокой(): Строка
выбор Значение
когда Истина
возврат "Поле доступно"
иначе
возврат "Поле недоступно"
;
;
Вычисляемые свойства колонок таблиц
При описании вычисляемых свойств колонок таблицы (СтандартнаяКолонкаТаблицы, ПроизвольнаяКолонкаТаблицы) вы можете использовать дополнительный параметр ДанныеСтроки. В него передаются данные строки таблицы, тип которых зависит от источника таблицы.
Например, источником таблицы может являться динамический список. Тогда ДанныеСтроки будут иметь тип СтрокаДинамическогоСписка
. Эти данные вы можете использовать для того, чтобы выбрать подходящее оформление для колонки Возраст. Например:
ВидЭлемента: КомпонентИнтерфейса
Ид: 7670d199-33a3-4eb6-943e-a631b6d24be0
Имя: ФормаТаблицы
ОбластьВидимости: ВПодсистеме
Наследует:
Тип: Форма
Содержимое:
Тип: ШаблонФормыСРазделами
ОсновнойРаздел:
Тип: ОбластьРазделаФормы
Содержимое:
-
Тип: Таблица<ДинамическийСписок>
Имя: ФормаТаблицы
Источник:
ОсновнаяТаблица:
Таблица: Сотрудники
Поля:
-
Тип: ПолеДинамическогоСписка
Выражение: Код
-
Тип: ПолеДинамическогоСписка
Выражение: Фио
-
Тип: ПолеДинамическогоСписка
Выражение: Возраст
Колонки:
-
Тип: СтандартнаяКолонкаТаблицы<СтрокаДинамическогоСписка>
Имя: Код
ПолеЗначения: Код
-
Тип: СтандартнаяКолонкаТаблицы<СтрокаДинамическогоСписка>
Имя: Фио
ПолеЗначения: Фио
-
Тип: СтандартнаяКолонкаТаблицы<СтрокаДинамическогоСписка>
Имя: Возраст
ПолеЗначения: Возраст
ОценкаИнформации: =ОформлениеКолонки(ДанныеСтроки)
В модуле формы метод ОформлениеКолонки()
может выглядеть следующим образом:
метод ОформлениеКолонки(ДанныеСтроки: СтрокаДинамическогоСписка): ОценкаИнформации
если (ДанныеСтроки.Данные["Возраст"] как Число) < 40
возврат ОценкаИнформации.Положительная
иначе
возврат ОценкаИнформации.Отрицательная
;
;
Возраст, полученный из соответствия Данные
, нужно привести к типу Число
, чтобы была возможность использовать его в операции сравнения.
Метод возвращает элемент перечисления ОценкаИнформации
, который «1С:Шина» применит к колонке таблицы.
В результате возраст меньше сорока будет показан зеленым цветом, а остальные значения — красным.
Вычисляемые выражения команд строки таблицы
Вычисляемые свойства можно также описывать для команд строки и команд над отмеченными строками в таблице (ФрагментКомандногоИнтерфейса). Вы можете выбрать подходящее оформление для команды строки или переопределить поведение команды в зависимости от содержимого строки.
- Команда строки имеет параметр типа
ТипИсточника.ТипДанных
и содержит данные строки, для которой формируется команда. - Команда над отмеченными строками имеет параметр типа
Массив<ТипИсточника.ТипИдентификатора>
и содержит массив идентификаторов отмеченных строк.
Следующий пример демонстрирует вычисляемые выражения команд для строк таблицы на примере структуры МояСтруктура
с полями Статус
, Код
, Задача
и Ответственный
.
Реализованы команды обработки выбранных строк, которые инвертируют статус задач и соответсвующим образом меняют изображение элемента команды:
-
ОбработчикКоманды
для одной строки -
ОбработчикМассовойКоманды
для нескольких выделенных строк
ВидЭлемента: КомпонентИнтерфейса
Ид: 2684c391-d6cf-4854-b2f8-0cafb2264794
Имя: МояФорма
ОбластьВидимости: ВПроекте
Свойства:
-
Имя: ИспользоватьКомандыНадОтмеченными
Тип: Булево
ЗначениеПоУмолчанию: Ложь
Наследует:
Тип: Форма
Заголовок: Таблицы
Содержимое:
Тип: ШаблонФормыСРазделами
ОсновнойРаздел:
Тип: ОбластьРазделаФормы
Содержимое:
-
Тип: ФиксированнаяГруппа
Ориентация: Вертикальная
Содержимое:
-
Тип: Таблица<ИсточникДанныхМассив<МояСтруктура>>
Имя: МояТаблица
ТолькоЧтение: Истина
КомандыСтроки:
Тип: ФрагментКомандногоИнтерфейса<КомандаСПараметром<Массив<МояСтруктура>>|КомандаСПараметром<МояСтруктура>>
Элементы:
-
Тип: КомандаСПараметром<МояСтруктура>
Представление: '= ДанныеСтроки.Статус ? "Остановить" : "Запустить"'
Изображение: '= ДанныеСтроки.Статус ? Ресурс{Стоп.svg}.Ссылка : Ресурс{Старт.svg}.Ссылка'
Обработчик: ОбработчикКоманды
КомандыНадОтмеченнымиСтроками:
Тип: ФрагментКомандногоИнтерфейса<КомандаСПараметром<Массив<МояСтруктура>>>
Элементы:
-
Тип: КомандаСПараметром<Массив<МояСтруктура>>
Представление: =ПредставлениеМассовойКомандыСтроки(ОтмеченныеСтроки)
Изображение: =ИзображениеМассовойКоманды(ОтмеченныеСтроки)
Обработчик: ОбработчикМассовойКоманды
ИспользоватьОтметкиСтрок: Истина
Колонки:
-
Тип: СтандартнаяКолонкаТаблицы<МояСтруктура>
Имя: Статус
ПолеЗначения: Статус
-
Тип: СтандартнаяКолонкаТаблицы<МояСтруктура>
Имя: Код
ПолеЗначения: Код
-
Тип: СтандартнаяКолонкаТаблицы<МояСтруктура>
Имя: Задача
ПолеЗначения: Задача
-
Тип: СтандартнаяКолонкаТаблицы<МояСтруктура>
Имя: Ответственный
ПолеЗначения: Ответственный
Заполнение данных структуры МояСтруктура
в модуле формы может выглядеть следующим образом:
@Обработчик
метод ПослеСоздания()
ИсточникДанныхМоейТаблицы().Данные.ДобавитьВсе(ПолучитьДанныеДляТаблицы())
;
метод ИсточникДанныхМоейТаблицы(): ИсточникДанныхМассив<МояСтруктура>
возврат Компоненты.МояТаблица.Источник
;
@НаСервере @ДоступноСКлиента
статический метод ПолучитьДанныеДляТаблицы(): ЧитаемыйМассив<МояСтруктура>
знч ДанныеДляТаблицы = <МояСтруктура>[]
ДанныеДляТаблицы.Добавить(новый МояСтруктура(Статус = Истина, Код = 101, Задача = "Планирование", Ответственный = "Иванов И. И."))
ДанныеДляТаблицы.Добавить(новый МояСтруктура(Статус = Истина, Код = 102, Задача = "Реализация", Ответственный = "Петров П. П."))
ДанныеДляТаблицы.Добавить(новый МояСтруктура(Статус = Истина, Код = 103, Задача = "Проверка", Ответственный = "Сидоров С. С."))
возврат ДанныеДляТаблицы
;
В модуле формы методы ОбработчикКоманды()
и ОбработчикМассовойКоманды()
могут выглядеть следующим образом:
// Метод обрабатывает данные одной строки
метод ОбработчикКоманды(Команда: КомандаСПараметром<МояСтруктура>, Параметр: МояСтруктура)
Параметр.Статус = не Параметр.Статус
;
// Метод обрабатывает данные нескольких выделенных строк
метод ОбработчикМассовойКоманды(Команда: КомандаСПараметром<Массив<МояСтруктура>>, Параметр: Массив<МояСтруктура>)
пер НовыйСтатус = ТолькоОстановленные(Параметр)
для Строка из Параметр
Строка.Статус = НовыйСтатус
;
;
// Метод меняет отображаемое имя команды
метод ПредставлениеМассовойКомандыСтроки(ДанныеОтмеченныхСтрок: Массив<МояСтруктура>): Строка
если ТолькоОстановленные(ДанныеОтмеченныхСтрок)
возврат "Запустить (команда строки)"
иначе
возврат "Остановить (команда строки)"
;
;
// Метод меняет отображаемое изображение команды
метод ИзображениеМассовойКоманды(ДанныеОтмеченныхСтрок: Массив<МояСтруктура>): ДвоичныйОбъект.Ссылка
если ТолькоОстановленные(ДанныеОтмеченныхСтрок)
возврат Ресурс{Старт.svg}.Ссылка
иначе
возврат Ресурс{Стоп.svg}.Ссылка
;
;
// Метод определяет, все ли выделенные строки имеют одинаковый статус
метод ТолькоОстановленные(ДанныеСтроки: Массив<МояСтруктура>|МояСтруктура): Булево
пер ТолькоОстановленные = Истина
если ДанныеСтроки это Массив<МояСтруктура>
для Объект из (ДанныеСтроки как Массив<МояСтруктура>)
если Объект.Статус
ТолькоОстановленные = Ложь
;
;
иначе
если (ДанныеСтроки как МояСтруктура).Статус
ТолькоОстановленные = Ложь
;
;
возврат ТолькоОстановленные
;