Имя: Пароль:
1C
1С v8
Как изменить доступность реквизита в Управляемой Форме
0 Saari
 
21.07.20
09:32
Есть форма документа, в которой среди прочих есть два реквизита: ФИО (ссылка на справочник) и реквизит чекбокс (галка).
Нужно сделать так, что если в реквизите ФИО указано значение из справочника, то чекбокс доступен. Если реквизит ФИО пустой (пустая ссылка), то чекбокс недоступен.
Сделал так:
В процедуре ОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) реквизита ФИО написал:
Если ЗначениеЗаполнено(ВыбранноеЗначение) Тогда
Элементы.РеквизитЧекБокс.Доступность = Истина;
Иначе
Элементы.РеквизитЧекБокс.Доступность = Ложь;
КонецЕсли;
ЭтаФорма.ОбновитьОтображениеДанных();

Не работает, доступность реквизита чекбокс не изменяется.
Подскажите, пожалуйста.
1 acht
 
21.07.20
09:34
перенеси в ПриИзменении
2 Saari
 
21.07.20
09:37
(1) Пробовал. Но там не получается проверить заполненность элемента формы.
Подскажете как?
3 acht
 
21.07.20
09:46
(2) >  не получается проверить заполненность элемента формы
Значение реквизита уже установлено в результат изменения.
4 Saari
 
21.07.20
09:51
(3) При открытии документа реквизит ФИО пустой. Я выбираю значение на форме. Попадаю в процедуру "ПриИзменении()". И в ней значение ЗначениеЗаполнено(ФИО) ложь. Т.е. реквизит документа не заполнен, а заполнен реквизит формы.
Как проверить на заполненность реквизита формы?
5 acht
 
21.07.20
09:53
(4) Показывай код, скриншоты, всетакое
6 acht
 
21.07.20
09:54
Если у тебя два реквизита с одним именем - формы и документа, то ты ССЗБ
7 Saari
 
21.07.20
10:01
(5)  В процедуре "ПриИзменении()"
Если ЗначениеЗаполнено(ФИО) Тогда
Элементы.РеквизитЧекБокс.Доступность = Истина;
Иначе
Элементы.РеквизитЧекБокс.Доступность = Ложь;
КонецЕсли;
В этом случае ЗначениеЗаполнено(ФИО) всегда Ложь

Если так:
Если ЗначениеЗаполнено(Элементы.ФИО) Тогда
Элементы.РеквизитЧекБокс.Доступность = Истина;
Иначе
Элементы.РеквизитЧекБокс.Доступность = Ложь;
КонецЕсли;
то выдает ошибку: Проверка мутабельных значений на заполненность не поддерживается
8 Saari
 
21.07.20
10:02
(6) имя одно (у реквизита формы и документа), но обращение к ним индивидуальное.
9 acht
 
21.07.20
10:28
Что такое "ФИО" - отдельный ревизит формы или реквизит шапки документа? Если второе, то к нему надо обращатся через основной рекивизит формы, который у тебя скорей всего называется "Объект".
10 Saari
 
21.07.20
10:39
(9) УРА! Заработало!
В процедуре ПриИзменении() написал так:
Если ЗначениеЗаполнено(Объект.ФИО) Тогда
Элементы.РеквизитЧекБокс.Доступность = Истина;
Иначе
Элементы.РеквизитЧекБокс.Доступность = Ложь;
КонецЕсли;

acht, СПАСИБО огромное!
11 D_E_S_131
 
21.07.20
10:49
(10) По правильному:

&НаКлиенте
Процедура ПриОткрытии()

   НастроитьДоступКГалке();

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

&НаКлиенте
Процедура ФИОПриИзменении()

   НастроитьДоступКГалке();

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

&НаКлиенте
Процедура НастроитьДоступКГалке()

   // твой код

КонецПроцедуры
12 Saari
 
21.07.20
10:54
(11) Спасибо!
13 acht
 
21.07.20
10:55
(11) Если совсем, по правильному, то:

&НаСервере
Процедура ПриСозданииНаСервере()

    УстановитьДоступностьРеквизитов(ЭтотОбъект);

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

&НаКлиенте
Процедура ФИОПриИзменении()

    УстановитьДоступностьРеквизитов(ЭтотОбъект);

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

&НаКлиентеНеСервереБезКонтекста
Процедура УстановитьДоступностьРеквизитов(Форма)

    Форма.Элементы.РеквизитЧекБокс.Доступность = ЗначениеЗаполнено(Форма.ЗначениеЗаполнено(Объект.ФИО) )

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

Минус один вызов сервера при открытии.
14 acht
 
21.07.20
10:58
^Форма.Элементы.РеквизитЧекБокс.Доступность = ЗначениеЗаполнено(Форма.Объект.ФИО);

ессно
15 SadrArt
 
21.07.20
11:22
(0) О_О с таким стажем, и такой вопрос??!
Основная теорема систематики: Новые системы плодят новые проблемы.