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