При разработке конфигураций на платформе 1С:Предприятие часто возникает задача динамического изменения типа поля ввода на форме. Это особенно актуально для отчетов (в которых пригодится консоль запросов) или универсальных обработок, где один и тот же элемент управления должен позволять пользователю выбирать разные сущности: например, сегодня — конкретную СправочникСсылка.Организации, а завтра — целый СписокЗначений или Строку — для таких задач есть комплект инструментов разработчика с консолью запросов.
Когда реквизит формы имеет тип Произвольный (изучить который поможет информер по метаданным), платформа не всегда может корректно определить, какой тип данных ожидается от пользователя в конкретный момент времени. Чтобы «подсказать» системе, какой тип данных сейчас активен, нам необходимо работать не только с самим значением, но и с описанием типов.
Ключевыми объектами для решения задачи являются ОписаниеТипов и свойство ОграничениеТипа элемента формы. Именно через них мы задаем «рамки» для ввода данных, а поможет в этом анализ структуры метаданных — здесь поможет обработка визуализации и анализа структуры метаданных.
В обычных формах основным инструментом является коллекция ЭлементыФормы. Чтобы реализовать программное изменение форм и ограничить тип (в этом поможет обработка автоматического изменения реквизитов на форме), который может выбрать пользователь, воспользуемся следующим подходом:
ОписаниеТипов с нужным нам набором типов (например, СправочникСсылка.Контрагенты).ОграничениеТипа нужного элемента формы.ПривестиЗначение, чтобы форма «поняла», что тип данных был изменен.Посмотрим на пример кода для установки типа:
ОписаниеТипа = Новый ОписаниеТипов("СправочникСсылка.Контрагенты");
ЭлементыФормы.ВашРеквизит.ОграничениеТипа = ОписаниеТипа;
ЭлементыФормы.ВашРеквизит.Значение = ОписаниеТипа.ПривестиЗначение();
Важное примечание: Чтобы при очистке значения реквизита у пользователя не возникало окно выбора типа, рекомендуем программно отключать возможность выбора типа для элемента формы: ЭлементыФормы.ВашРеквизит.ВыбиратьТип = Ложь;. Это обеспечит стабильное поведение интерфейса.
Иногда возникают ситуации, когда после программной установки типа система продолжает воспринимать поле как Строку, из-за чего кнопка выбора не открывает нужный справочник. Если вы столкнулись с такой проблемой, попробуйте следующий алгоритм:
СправочникСсылка.Фирмы, СписокЗначений.Пример управления типом через составные значения:
// Определение состава типов
ОписаниеТипаФирма = Новый ОписаниеТипов("СправочникСсылка.Фирма, СписокЗначений");
ЭлементыФормы.Фирма.ОграничениеТипа = ОписаниеТипаФирма;
// При изменении состояния флажка меняем тип данных
Процедура Флажок1ПриИзменении(Элемент)
Если ЭлементыФормы.Флажок.Значение = Истина Тогда
Фирма = Справочники.Фирма.ПустаяСсылка();
Иначе
Фирма = Новый СписокЗначений;
КонецЕсли;
КонецПроцедуры
В управляемых формах принцип работы немного отличается, так как прямого доступа к ЭлементыФормы нет. Мы работаем с коллекцией Элементы.
Для реализации логики выбора типа используйте событие ОбработкаВыбора поля формы. В этом обработчике можно динамически назначать ограничение типа:
&НаКлиенте
Процедура РеквизитОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
ОписаниеТипа = Новый ОписаниеТипов("СправочникСсылка.ВашСправочник");
Элементы.Реквизит.ОграничениеТипа = ОписаниеТипа;
КонецПроцедуры
При работе с динамической типизацией важно помнить о нескольких нюансах:
Неопределено. Всегда приводите значение к нужному типу после смены ограничения. Для быстрой диагностики кода есть обработка написания и отладки кода в режиме предприятия.СистемыКомпоновкиДанных.ПустуюСсылку нужного типа, а не Неопределено. Это позволит избежать лишних запросов системы к пользователю о выборе типа данных.Использование описанных методов позволит вам сделать интерфейс гибким и удобным для пользователей, избегая при этом ошибок типизации и зависания элементов управления. Для автоматизации динамического изменения типа поля ввода на форме есть универсальная обработка изменения типов реквизитов.