Добрый день!
Кто-нибудь знает как открыть форму выбора справочника с отбором по дополнительному свойству?
Система на БСП, например БП. Через типовой механизм доп. реквизитов и свойств добавлено свойство договору с типом булево. В документе есть ссылка на договор. Можно ли добавить ПараметрыВыбора в документ (через палитру свойств или программно) так, чтобы список выбора фильтровался по нужному значению?
(1) Доп. реквизиты не для этого. Это то, что может использоваться в режиме предприятия. В конфигураторе с доп. реквизитами работать в несколько раз сложнее. Добавить реквизит в конфигурацию и вывести его на форму расширением - выходит в разы легче по сопровождению.
Лично я на доп. реквизитах в программировании поставил крест. В отчетах с отборами по доп. реквизитам тоже веселуха.
(2)Вопрос совсем не в том, что легче или сложнее. Доп. реквизит создавался НЕ именно для этой задачи. Механизм доп.реквизитов уже используется, причем уже в разных механизмах БД. Сейчас нужно доработать тот, который я обозначил.
Попробуй вот так:
В поле где ты выбираешь добавь обработчик события "НачалоВыбора", в нем пропиши:
&НаКлиенте
Процедура ТвойРеквизитНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка=Ложь;
ЗначениеДопРеквизита = ПолучитьЗначениеДопРеквизита(ДоговорСсылка, ИмяСвойства); // тут твое имя свойства (имя доп реквизита из базы)
Параметры = Новый Структура("ЗначениеДопРеквизита", ЗначениеДопРеквизита);
ОткрытьФорму("Справочник.ТвойСправочник.ФормаВыбора",Параметры,Элемент);
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьЗначениеДопРеквизита(ДоговорСсылка, ИмяСвойства)
ЗначениеДопРеквизита = Неопределено;
// получаем список доп реквизитов договора
СписокСвойств = УправлениеСвойствами.СвойстваОбъекта(ДоговорСсылка,Истина);
Свойство = Неопределено;
// перебираем все свойства и ищем нужное по наименованию
Для Каждого Элемент из СписокСвойств Цикл
Если Элемент.Наименование = ИмяСвойства Тогда
Свойство = Элемент;
КонецЕсли;
КонецЦикла;
// если нужное свойство нашлось, то получаем значение
Если ЗначениеЗаполнено(Свойство) Тогда
ЗначениеДопРеквизита = ЗначениУправлениеСвойствами.ЗначениеСвойства(ДоговорСсылка, Свойство);
КонецЕсли;
Возврат ЗначениеДопРеквизита;
КонецФункции
Показать
Затем на форме выбора справочника в процедуре ПриСозданииНаСервере добавь отбор на динамический список по значению твоего доп реквизита:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Параметры.Свойство("ЗначениеДопРеквизита") Тогда
ЗначениеДопРеквизита = Параметры.ЗначениеДопРеквизита;
КомпоновкаДанныхКлиентСервер.ДобавитьОтбор(Список.Отбор,"ПолеНаКотороеНакладываетсяОтбор",ЗначениеДопРеквизита,ВидСравненияКомпоновкиДанных.Равно,ЗначениеЗаполнено(ЗначениеДопРеквизита));
КонецЕсли;
КонецПроцедуры
(1) Могу предложить примерно то же, что и в (4), только не переопределять начало выбора, а просто задать ПараметрВыбора элемента. Установка параметров выбора также позволит не допустить ввод по строке или из истории выбора элементов, неудовлетворяющих отбору.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Запрос = Новый Запрос(
"ВЫБРАТЬ
| Ссылка
|ИЗ
| Справочник.ДоговорыКонтрагентов.ДополнительныеРеквизиты
|ГДЕ
| Свойство.Имя = ""ИмяДопРеквизита""
| И Значение = ИСТИНА");
МассивСсылок = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку(0);
НовыйПараметр = Новый ПараметрВыбора("Отбор.Ссылка", МассивСсылок);
Массив = Новый Массив;
Массив.Добавить(НовыйПараметр);
Элементы.Договор.ПараметрыВыбора = Новый ФиксированныйМассив(Массив);
КонецПроцедуры
Думаю надо
- доработать динамический список (добавив значение доп свойства)
- добавить значение доп свойства на форму списка (если доработка динамического списка программная, то программно)
- добавить поле для отбора на форму и установить отбор динамического списка
Я, для таких ситуаций, использую Форму выбора по запросу. https://infostart.ru/public/1385148/ Достаточно подготовить Запрос и передать необходимые параметры.