Как программно задать тип данных для поля ввода с составным типом в обычных формах 1С

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

При разработке интерфейсов на "Обычных формах" в 1С:Предприятии 8 часто возникает ситуация, когда реквизит имеет составной тип данных (например, СправочникСсылка.Организации и СправочникСсылка.Контрагенты). По умолчанию система предоставляет пользователю кнопку «Т» (выбор типа), что не всегда удобно, если логика приложения подразумевает автоматическое определение типа в зависимости от определенных условий. Рассмотрим подробно, как программно ограничить выбор и скрыть кнопку выбора типа, чтобы интерфейс стал более дружелюбным и защищенным от ошибок пользователя.

Анализ проблемы: почему кнопка «Т» не исчезает сама?

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

Разберем по шагам, какие инструменты нам понадобятся для решения этой задачи.

Шаг 1: Использование объекта ОписаниеТипов

Для начала нам нужно создать объект ОписаниеТипов, который будет содержать только один разрешенный тип. Это "фильтр", который мы наложим на наше поле ввода. Проанализируем, как это выглядит в коде:


// Создаем массив с одним типом
МассивТипов = Новый Массив;
МассивТипов.Добавить(Тип("СправочникСсылка.Организации"));

// Создаем описание типов на основе этого массива
НужныйТип = Новый ОписаниеТипов(МассивТипов);

Также можно использовать упрощенную конструкцию, передав строку с названием типа напрямую в конструктор ОписаниеТипов:

НужныйТип = Новый ОписаниеТипов("СправочникСсылка.Контрагенты");

Шаг 2: Применение ограничения к элементу формы

Многие начинающие разработчики пытаются записывать новое описание типа в свойство ТипЗначения, однако в обычных формах это свойство у элемента управления часто доступно только для чтения. Вместо этого мы должны использовать свойство ОграничениеТипа. Рассмотрим ситуацию, когда в зависимости от "Условия1" нам нужно переключить поле:


Если Условие1 Тогда
    // Фиксируем тип Организация
    ЭлементыФормы.ПВОрганизация.ОграничениеТипа = Новый ОписаниеТипов("СправочникСсылка.Организации");
ИначеЕсли Условие2 Тогда
    // Фиксируем тип Контрагент
    ЭлементыФормы.ПВОрганизация.ОграничениеТипа = Новый ОписаниеТипов("СправочникСсылка.Контрагенты");
КонецЕсли;

Шаг 3: Принудительное приведение значения

После того как мы установили ограничение на уровне элемента формы, необходимо убедиться, что текущее значение реквизита соответствует этому ограничению. Если в поле была выбрана Организация, а мы программно сменили ограничение на Контрагента, значение в поле может стать некорректным или остаться неопределенным. Здесь нам поможет метод ПривестиЗначение().

Проанализируем пример совместного использования этих методов:


// Устанавливаем ограничение
Элемент = ЭлементыФормы.ПВОрганизация;
Элемент.ОграничениеТипа = Новый ОписаниеТипов("СправочникСсылка.Организации");

// Приводим текущее значение реквизита к новому типу
// Если текущее значение не входит в новое описание, оно станет пустой ссылкой Организации
Элемент.Значение = Элемент.ОграничениеТипа.ПривестиЗначение(Элемент.Значение);

Важный момент: если поле ввода напрямую связано с реквизитом объекта (например, ЭтотОбъект.Контрагент), то изменение Элемент.Значение автоматически обновит и данные реквизита.

Шаг 4: Управление видимостью кнопки выбора типа

Даже после выполнения всех вышеописанных действий кнопка выбора типа «Т» может оставаться видимой, хотя при нажатии на нее список будет состоять из одного пункта. Чтобы окончательно скрыть её и сделать поле "монотипным", используем свойства ВыбиратьТип и АвтоВыборТипа.

Разберем итоговый алгоритм, который гарантированно решает задачу:


Процедура УстановитьЖесткийТипПоля(ИмяПоля, СтрокаТипа)
    
    Элемент = ЭлементыФормы[ИмяПоля];
    
    // 1. Создаем новое ограничение
    НовоеОписаниеТипа = Новый ОписаниеТипов(СтрокаТипа);
    Элемент.ОграничениеТипа = НовоеОписаниеТипа;
    
    // 2. Приводим значение реквизита к этому типу
    Элемент.Значение = НовоеОписаниеТипа.ПривестиЗначение(Элемент.Значение);
    
    // 3. Отключаем механизмы выбора типа
    Элемент.ВыбиратьТип = Ложь;      // Убирает кнопку "Т"
    Элемент.АвтоВыборТипа = Ложь;    // Запрещает системе предлагать выбор типа при очистке
    
    // 4. Обновляем отображение (на всякий случай)
    Элемент.Обновить();
    
КонецПроцедуры

Где размещать этот код?

Выясним наиболее подходящие места для вызова этой логики:

  1. В обработчике ПриОткрытии(): Если тип поля должен быть определен сразу при запуске формы на основании существующих данных.
  2. В обработчике ПриИзменении(): Если тип поля ввода зависит от другого элемента формы (например, от переключателя или другого поля выбора).
  3. В начале выбора (НачалоВыбора): Если нужно динамически ограничивать типы в момент, когда пользователь нажал на кнопку выбора, но до появления стандартного диалога.

Особенности работы с пустой ссылкой

Если вы хотите просто "очистить" поле, но сохранить его привязку к определенному типу, вы можете напрямую присвоить пустую ссылку, не используя ОписаниеТипов. Однако это не скроет кнопку «Т» автоматически. Рассмотрим пример:


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

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

Резюме

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

← На главную