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