Как программно очистить выбранное значение в поле выбора списка значений в 1С?

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

При разработке интерфейсов на обычных формах часто возникает задача динамического обновления списков выбора: требуется сбросить список возможных вариантов и одновременно очистить поле от ранее выбранного значения. Начинающие разработчики нередко сталкиваются с ситуацией, когда коллекция вариантов очищена, но на форме продолжает отображаться старый текст, либо попытки его стереть приводят к ошибкам времени выполнения. Разберем по шагам, почему возникают эти ошибки и как правильно реализовать программную очистку поля, аналогичную нажатию комбинации клавиш Shift+F4.

Анализ типичных ошибок: почему не работает ВыделенныйТекст и Значение.Очистить()

Проанализируем фрагмент кода, с которым обычно возникают трудности:


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

Выясним причину, почему данные конструкции не дают ожидаемого результата:

  1. Свойство СписокВыбора и текущее значение разделены. Коллекция СписокВыбора отвечает только за выпадающий интерфейсный список доступных значений. Ее очистка удаляет пункты из меню выбора, но никак не влияет на само значение, которое уже записано в элемент управления или связанный с ним реквизит.
  2. Ошибочное использование свойства ВыделенныйТекст. Свойство ВыделенныйТекст предназначено исключительно для интерактивной работы с фрагментом строки, который пользователь прямо сейчас выделил курсором в поле ввода. Если поле не находится в режиме редактирования текста, установка ВыделенныйТекст = "" просто игнорируется платформой и не приводит к очистке реквизита.
  3. Ошибка времени выполнения при Значение.Очистить(). Метод Очистить() существует у специализированных коллекций (таких как СписокЗначений, ТаблицаЗначений или Массив). В свойстве Значение поля ввода хранится конкретное прикладное значение (например, ссылка на документ, число, строка или пустая ссылка). Попытка вызвать метод Очистить() у объекта, который не является коллекцией, приводит к аварийному завершению процедуры.

Способ 1. Очистка через свойство Значение элемента формы

Если элемент формы не связан напрямую с реквизитом через свойство «Данные» или вам необходимо очистить сам элемент управления, присвоим пустое значение его свойству Значение.

Посмотрим на пример:


// Очищаем выпадающий список вариантов
ЭлементыФормы.спЗаказов.СписокВыбора.Очистить();

// Сбрасываем выбранное значение элемента формы
ЭлементыФормы.спЗаказов.Значение = "";

Для полей с составным типом данных или объектными типами безопаснее использовать Неопределено, чтобы избежать неявных конфликтов типов при строковом присвоении:

ЭлементыФормы.спЗаказов.Значение = Неопределено;

Способ 2. Очистка через реквизит формы

В большинстве случаев элементы управления привязаны к реквизитам формы через свойство «Данные». В такой ситуации правильнее и надежнее воздействовать на сам реквизит-источник, а не на визуальный элемент. Платформа 1С автоматически обновит отображение на форме, и вызывать дополнительные методы вроде ЭтаФорма.Обновить() не потребуется.

Разберем пример, когда реквизит формы имеет строковый или неопределенный тип:


// Очищаем связанный реквизит формы напрямую
спЗаказов = "";
// Или присваиваем Неопределено
спЗаказов = Неопределено;

Если реквизит строго типизирован ссылочным типом (например, ссылкой на документ ДокументСсылка.ЗаказПокупателя), правильным подходом будет запись пустой ссылки метаданных:

спЗаказов = Документы.ЗаказПокупателя.ПустаяСсылка();

Также можно воспользоваться универсальным приведением типа, которое автоматически сформирует пустое значение нужного типа для поля:

спЗаказов = ЭлементыФормы.спЗаказов.ТипЗначения.ПривестиЗначение();

Нюансы работы: режим выбора из списка и обработка события Очистка

Рассмотрим подробнее важные детали поведения платформы при очистке:

  1. Свойство РежимВыбораИзСписка: Если у поля ввода включено свойство РежимВыбораИзСписка = Истина, поле отображает представление элемента из списка. Если сначала очистить СписокВыбора, а значение реквизита не сбросить, в поле останется «зависший» текст. Поэтому всегда очищайте и коллекцию вариантов, и само значение.
  2. Эмуляция Shift+F4: При интерактивном нажатии клавиш Shift+F4 или нажатии кнопки очистки (крестика) вызывается системное событие Очистка(Элемент, СтандартнаяОбработка). Программная установка значения в коде это событие не вызывает. Если в модуле формы для поля определен обработчик очистки, содержащий сопутствующую логику пересчета, вызовите эту процедуру вручную после программного сброса реквизита.
← На главную