Как программно установить тип для реквизита произвольного типа в 1С?

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

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

Основные принципы работы с типами

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

Ключевыми объектами для решения задачи являются ОписаниеТипов и свойство ОграничениеТипа элемента формы. Именно через них мы задаем «рамки» для ввода данных, а поможет в этом анализ структуры метаданных — здесь поможет обработка визуализации и анализа структуры метаданных.

Решение для обычных форм

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

  1. Создаем объект ОписаниеТипов с нужным нам набором типов (например, СправочникСсылка.Контрагенты).
  2. Присваиваем это описание свойству ОграничениеТипа нужного элемента формы.
  3. Принудительно устанавливаем значение элемента, используя метод ПривестиЗначение, чтобы форма «поняла», что тип данных был изменен.

Посмотрим на пример кода для установки типа:


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

Важное примечание: Чтобы при очистке значения реквизита у пользователя не возникало окно выбора типа, рекомендуем программно отключать возможность выбора типа для элемента формы: ЭлементыФормы.ВашРеквизит.ВыбиратьТип = Ложь;. Это обеспечит стабильное поведение интерфейса.

Как решить проблему «строкового» типа значения

Иногда возникают ситуации, когда после программной установки типа система продолжает воспринимать поле как Строку, из-за чего кнопка выбора не открывает нужный справочник. Если вы столкнулись с такой проблемой, попробуйте следующий алгоритм:

  1. Вместо «произвольного» типа данных для реквизита на уровне формы, используйте составной тип. Например, задайте в конфигураторе тип СправочникСсылка.Фирмы, СписокЗначений.
  2. Используйте комбинированный подход для управления доступностью и типами.

Пример управления типом через составные значения:


// Определение состава типов
ОписаниеТипаФирма = Новый ОписаниеТипов("СправочникСсылка.Фирма, СписокЗначений");
ЭлементыФормы.Фирма.ОграничениеТипа = ОписаниеТипаФирма;

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

Особенности работы с управляемыми формами

В управляемых формах принцип работы немного отличается, так как прямого доступа к ЭлементыФормы нет. Мы работаем с коллекцией Элементы.

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


&НаКлиенте
Процедура РеквизитОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
    ОписаниеТипа = Новый ОписаниеТипов("СправочникСсылка.ВашСправочник");
    Элементы.Реквизит.ОграничениеТипа = ОписаниеТипа;
КонецПроцедуры

Советы по отладке и оптимизации

При работе с динамической типизацией важно помнить о нескольких нюансах:

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

← На главную