Как динамически управлять видимостью полей субконто при выборе счета на управляемой форме 1С

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

При разработке документов и отчетов в среде 1С:Предприятие часто возникает классическая задача: пользователь выбирает бухгалтерский счет, и в зависимости от этого выбора на форме должны появиться или скрыться поля для ввода субконто (аналитических разрезов). Например, если выбран счет 10 «Материалы», то нам необходимо показать поля для выбора номенклатуры и склада. Если же выбран счет 50 «Касса», то дополнительные аналитические разрезы не требуются, и соответствующие поля ввода должны полностью исчезнуть с экрана, чтобы не загромождать интерфейс.

В этой статье мы подробно разберем, как правильно реализовать этот механизм в управляемом приложении 1С 8.3, как проверить наличие разрезов у счета, настроить типы данных и заголовки полей ввода, а также как избежать типичной ошибки с сохранением «мусорных» данных в скрытых реквизитах.

Постановка задачи и логика работы интерфейса

Давайте проанализируем ситуацию. На управляемой форме у нас есть реквизит Счет (тип данных ПланСчетовСсылка.Хозрасчетный) и несколько реквизитов для хранения аналитики, например, Субконто1, Субконто2 и Субконто3. Наша цель — сделать так, чтобы при изменении счета программа автоматически выполняла следующие действия:

  1. Определяла, сколько субконто привязано к выбранному счету в плане счетов.
  2. Для каждого доступного субконто делала видимым соответствующее поле ввода на форме.
  3. Динамически меняла заголовок поля ввода (например, вместо стандартного «Субконто 1» отображала «Номенклатура» или «Контрагенты»).
  4. Ограничивала тип выбираемых данных в поле ввода под конкретный вид субконто (чтобы в поле «Склады» нельзя было выбрать контрагента).
  5. Полностью скрывала неиспользуемые поля ввода, если у счета меньше трех субконто или их нет вовсе.
  6. Обязательно очищала значения скрытых реквизитов, чтобы старые данные не записались в базу данных при сохранении документа.

Рассмотрим по шагам программную реализацию этой задачи.

Шаг 1. Как проверить наличие и типы субконто у счета

Каждый счет в планах счетов 1С имеет табличную часть (или встроенную коллекцию) под названием ВидыСубконто. Количество строк в этой коллекции как раз и определяет, сколько разрезов аналитики поддерживает данный счет. Нам необходимо обратиться к этой коллекции на сервере.

Для понимания структуры данных рассмотрим простой пример обхода этой коллекции на сервере:


ТаблицаСубконто = ВыбранныйСчет.ВидыСубконто;
КоличествоРазрезов = ТаблицаСубконто.Количество();

Для Каждого СтрокаВида Из ТаблицаСубконто Цикл
    ИмяРазреза = СтрокаВида.ВидСубконто.Наименование;
    ДопустимыеТипы = СтрокаВида.ВидСубконто.ТипЗначения; // Возвращает ОписаниеТипов
КонецЦикла;

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

Шаг 2. Создание обработчика события на клиенте

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

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


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

Шаг 3. Реализация серверной настройки интерфейса

Теперь напишем основную логику в процедуре НастроитьВидимостьСубконтоНаСервере. Здесь мы будем управлять элементами формы напрямую через коллекцию Элементы.

При написании кода крайне важно предусмотреть правильную очистку данных. Если пользователь сначала выбрал счет с субконто, заполнил его, а затем передумал и выбрал счет без субконто — старые значения реквизитов формы Субконто1, Субконто2 останутся заполненными в памяти объекта, даже если мы их скроем. Поэтому перед настройкой видимости мы обязаны очистить эти реквизиты.

Рассмотрим детальный программный код:


&НаСервере
Процедура НастроитьВидимостьСубконтоНаСервере()
    
    // Сначала очищаем старые значения, чтобы избежать записи "мусорных" данных (решение проблемы остаточных данных)
    Субконто1 = Неопределено;
    Субконто2 = Неопределено;
    Субконто3 = Неопределено;
    
    // Проверяем, заполнен ли счет на форме
    Если ЗначениеЗаполнено(Счет) Тогда
        
        ТаблицаСубконто = Счет.ВидыСубконто;
        Количество = ТаблицаСубконто.Количество();
        
        // --- Настройка Субконто 1 ---
        Если Количество >= 1 Тогда
            Элементы.Субконто1.Видимость = Истина;
            // Устанавливаем понятный заголовок в зависимости от вида аналитики
            Элементы.Субконто1.Заголовок = Строка(ТаблицаСубконто[0].ВидСубконто);
            // Ограничиваем тип поля ввода, чтобы пользователь мог выбрать только разрешенные типы данных
            Элементы.Субконто1.ОграничениеТипа = ТаблицаСубконто[0].ВидСубконто.ТипЗначения;
        Else
            Элементы.Субконто1.Видимость = Ложь;
        КонецЕсли;
        
        // --- Настройка Субконто 2 ---
        Если Количество >= 2 Тогда
            Элементы.Субконто2.Видимость = Истина;
            Элементы.Субконто2.Заголовок = Строка(TableSubkonto[1].ВидСубконто);
            Элементы.Субконто2.ОграничениеТипа = ТаблицаСубконто[1].ВидСубконто.ТипЗначения;
        Else
            Элементы.Субконто2.Видимость = Ложь;
        КонецЕсли;
        
        // --- Настройка Субконто 3 ---
        Если Количество >= 3 Тогда
            Элементы.Субконто3.Видимость = Истина;
            Элементы.Субконто3.Заголовок = Строка(ТаблицаСубконто[2].ВидСубконто);
            Элементы.Субконто3.ОграничениеТипа = ТаблицаСубконто[2].ВидСубконто.ТипЗначения;
        Else
            Элементы.Субконто3.Видимость = Ложь;
        КонецЕсли;
        
    Иначе
        // Если счет на форме не выбран вообще, скрываем все три поля субконто
        Элементы.Субконто1.Видимость = Ложь;
        Элементы.Субконто2.Видимость = Ложь;
        Элементы.Субконто3.Видимость = Ложь;
    КонецЕсли;
    
КонецПроцедуры

В этом коде мы использовали свойство элемента формы ОграничениеТипа. Оно позволяет на лету сузить доступные для выбора типы данных. Например, если тип реквизита Субконто1 на форме изначально определен как составной (все справочники системы), то присвоение свойства ОграничениеТипа оставит для выбора только те типы, которые разрешены для данного вида субконто на этом конкретном счете.

Оптимизация интерфейса с помощью группировки элементов

Если на форме под полями субконто у вас расположены другие элементы, то при скрытии полей субконто форма может выглядеть «пустой» или оставлять лишние зазоры. Чтобы интерфейс перерисовывался красиво и аккуратно, рекомендуется объединить все элементы управления субконто в одну общую Группу формы (без отображения рамки и заголовка).

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

Использование стандартных механизмов БСП

В современных типовых конфигурациях 1С (таких как «Бухгалтерская предприятия», «ERP Управление предприятием» или «Комплексная автоматизация») разработчики крайне редко пишут подобный код вручную с нуля. В Библиотеку Стандартных Подсистем (БСП) интегрированы готовые программные интерфейсы (API) для работы с субконто.

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

Мы рекомендуем изучить устройство стандартных документов (например, «Поступление товаров и услуг» или «ОперацияБух») в типовой конфигурации, чтобы перенять лучшие практики работы с динамическим интерфейсом субконто.

← На главную