Настройка компонента ====================== .. _manual_override: Allow Manual Override of Calculated Value / Разрешить ручное переопределение вычисляемого значения --------------------------------------------------------------------------------------------------- Настройка расположена на вкладке **"Данные"**. При помощи **Allow Manual Override of Calculated Value / Разрешить ручное переопределение вычисляемого значения** поле перевычисляется до тех пор, пока пользователь не поменяет это значение. .. image:: _static/calculated_value.png :width: 600 :align: center Описание работы ~~~~~~~~~~~~~~~~~~ Режим создания """""""""""""""""""""" Чтобы **calculated value** установилось, необходимо, чтобы **valueChangedByUser = false** (при условии, что включен **Allow Manual Override of Calculated Value**). Тогда в режиме создания достаточно просто очистить компонент, и **calculatedValue** снова заполнит его. Режим редактирования """""""""""""""""""""" В режиме редактирования если очистить компонент, то это также считается за пользовательские правки, следовательно, нет возможности снова получить значение из **calculatedValue**. Описание полей и логики ~~~~~~~~~~~~~~~~~~~~~~~~~ .. list-table:: :widths: 5 10 20 :header-rows: 1 :class: tight-table * - Имя - Значение по умолчанию - Описание * - **calculatedValue** - null - вычисленное значение * - **dataValue** - значение с сервера - значение в поле * - **режим формы** - - | по умолчанию выставить значение "CREATE". | Возможные значения - CREATE, EDIT * - **calculatedValueWasCalculated** - - | Внутренний флаг, по которому определяется первое это вычисление значения или нет. | После первого вычисления проставляется в true. * - **valueChangedByUser** - false - Внутренний флаг, который определяет, что текущее значение (dataValue) отвязано от вычисленного До проставления **dataValue** у всех полей проверятся, что никакая логика с формы не начинает вычисляться. Для каждого перевычисления **calculatedValue**: 1. После первого вычисления **calculatedValue** (первое или нет определяется по флагу **calculatedValueWasCalculated**) проставляется значение флага **valueChangedByUser**. 2. **calculatedValueWasCalculated** проставляется в **true** 3. Если флаг **valueChangedByUser = false**, то меняется **dataValue**, иначе с **dataValue** действия не производятся Дополнительная логика: 1. Если значение dataValue меняется пользователем, то проставляется флаг **valueChangedByUser = true** Пример работы с компонентом TableForm ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Задача """"""" данные должны вычисляться на основе компонента 1 и помещаться в компонент 2, и после этого у пользователя должна быть возможность их изменять. И если пользователь ошибся или изменил решение, то удалить данные из компонента 2 и снова путем перевыбора в компоненте 1 получить другие данные и также изменять их: .. image:: _static/calculated_value_table.png :width: 600 :align: center Реализация: 1. использование флага **allow Manual Override**, 2. но вместо **calculated value**, логика подтягивания записей перенесена в раздел компонента **«Logic»** (table form) 3. Логика включается по событию нажатия кнопки (только когда пользователь действительно хочет перезаписать свои значения вычисленными) Итог: работает перезапись, ручной запуск вычисления данных (на формах создания и редактирования). Не работало ранее, до использования **instance.setValue()**.