Убрать из формы переключатель по условию

1. user1837694 11.03.25 04:08 Сейчас в теме
В 1С БП Корп через расширение документ РеализацияТоваровУслуг.ФормаРеквизитыОрганизацииКонтрагентаУслуг расположен реквизит РаспределениеМП с двумя полями переключателя: ЮЛ и ГРП (см. скрин1) , подтягивающих по умолчанию значения перечисления ЮЛ из процедуры &НаСервере ДК1_ПриСозданииНаСервереВместо(Отказ, СтандартнаяОбработка)

Если ЭтаФорма.РаспредлениеМПМеждуОтделомИГРП.Пустая() Тогда
ЭтаФорма.РаспредлениеМПМеждуОтделомИГРП = Перечисления.ДК1_РаспределениеМП.РаспределениеМПЮЛ


Задачей стоит убрать из формы переключатель РаспредлелниеМП, если контрагент - физическое лицо.

Пробовал реализовать через событие ПриИзменении (см. скрин2)
&НаКлиенте 
&ИзменениеИКонтроль ("ПриОткрытииПосле") 
Процедура ДК1_ПриОткрытииПосле(Отказ)
#Вставка
Если Контрагент = ПредопределенноеЗначение ("Перечисление.ЮридическоеФизическоеЛицо.ФизическоеЛицо") Тогда 
ЭтаФорма.РаспредлениеМПМеждуОтделомИГРП = Неопределено;
КонецЕсли;
ОбновитьИнтрфейс(); 
#КонецВставки
КонецПроцедуры
Показать


Но по отладке не заходит.
Прикрепленные файлы:
По теме из базы знаний
Найденные решения
2. user1837694 11.03.25 07:04 Сейчас в теме
И китайский DeepSeek и Grok3 Маска указали на все ошибки:
1. Событие ПриОткрытииПосле зависит от момента открытия формы, а проверка выполняется только один раз, код может не срабатывать, если данные контрагента еще не загрузились или изменились позже. Нужно использовать ПриИзменении.

2. Неправильное сравнение типа контрагента. Контрагент — это ссылка на справочник "Контрагенты", а не значение перечисления ЮридическоеФизическоеЛицо.

3. Перечисления не могут принимать значение Неопределено. Установка Неопределено не скрывает переключатель.

4. ОбновитьИнтерфейс() не влияет на видимость конкретного элемента формы.
А рабочий код выдал Grok3:

// Перехват события "ПриСозданииНаСервере" для проверки при открытии формы
&Вместо("ПриСозданииНаСервере")
Процедура ДК1_ПриСозданииНаСервереВместо(Отказ, СтандартнаяОбработка)
    // Вызываем стандартную обработку
    ПродолжитьВызов(Отказ, СтандартнаяОбработка);
    
    // Проверяем тип контрагента и обновляем видимость
    ОбновитьВидимостьРаспределенияМП();
КонецПроцедуры

// Перехват события "КонтрагентПриИзменении" для обработки изменения контрагента
&Вместо("КонтрагентПриИзменении")
Процедура ДК1_КонтрагентПриИзмененииВместо(Элемент)
    // Вызываем стандартную обработку
    ПродолжитьВызов(Элемент);
    
    // Обновляем видимость на сервере
    ОбновитьВидимостьРаспределенияМП();
КонецПроцедуры

// Процедура для управления видимостью переключателя
&НаСервере
Процедура ОбновитьВидимостьРаспределенияМП()
    // Проверяем, заполнен ли контрагент
    Если ЗначениеЗаполнено(Контрагент) Тогда
        // Получаем тип контрагента
        ТипКонтрагента = Контрагент.ЮридическоеФизическоеЛицо;
        
        // Если контрагент - физическое лицо, скрываем переключатель
        Если ТипКонтрагента = Перечисления.ЮридическоеФизическоеЛицо.ФизическоеЛицо Тогда
            Элементы.РаспределениеМП.Видимость = Ложь;
        Иначе
            Элементы.РаспределениеМП.Видимость = Истина;
        КонецЕсли;
    Иначе
        // Если контрагент не заполнен, показываем переключатель (или скрываем, в зависимости от вашей логики)
        Элементы.РаспределениеМП.Видимость = Истина;
    КонецЕсли;
КонецПроцедуры
Показать
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. user1837694 11.03.25 07:04 Сейчас в теме
И китайский DeepSeek и Grok3 Маска указали на все ошибки:
1. Событие ПриОткрытииПосле зависит от момента открытия формы, а проверка выполняется только один раз, код может не срабатывать, если данные контрагента еще не загрузились или изменились позже. Нужно использовать ПриИзменении.

2. Неправильное сравнение типа контрагента. Контрагент — это ссылка на справочник "Контрагенты", а не значение перечисления ЮридическоеФизическоеЛицо.

3. Перечисления не могут принимать значение Неопределено. Установка Неопределено не скрывает переключатель.

4. ОбновитьИнтерфейс() не влияет на видимость конкретного элемента формы.
А рабочий код выдал Grok3:

// Перехват события "ПриСозданииНаСервере" для проверки при открытии формы
&Вместо("ПриСозданииНаСервере")
Процедура ДК1_ПриСозданииНаСервереВместо(Отказ, СтандартнаяОбработка)
    // Вызываем стандартную обработку
    ПродолжитьВызов(Отказ, СтандартнаяОбработка);
    
    // Проверяем тип контрагента и обновляем видимость
    ОбновитьВидимостьРаспределенияМП();
КонецПроцедуры

// Перехват события "КонтрагентПриИзменении" для обработки изменения контрагента
&Вместо("КонтрагентПриИзменении")
Процедура ДК1_КонтрагентПриИзмененииВместо(Элемент)
    // Вызываем стандартную обработку
    ПродолжитьВызов(Элемент);
    
    // Обновляем видимость на сервере
    ОбновитьВидимостьРаспределенияМП();
КонецПроцедуры

// Процедура для управления видимостью переключателя
&НаСервере
Процедура ОбновитьВидимостьРаспределенияМП()
    // Проверяем, заполнен ли контрагент
    Если ЗначениеЗаполнено(Контрагент) Тогда
        // Получаем тип контрагента
        ТипКонтрагента = Контрагент.ЮридическоеФизическоеЛицо;
        
        // Если контрагент - физическое лицо, скрываем переключатель
        Если ТипКонтрагента = Перечисления.ЮридическоеФизическоеЛицо.ФизическоеЛицо Тогда
            Элементы.РаспределениеМП.Видимость = Ложь;
        Иначе
            Элементы.РаспределениеМП.Видимость = Истина;
        КонецЕсли;
    Иначе
        // Если контрагент не заполнен, показываем переключатель (или скрываем, в зависимости от вашей логики)
        Элементы.РаспределениеМП.Видимость = Истина;
    КонецЕсли;
КонецПроцедуры
Показать
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот