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

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

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

Задача 1: Отключение истории выбора

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

Интерактивный метод (через свойства):

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

  1. Перейдем в палитру свойств элемента.
  2. Найдем категорию Использование.
  3. Установим свойство ИсторияВыбораПриВводе в значение Не использовать.

Программный метод:

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


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // Отключаем историю выбора для элемента формы
    Элементы.ИмяВашегоРеквизитаСписок.ИсторияВыбораПриВводе = ИсторияВыбораПриВводе.НеИспользовать;
КонецПроцедуры

Полная очистка накопленной истории:

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


// Очистка истории выбора для конкретного объекта метаданных
ИсторияВыбора.Очистить(Метаданные.Справочники.Номенклатура);

Задача 2: Установка отбора при открытии формы выбора

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

Способ А: Использование свойства "Параметры выбора"

Это наиболее предпочтительный метод, так как он не требует написания кода и работает максимально быстро. Проанализируем шаги настройки:

  1. В конфигураторе выберем элемент формы (поле списка значений).
  2. Найдем свойство Параметры выбора (ChoiceParameters).
  3. Нажмем на кнопку с многоточием.
  4. Добавим новый параметр: в колонке "Имя" выберем Отбор.ГлавнаяНоменклатура, а в колонке "Значение" установим Истина.

Теперь при нажатии кнопки "Добавить" в списке значений форма выбора справочника автоматически откроется с наложенным фильтром.

Способ Б: Программная обработка события "НачалоВыбора"

Иногда отбор должен быть сложным или зависеть от других данных на форме. В этом случае нам придется перехватить стандартный процесс открытия формы. Рассмотрим этот алгоритм пошагово.

Для начала, создадим на форме событие НачалоВыбора для нашего элемента. Выясним причину использования СтандартнаяОбработка = Ложь: это необходимо, чтобы система не открывала стандартную форму, так как мы вызовем свою с нужными параметрами.


&НаКлиенте
Процедура СписокНоменклатурыНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    
    // Останавливаем стандартное открытие формы
    СтандартнаяОбработка = Ложь;
    
    // Формируем структуру отбора
    Отбор = Новый Структура;
    Отбор.Вставить("ГлавнаяНоменклатура", Истина);
    
    // Описываем параметры открытия формы
    ПараметрыФормы = Новый Структура;
    ПараметрыФормы.Вставить("Отбор", Отбор);
    ПараметрыФормы.Вставить("ЗакрыватьПриВыборе", Истина);
    // Если нужен множественный выбор, можно добавить:
    // ПараметрыФормы.Вставить("МножественныйВыбор", Истина);
    
    // Создаем описание оповещения для обработки результата выбора
    ОписаниеОповещения = Новый ОписаниеОповещения("ОбработатьВыборНоменклатуры", ЭтотОбъект);
    
    // Открываем форму выбора справочника
    ОткрытьФорму("Справочник.Номенклатура.ФормаВыбора", ПараметрыФормы, Элемент, , , , ОписаниеОповещения);
    
КонецПроцедуры

&НаКлиенте
Процедура ОбработатьВыборНоменклатуры(ВыбранноеЗначение, ДополнительныеПараметры) Экспорт
    
    Если ВыбранноеЗначение = Неопределено Тогда
        Возврат;
    КонецЕсли;
    
    // Если в форме выбора включен множественный выбор, придет Массив
    Если ТипЗнч(ВыбранноеЗначение) = Тип("Массив") Тогда
        Для Каждого СсылкаИзМассива Из ВыбранноеЗначение Цикл
            Объект.СписокНоменклатуры.Добавить(СсылкаИзМассива);
        КонецЦикла;
    Иначе
        // Если выбран один элемент
        Объект.СписокНоменклатуры.Добавить(ВыбранноеЗначение);
    КонецЕсли;
    
КонецПроцедуры

Дополнительные нюансы и полезные советы

При работе с формой выбора и списками значений стоит учитывать еще несколько важных моментов, которые сделают ваш интерфейс более профессиональным:

  1. Тип значения реквизита: Убедитесь, что у вашего реквизита типа СписокЗначений жестко задан Тип значения (например, СправочникСсылка.Номенклатура). Если оставить тип составным, то при попытке добавления элемента система сначала предложит выбрать тип данных, что создаст лишний клик для пользователя.
  2. Скрытие групп (папок): Если вы хотите, чтобы в форме выбора отображались только товары, но не папки, добавьте в параметры выбора ВыборГруппИЭлементов со значением ИспользованиеГруппИЭлементов.Элементы.
  3. Связи параметров выбора: Если ваш список должен фильтроваться в зависимости от другого поля на форме (например, "Склад"), используйте свойство Связи параметров выбора. Рассмотрим пример: вы выбираете категорию в одном поле, и список значений автоматически начинает фильтровать номенклатуру по этой категории без написания кода.
  4. Автоподбор: Чтобы отбор работал не только через форму выбора, но и при быстром наборе текста в поле, рекомендуется продублировать логику в модуле менеджера справочника в процедуре ОбработкаПолученияДанныхВыбора — для этого подойдёт расширение для автоподбора и поиска в полях.

Резюмируем: Для простых задач используйте палитру свойств (ИсторияВыбораПриВводе и Параметры выбора). Если же логика требует динамики — используйте событие НачалоВыбора с объектом ОписаниеОповещения — вспомогательные задачи упростит многофункциональный инструментарий разработчика 1С. Это обеспечит корректную работу в тонком и веб-клиенте.

← На главную