Почему не очищается список выбора и как правильно программно обнулить поле в 1С

Программист 1С v8.3 (Управляемые формы)
← На главную

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

Различие между списком выбора и значением реквизита

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

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

Для полного сброса необходимо выполнить два действия одновременно:

  1. Очистить коллекцию доступных вариантов.
  2. Обнулить сам реквизит, связанный с полем.

Разберем это на примере кода:


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

// Очищаем само значение, которое отображается в поле
// Если реквизит имеет тип СправочникСсылка, используем ПустуюСсылку()
// Если тип неопределен или это строка - используем Неопределено или ""
Объект.ВидОтчетности = Справочники.ВидыОтчетности.ПустаяСсылка();

Управление историей выбора при вводе

Проанализируем ситуацию, когда даже после очистки списка и реквизита при начале набора текста в поле начинают всплывать старые значения. Это происходит из-за механизма Истории выбора, который платформа ведет автоматически для удобства пользователя.

Чтобы старые, ранее введенные значения не «засоряли» интерфейс, когда вы программно меняете логику заполнения списка, необходимо управлять свойством ИсторияВыбораПриВводе. Рассмотрим, как это сделать программно:


// Отключаем использование истории для конкретного элемента формы
Элементы.ВидОтчетности.ИсторияВыбораПриВводе = ИсторияВыбораПриВводе.НеИспользовать;

Также это свойство можно установить в конфигураторе в палитре свойств элемента формы. Установка значения Не использовать гарантирует, что система будет опираться только на ваш программно сформированный список.

Режим выбора из списка и жесткое ограничение

Посмотрим на ситуацию, когда пользователю вообще не нужно разрешать вводить произвольные данные, а можно только выбирать из предложенных. Для этого в 1С предусмотрено свойство Режим выбора из списка.

Если этот флаг установлен (РежимВыбораИзСписка = Истина), поле ввода превращается в полноценный выпадающий список. В этом режиме очистка коллекции СписокВыбора в сочетании с обнулением реквизита работает наиболее стабильно. Если же вы хотите, чтобы список заполнялся строго по вашему алгоритму, рекомендуем также обратить внимание на свойство ЗаполнятьИзСпискаВыбора.

Пример надежной очистки и перезаполнения списка

Рассмотрим комплексный пример, который можно использовать в обработчике ПриИзменении родительского поля. Допустим, при смене категории товара нам нужно полностью обновить список доступных моделей в подчиненном поле.


&НаКлиенте
Процедура КатегорияПриИзменении(Элемент)
    
    // 1. Очищаем старое значение в реквизите
    Объект.Модель = Неопределено;
    
    // 2. Получаем доступ к списку выбора элемента формы
    Список = Элементы.Модель.СписокВыбора;
    Список.Очистить();
    
    // 3. Можно также пересоздать список для надежности (сброс кэша платформы)
    // Список = Новый СписокЗначений; 
    
    // 4. Заполняем новыми данными (в реальности здесь будет запрос к базе)
    Список.Добавить("Модель А");
    Список.Добавить("Модель Б");
    
    // 5. Устанавливаем режим работы поля
    Элементы.Модель.РежимВыбораИзСписка = Истина;
    Элементы.Модель.ИсторияВыбораПриВводе = ИсторияВыбораПриВводе.НеИспользовать;
    
    // 6. Принудительно обновляем отображение, чтобы исключить визуальные артефакты
    ЭтаФорма.ОбновитьОтображениеДанных();
    
КонецПроцедуры

Метод ОбновитьОтображениеДанных()

Иногда программный код выполняется корректно, значения в памяти изменены, но пользователь интерфейса продолжает видеть «призрак» старого значения до тех пор, пока не кликнет по форме. Чтобы избежать этого, мы используем метод ЭтаФорма.ОбновитьОтображениеДанных(). Этот метод заставляет платформу перерисовать элементы управления в соответствии с текущим состоянием реквизитов в памяти. Это особенно полезно при сложной динамической работе с элементами формы.

Специфика для разных типов данных

Выясним еще один нюанс: если ваш реквизит имеет составной тип данных, то простое присвоение Неопределено может не всегда срабатывать так, как ожидается для очистки списка выбора. В некоторых случаях требуется сначала ограничить тип значения элемента формы, используя свойство ОграничениеТипа. Это подскажет платформе, метаданные какого именно объекта нужно использовать для инициализации механизма выбора.

Подведем итог: для успешной очистки списка выбора и поля ввода необходимо действовать комплексно: очищать коллекцию СписокВыбора, обнулять связанный реквизит Объект.ИмяРеквизита, отключать ИсторияВыбораПриВводе и, при необходимости, вызывать обновление интерфейса. Такой подход гарантирует отсутствие «кешированных» старых значений и корректную работу пользователя с формой.

← На главную