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