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