diamond АШ Tlg

Управление видимостью элементов управляемой формы 1С 8.3

Однострочное решение простой задачи на сложных формах

Задача: допустим, у нас есть супер-пупер большая форма 1С с огромным количеством полей и, чтобы пользователь не заблудился, требуется прятать от него ненужные поля в зависимости от каких-то условий, например заполненного значения в определенном поле.

Вообще, это очень правильная практика, избавляющая от многих нештатных ситуаций

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

// 1. Джун ещё не выгорел на работе, поэтому перечисляет поля поименно:
Если Условие1 Тогда
    Элементы.Поле1.Видимость = Истина;
    Элементы.Поле2.Видимость = Истина;
    Элементы.Поле3.Видимость = Ложь;
    Элементы.Поле4.Видимость = Истина;
    Элементы.Поле5.Видимость = Истина;
ИначеЕсли Условие2 Тогда
    Элементы.Поле1.Видимость = Ложь;
    Элементы.Поле2.Видимость = Ложь;
    Элементы.Поле3.Видимость = Истина;
    Элементы.Поле4.Видимость = Истина;
    Элементы.Поле5.Видимость = Истина;
Иначе
    Элементы.Поле1.Видимость = Ложь;
    Элементы.Поле2.Видимость = Ложь;
    Элементы.Поле3.Видимость = Ложь;
    Элементы.Поле4.Видимость = Ложь;
    Элементы.Поле5.Видимость = Ложь;
КонецЕсли;

// 2. Миддл о чём-то догадывается и объединяет поля в группы:
Если Условие1 Тогда
    Элементы.Группа1.Видимость = Истина;
    Элементы.Группа2.Видимость = Истина;
ИначеЕсли Условие2 Тогда
    Элементы.Группа1.Видимость = Ложь;
    Элементы.Группа2.Видимость = Истина;
Иначе
    Элементы.Группа1.Видимость = Истина;
    Элементы.Группа2.Видимость = Ложь;
КонецЕсли;

// 3. Сеньор делает мышкой через условное оформление без написания кода

Сейчас вам расскажу про ещё один хитрожо изумительный способ для выполнения этой задачи, способный загнать в тупик почти любого обладателя "Специалиста по платформе". Я подсмотрел его в конфигурации ЗУП.

Постановка задачи

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

  • Если это Штатный сотрудник: Оклад (сумма), ДМС (булево)
  • Если это ИП: Дата договора
  • Если это договор ГПХ: Дата договора
  • Если это шабашник: директор платит налом из кармана, не показывать ничего

Решение

В дизайнере формы создаем реквизиты: Сотрудник (Строка), ТипСотрудника (Число), ДМС (Булево), Оклад (Булево), ДатаДоговора (Дата). Выводим их все на форму, поле ТипСотрудника оформляем как переключатель и заполняем значения:

Свойства поля ТипСотрудника

Создаем группу страниц с именем ГруппаСвойства и добавляем в него 4 страницы с полями, которые должны быть видны в зависимости от типа сотрудника. Должно получится примерно так:

Форма карточки

Чтобы у группы ГруппаСвойства не отображался ярлычок нужно установить свойство ОтображениеСтраниц:

Прячем ярлычки

И, наконец, финальный штрих: на событие ПриИзменении у поля ТипСотрудника вешаем следующую процедуру:

&НаКлиенте
Процедура ТипСотрудникаПриИзменении(Элемент)
    Элементы.ГруппаСвойства.ТекущаяСтраница = Элементы.ГруппаСвойства.ПодчиненныеЭлементы.Получить(ТипСотрудника);
КонецПроцедуры

Как видите, трюк состоит в подмене текущей страницы, из-за чего вся задача выполняется одной строкой кода. Обратите внимание на последнюю страницу и выполните домашнее задание - попробуйте удалить пустую декорацию.

Результат работы:

Штатный ИП ГПХ Шабашник