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