Как реализовать динамическое изменение видимости и доступности полей в 1С:Предприятии 8.3 на основе выбора значения из другого поля?

Программист 1С v8.3 (Управляемые формы) Бухгалтерский учет Финансы и профессиональные услуги
← На главную

При разработке модулей в 1С:Предприятии 8.3 часто возникает необходимость в создании динамических форм, где состав полей ввода меняется в зависимости от выбора пользователя в другом поле. Это позволяет сделать интерфейс более гибким и интуитивно понятным, отображая только актуальные для текущего контекста данные. В частности, речь идет о ситуации, когда при выборе определенного счета учета должны появляться или скрываться другие поля, например, для ввода аналитики (субконто), а также заполняться их значения в соответствии с выбранным счетом.

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

1. Управление видимостью и доступностью элементов формы с помощью обработчика события «ПриИзменении»

Основной способ динамического изменения отображения элементов формы — это программное управление их свойствами Видимость и Доступность. Эти свойства позволяют контролировать, виден ли элемент на форме и может ли пользователь с ним взаимодействовать.

Суть метода: Мы назначаем обработчик события ПриИзменении для того поля, выбор значения в котором должен инициировать изменения других полей. Внутри этого обработчика мы пишем код, который анализирует выбранное значение и, в зависимости от него, изменяет свойства Видимость или Доступность других элементов формы.

Шаги реализации:

  1. Создание полей на форме: В конфигураторе добавьте на форму все необходимые поля, которые потенциально могут отображаться. В нашем случае это поле выбора счета учета и три поля для субконто (Субконто1, Субконто2, Субконто3).
  2. Назначение обработчика ПриИзменении: Для поля "Счет учета" (или любого другого, которое является управляющим) в свойствах элемента формы найдите событие ПриИзменении и создайте обработчик на клиенте. Если требуется обращение к данным объекта или сложная логика, обработчик можно сделать с вызовом на сервере (например, &НаСервере или &НаСервереБезКонтекста).
  3. Реализация логики в обработчике: В созданном обработчике мы будем получать выбранное значение счета учета и на его основе определять, какие поля субконто должны быть видимы или доступны.

Пример кода для обработчика ПриИзменении:

Предположим, у нас есть реквизит формы Объект.СчетУчета и реквизиты Объект.Субконто1, Объект.Субконто2, Объект.Субконто3. Допустим, мы хотим, чтобы поля субконто отображались, если у выбранного счета учета есть соответствующие виды субконто.


&НаКлиенте
Процедура СчетУчетаПриИзменении(Элемент)
    // Необходимо получить данные по счету с сервера, чтобы определить виды субконто
    ПолучитьИУстановитьВидимостьСубконтоНаСервере();
КонецПроцедуры

&НаСервере
Процедура ПолучитьИУстановитьВидимостьСубконтоНаСервере()
    // Сбросим видимость и значения полей субконто по умолчанию
    Элементы.Субконто1.Видимость = Ложь;
    Элементы.Субконто2.Видимость = Ложь;
    Элементы.Субконто3.Видимость = Ложь;
    Объект.Субконто1 = Неопределено;
    Объект.Субконто2 = Неопределено;
    Объект.Субконто3 = Неопределено;

    Если Объект.СчетУчета = Неопределено Тогда
        Возврат;
    КонецЕсли;

    // Получим виды субконто для выбранного счета
    // Для этого нужно обратиться к Плану счетов и его структуре
    ПланСчетов = ПланыСчетов.Хозрасчетный.НайтиПоКоду(Объект.СчетУчета.Код); // Или другим способом получить объект счета
    Если ПланСчетов = Неопределено Тогда
        Возврат;
    КонецЕсли;

    // Предполагаем, что у СчетаУчета есть коллекция ВидыСубконто,
    // например, в ПланеВидовХарактеристик "ВидыСубконтоХозрасчетные"
    Для Каждого ВидСубконто Из ПланСчетов.ВидыСубконто Цикл
        Если ВидСубконто.Имя = "Субконто1" Тогда // Или другое логическое сопоставление
            Элементы.Субконто1.Видимость = Истина;
            Элементы.Субконто1.Заголовок = ПланСчетов.ВидСубконто1.Представление; // Установка заголовка
        ИначеЕсли ВидСубконто.Имя = "Субконто2" Тогда
            Элементы.Субконто2.Видимость = Истина;
            Элементы.Субконто2.Заголовок = ПланСчетов.ВидСубконто2.Представление;
        ИначеЕсли ВидСубконто.Имя = "Субконто3" Тогда
            Элементы.Субконто3.Видимость = Истина;
            Элементы.Субконто3.Заголовок = ПланСчетов.ВидСубконто3.Представление;
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Важные моменты:

  1. Если значение из справочника (как в случае с вашими данными из "скриншота 1") пустое или Неопределено, соответствующее поле можно не отображать, установив его свойство Видимость = Ложь.
  2. Свойство Доступность используется, когда поле должно быть видно, но неактивно для редактирования.
  3. Для установки заголовков элементов формы (как предложено в сообщении 6), вы также можете использовать программный подход: Элементы.ИмяЭлемента.Заголовок = "Новый заголовок";.

2. Использование свойств «СвязиПараметровВыбора» и «СвязьПоТипу» для связанных полей

Для автоматизации заполнения и фильтрации данных в зависимых полях 1С предоставляет мощные механизмы: СвязиПараметровВыбора и СвязьПоТипу. Эти свойства значительно упрощают работу с аналитикой, особенно с субконто.

2.1. СвязиПараметровВыбора

Свойство СвязиПараметровВыбора позволяет нам настроить фильтрацию списка выбора для одного поля на основе значения, выбранного в другом поле. Например, если мы выбрали определенного контрагента, то в поле "Договор" будут доступны для выбора только договоры этого контрагента.

Как это работает:

  1. В конфигураторе: Мы можем установить это свойство интерактивно через палитру свойств элемента формы. Для поля, которое должно быть зависимым (например, "Договор"), мы указываем, что его параметры выбора (например, "Отбор.Владелец") должны быть связаны со значением другого поля формы (например, "Контрагент").
  2. Программно: Свойство СвязиПараметровВыбора можно настроить и программно, создавая новые объекты СвязьПараметраВыбора. Это особенно полезно, когда логика связей более сложна или динамична.

Пример программной настройки СвязиПараметровВыбора:


// В обработчике ПриСозданииНаСервере или при ПриИзменении поля "СчетУчета"
// Допустим, мы хотим, чтобы для Субконто1 отображались только элементы, 
// связанные с определенным ТипомСубконто
Если Элементы.Субконто1.Вид = Тип("ПолеВвода") Тогда
    ПараметрОтбора = Элементы.Субконто1.ПараметрыВыбора.Найти("ТипСубконто");
    Если ПараметрОтбора = Неопределено Тогда
        ПараметрОтбора = Элементы.Субконто1.ПараметрыВыбора.Добавить("ТипСубконто");
    КонецЕсли;
    // Устанавливаем значение параметра отбора, 
    // например, в зависимости от типа Субконто для выбранного СчетаУчета
    ПараметрОтбора.Значение = ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Контрагенты; 
    // Или другое значение, полученное из данных счета
КонецЕсли;

Этот подход гарантирует, что пользователь всегда будет выбирать из релевантного списка, что уменьшает количество ошибок ввода и улучшает юзабилити.

2.2. СвязьПоТипу

Свойство СвязьПоТипу является критически важным для работы с реквизитами, имеющими составной тип данных, особенно для полей субконто. Оно позволяет указать другой реквизит объекта, значение которого будет определять тип данных для текущего реквизита.

Как это работает с субконто:

Представьте, что у нас есть поле Субконто1, которое может хранить ссылку на справочник "Контрагенты", справочник "Номенклатура", документ "Договоры" или что-то еще. Платформа не знает, какой именно тип данных ожидать. Однако, когда мы выбираем "Счет учета", в его свойствах (в плане счетов) указывается, какой вид субконто (например, "Контрагенты") соответствует первому, второму или третьему субконто этого счета.

Свойство СвязьПоТипу для поля Субконто1 устанавливается на реквизит, который определяет тип субконто (например, на виртуальный реквизит, представляющий собой тип первого субконто для текущего счета). Когда значение в поле "Счет учета" изменяется, СвязьПоТипу автоматически ограничивает набор допустимых типов для поля ввода субконто. Это означает, что при вводе в поле Субконто1 будет предлагаться выбор только из элементов того типа (например, справочника "Контрагенты"), который определен для первого субконто выбранного счета.

Пример настройки СвязьПоТипу в конфигураторе (для реквизитов, связанных с ПланомВидовХарактеристик):

  1. Создаем реквизит формы, например, ВидСубконто1, тип которого - ПланВидовХарактеристик.ВидыСубконтоХозрасчетные.
  2. Для реквизита Субконто1 (который имеет составной тип) в свойствах устанавливаем СвязьПоТипу на реквизит ВидСубконто1.
  3. В обработчике ПриИзменении для поля "Счет учета" мы программно устанавливаем значение реквизита ВидСубконто1 на основании данных о первом субконто выбранного счета.

Пример кода для установки ВидСубконто1 (в обработчике ПолучитьИУстановитьВидимостьСубконтоНаСервере):


&НаСервере
Процедура ПолучитьИУстановитьВидимостьСубконтоНаСервере()
    // ... (код из предыдущего примера) ...

    Если Объект.СчетУчета = Неопределено Тогда
        Объект.ВидСубконто1 = Неопределено; // Сбросим тип, если счет не выбран
        Объект.ВидСубконто2 = Неопределено;
        Объект.ВидСубконто3 = Неопределено;
        Возврат;
    КонецЕсли;

    // Получим объект Счета из ПланаСчетов, используя его ссылку
    ОбъектСчета = Объект.СчетУчета.ПолучитьОбъект(); 

    Если ОбъектСчета.ВидыСубконто.Количество() >= 1 Тогда
        Элементы.Субконто1.Видимость = Истина;
        Объект.ВидСубконто1 = ОбъектСчета.ВидыСубконто[0].ВидСубконто; // Устанавливаем тип для первого субконто
        Элементы.Субконто1.Заголовок = ОбъектСчета.ВидыСубконто[0].ВидСубконто.Наименование;
    Иначе
        Элементы.Субконто1.Видимость = Ложь;
        Объект.ВидСубконто1 = Неопределено;
        Объект.Субконто1 = Неопределено;
    КонецЕсли;

    Если ОбъектСчета.ВидыСубконто.Количество() >= 2 Тогда
        Элементы.Субконто2.Видимость = Истина;
        Объект.ВидСубконто2 = ОбъектСчета.ВидыСубконто[1].ВидСубконто; // Устанавливаем тип для второго субконто
        Элементы.Субконто2.Заголовок = ОбъектСчета.ВидыСубконто[1].ВидСубконто.Наименование;
    Иначе
        Элементы.Субконто2.Видимость = Ложь;
        Объект.ВидСубконто2 = Неопределено;
        Объект.Субконто2 = Неопределено;
    КонецЕсли;

    Если ОбъектСчета.ВидыСубконто.Количество() >= 3 Тогда
        Элементы.Субконто3.Видимость = Истина;
        Объект.ВидСубконто3 = ОбъектСчета.ВидыСубконто[2].ВидСубконто; // Устанавливаем тип для третьего субконто
        Элементы.Субконто3.Заголовок = ОбъектСчета.ВидыСубконто[2].ВидСубконто.Наименование;
    Иначе
        Элементы.Субконто3.Видимость = Ложь;
        Объект.ВидСубконто3 = Неопределено;
        Объект.Субконто3 = Неопределено;
    КонецЕсли;
КонецПроцедуры

Примечание: Предполагается, что в реквизитах счета (в конфигурации Плана счетов) есть коллекция ВидыСубконто, которая содержит ссылки на ПланВидовХарактеристик.ВидыСубконтоХозрасчетные.

3. Работа с субконто в 1С:Предприятии

Субконто являются ключевым элементом аналитического учета в 1С. Они позволяют детализировать информацию на бухгалтерских счетах beyond того, что дает сам счет. Например, по счету 60 "Расчеты с поставщиками и подрядчиками" субконто может быть "Контрагенты" и "Договоры".

Настройка субконто:

  1. В Плане счетов (например, "Хозрасчетный") для каждого счета можно настроить до трех видов субконто.
  2. Для этого открываем форму счета, переходим в раздел "Виды субконто".
  3. Здесь мы можем добавлять и удалять виды субконто, выбирая их из ПланаВидовХарактеристик.ВидыСубконтоХозрасчетные. Также настраиваются параметры учета: только обороты, суммовой, валютный, количественный.

Таким образом, логика, которую мы реализуем в обработчике ПриИзменении, должна основываться именно на этих настройках счета учета.

4. Обновление данных на форме

Иногда, после программных изменений данных, отображение на открытой форме может не обновиться автоматически. В таких случаях нам потребуется явно указать системе, что данные нужно перечитать или обновить.

Рассмотрим основные методы:

  1. ЭтаФорма.Прочитать(): Этот метод обновляет данные основного объекта управляемой формы. Он "перечитывает" данные из базы данных и заполняет реквизиты формы их актуальными значениями. Используйте его, когда изменяются базовые данные объекта формы.
  2. ЭтаФорма.ОбновитьОтображениеДанных(): Принудительно обновляет содержимое элементов управления на форме. Этот метод полезен, когда вы программно изменяете реквизиты формы (не основного объекта), и нужно, чтобы эти изменения тут же отразились на экране. Он не перечитывает данные из базы, а только обновляет визуальное представление.
  3. Элементы.Список.Обновить(): Если на форме присутствует динамический список (например, таблица), этот метод обновит данные, отображаемые в нем.

В нашем случае, при изменении видимости полей или их заголовков, обычно достаточно того, что платформа сама перерисовывает форму после выполнения серверного вызова. Однако, если вы меняете значения реквизитов, и они не обновляются на экране, ЭтаФорма.ОбновитьОтображениеДанных() может быть полезным.

5. Рекомендации по производительности

При динамическом изменении формы важно учитывать производительность, особенно в клиент-серверной архитектуре 1С. Каждый вызов серверной процедуры (&НаСервере) является относительно "дорогим" и замедляет работу интерфейса.

  1. Клиентские изменения: Начиная с платформы 8.3.7, многие оформительские свойства элементов формы (например, Видимость, Доступность, ЦветФона) можно изменять на клиенте без обращения к серверу. Это значительно ускоряет работу. Если вся необходимая информация для принятия решения (например, о выбранном значении) доступна на клиенте, старайтесь выполнять всю логику там.
  2. Серверные вызовы: Если для принятия решения о видимости или доступности полей требуются данные из базы (например, виды субконто для счета, как в нашем случае), тогда серверный вызов неизбежен. Старайтесь минимизировать количество таких вызовов. Если в одной клиентской процедуре вы изменяете видимость нескольких элементов, а затем вызываете серверную процедуру, 1С обычно группирует эти изменения и выполняет только один серверный вызов в конце выполнения процедуры. Однако, если вам нужно выполнить серверный код, а затем снова изменить видимость на клиенте, это будет два вызова.
  3. Условное оформление: Для изменения только оформительских свойств (цвет фона, шрифта, текста), не затрагивающих структуру формы или логику данных, рекомендуется использовать механизм условного оформления. Он позволяет декларативно настроить внешний вид элементов формы в зависимости от заданных условий без написания кода и без серверных вызовов.

Заключение

Для реализации динамического изменения полей в 1С:Предприятии 8.3 (управляемые формы) мы используем комбинацию нескольких мощных механизмов платформы. Ключевым является обработчик события ПриИзменении для поля, которое управляет видимостью других. Внутри этого обработчика мы программно управляем свойствами Видимость и Доступность зависимых полей. Для автоматической фильтрации списков выбора и корректной работы с составными типами данных, особенно для субконто, мы активно применяем свойства СвязиПараметровВыбора и СвязьПоТипу. Всегда помните о производительности и по возможности старайтесь использовать клиентские механизмы или условное оформление для оптимизации работы формы.

← На главную