Предприятие 8.2 УФ.
В СКД передаю запрос с Владельцами и Подчиненными элементами (для примера Контрагентов и договора),
в Наборе данных в поле "Договоры" выбираю Параметры редактирования - Связи параметров выбора
ввожу в Параметры выбора "Отбор.Владелец", и в Поле "Контрагент".
Теперь, когда я выбираю одного Контрагента, то выбирается список его договоров, но когда я открываю 2-х и более Контрагентов, то вываливается весь список договоров, без какого-либо отбора.
Вопрос: Как настроить связь, что бы при выборе нескольких Контрагентов выдавался список Договоров только этих Контрагентов?
(1) ikar-nikolay,
при выборе в отборе настроек СКД ???
и это наверное действует только в управляемом приложений.
в обычной форме у меня эти настройки ни на что не влияют.
ЗЫ
и не в "оформлении" поля СКД а в его "параметрах редактирования".
(2)
есть еще кроме "связей параметров выбора"
так называемые "параметры выбора"
можно поиграться с ними - среди типов параметра там есть список значений
...
хотя мне сдается что условия связей "в списке" вряд ли поддерживается покрайней мере явно нигде про это не говорится.
(5) Rothschild, тогда получается, то нужно отловить событие изменения настройки, и Договора вносить принудительно в указанные "Параметры выбора" в соответствии с выбором Контрагентов. Постараюсь тогда отписаться о результате, поскольку, как мне кажется, вопрос достаточно интересный.
Будут идеи - отписывайте!
(6) ikar-nikolay, отборы вынести через табличную часть а далее перехватывать событие при начале выбора - с передачей параметра в форму выбора - примерно так. Т.е. юзать свою форму настроек а не СКД-шную, и на ней делать перехват с передачей параметров по нужной логике.
(11) Восьмой, ну да, поэтому создал Форму СКД и над ней хочу провести шаманство.
Там есть КомпоновщикНастроекПользовательскиеНастройки, который выкидывает все настройки и по умолчанию и пользовательские. Через этот реквизит и буду пытаться закидывать объекты для выбора.
(6) ikar-nikolay,
с практической проверкой идей у меня проблемка.
главная база в УПП-1.2 на 8.1.
бухии правда в УПП-1.3 на 8.2, зато, блин! - в режиме совместимости 8.1
...
в режиме управляемого приложения не запускаются!!!
-)))
(8) Rothschild, создай новую базу на УФ, в ней создай 2 справочника, один из которых владелец другого, внеси пару элементов Владельцев и по паре закрепленных за владельцем + отчет на СКД. Вот и вся практика. )))))
Для правильной реализации выбрал следующий план действий:
1) Сохранение текущих значений Владельца при изменении и при открытии (во время загрузки настроек)
2) Для вывода списка значений Подчиненного справочника - создаем свою форму (СписокЗначенийПодчиненногоСправочника) и там же добавляем ещё реквизит НаименованиеВладельца. Это улучшит визуализацию и при выборе договоров "Основной" у двух контрагентов будет понятно чей он.
3) При клике на значении Подчиненного справочника (Договора) передаем в параметрах введенных Владельцев в СписокЗначенийПодчиненногоСправочника (п.2) и открываем форму.
4) При клике на значение СписокЗначенийПодчиненногоСправочника открывать ФормуВыбора Подчиненного справочника (Договора) с нужным отбором и после выбора значения помещать в СписокЗначенийПодчиненногоСправочника.
5) При нажатии "Сохранить" в СписокЗначенийПодчиненногоСправочника настройки меняют типовые.
Для выполнения пункта 1 написал процедуру
&НаСервере
Процедура ДобавитьСписокОбъектовСтроительстваВДопСвойстваНастроек()
ТекущийОтбор = Отчет.КомпоновщикНастроек.ПолучитьНастройки().Отбор.Элементы;
Для каждого строкаОтбора Из ТекущийОтбор Цикл
Если Строка(строкаОтбора.ЛевоеЗначение) = "ОбъектСтроительства" Тогда
Если Отчет.КомпоновщикНастроек.Настройки.ДополнительныеСвойства.Свойство("СписокОтбораОбъектовСтроительства") Тогда
Отчет.КомпоновщикНастроек.Настройки.ДополнительныеСвойства.СписокОтбораОбъектовСтроительства = строкаОтбора.ПравоеЗначение;
Иначе
Отчет.КомпоновщикНастроек.Настройки.ДополнительныеСвойства.Вставить("СписокОтбораОбъектовСтроительства", строкаОтбора.ПравоеЗначение);
КонецЕсли;
Прервать;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Показать
При выполнении сохраняются текущие значения Владельца (у меня объект строительства) в ДополнительныеСвойства настроек. В дальнейшем их можно получить откуда угодно.
Эта процедура выполняется при загрузке отчета:
(17) ikar-nikolay,
это все хорошо - отважные герои всегда идут в обход
;)))
есть "небольшой" недостаток у решения - уж слишком оно не универсально:
приходится подгоняться к структуре полей отчета (их именам) и предусматривать специфические формы выбора.
***
но повидимому другого решения задачи нет -
- при нынешней реализации СКД и управляемых форм.
ЗЫ
можно разве что
попытаться сделать предлагаемый механизм чуток универсальней.
Я пошутил выше по поводу сохранения значений в параметры... )))
Сделал универсально, но не максимально универсально... если найдется деятель, который форму созданную физически создаст кодами конфигуратора и закрепит обработчики событий, то это будет максимальная универсация.
Форма выбора открывается, когда и у Подчиненного и у Владельца указан тип значения (ВСписке)!!!
Для реализации нам требуется:
1) создать произвольную форму в СКД с названием "ФормаВыбораПодчинения"
и следующими реквизитами (соответственно реквизиты ВладелецВыбор и ПодчиненныйВыбор должны иметь правильную ссылку)
В коде формы необходимо подставить название справочника подчиненных элементов в переменную строкаСпрПодчинененныхЭлементов (например "Договоры")
Все остальное без изменений. В коде дал подробные разъяснения что и зачем.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
//СоздаемНаименование колонок аналогично значениям отбора
Элементы.СписокПодчиненныхЭлементов.ПодчиненныеЭлементы.СписокПодчиненныхЭлементовВладелецВыбор.Заголовок = Параметры.СтруктураВладельца.ЛевоеЗначение;
Элементы.СписокПодчиненныхЭлементов.ПодчиненныеЭлементы.СписокПодчиненныхЭлементовВладелецВыбор.ТолькоПросмотр = Истина;
Элементы.СписокПодчиненныхЭлементов.ПодчиненныеЭлементы.СписокПодчиненныхЭлементовПодчиненныйВыбор.Заголовок = Параметры.СтруктураПодчиненного.ЛевоеЗначение;
// Создаем переданную структуру
списокзначенийВведенных = Параметры.СтруктураПодчиненного.ПравоеЗначение;
СписокПодчиненныхЭлементов.Очистить();
Если ТипЗнч(Параметры.СтруктураПодчиненного.ПравоеЗначение) = Тип("СписокЗначений") Тогда
Для каждого значение из списокзначенийВведенных Цикл
НовоеЗначение = СписокПодчиненныхЭлементов.Добавить();
НовоеЗначение.ПодчиненныйВыбор = значение.Значение;
НовоеЗначение.ВладелецВыбор = значение.Значение.Владелец;
КонецЦикла;
КонецЕсли;
Если ТипЗнч(Параметры.СтруктураВладельца.ПравоеЗначение) = Тип("СписокЗначений") Тогда
Для каждого значение из Параметры.СтруктураВладельца.ПравоеЗначение Цикл
СписокВладельцев.Добавить(значение.Значение);
КонецЦикла;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура СписокПодчиненныхЭлементовПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)
строкаСпрПодчинененныхЭлементов = "автОсиОбъектаСтроительства";
ПараметрыПодбора = Новый Структура("ЗакрыватьПриВыборе, МножественныйВыбор", Истина, Ложь);
ФормаВыбора = ПолучитьФорму("Справочник."+строкаСпрПодчинененныхЭлементов+".ФормаВыбора",ПараметрыПодбора,Элемент);
ЭлементОтбора = ФормаВыбора.Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Владелец");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке;
ЭлементОтбора.ПравоеЗначение = СписокВладельцев;
ЭлементОтбора.Использование = Истина;
Значение = ФормаВыбора.ОткрытьМодально();
Если Не Значение = Неопределено Тогда
Элемент.ТекущиеДанные.ПодчиненныйВыбор = Значение;
Элемент.ТекущиеДанные.ВладелецВыбор = ПолучитьВладельцаПоПодчиненному(Значение)
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция ПолучитьВладельцаПоПодчиненному(ссылкаПодчиненный)
Возврат ссылкаПодчиненный.Владелец;
КонецФункции
&НаКлиенте
Процедура ВыполнитьОк(Команда)
// Получаем в списки значений значения Владельцев и Подчиненных элементов
// для возврата их при закрытии формы
списокзначенийВладельцы = Новый СписокЗначений;
списокзначенийПодчиненные = Новый СписокЗначений;
Для каждого ВыбранныеЗначения Из СписокПодчиненныхЭлементов Цикл
Если списокзначенийПодчиненные.НайтиПоЗначению(ВыбранныеЗначения.ПодчиненныйВыбор) = Неопределено Тогда
списокзначенийПодчиненные.Добавить (ВыбранныеЗначения.ПодчиненныйВыбор);
КонецЕсли;
Если списокзначенийВладельцы.НайтиПоЗначению(ВыбранныеЗначения.ВладелецВыбор) = Неопределено Тогда
списокзначенийВладельцы.Добавить (ВыбранныеЗначения.ВладелецВыбор);
КонецЕсли;
КонецЦикла;
СтруктураДляВозврата = Новый Структура;
СтруктураДляВозврата.Вставить("списокзначенийВладельцы", списокзначенийВладельцы);
СтруктураДляВозврата.Вставить("списокзначенийПодчиненные", списокзначенийПодчиненные);
ЭтаФорма.Закрыть(СтруктураДляВозврата);
КонецПроцедуры
Показать
2) В КомпоновщикНастроекПользовательскиеНастройки (см. пост выше) на ПередНачаломИзменения вешаем приведенный ниже обработчик.
Все, что нам тут необходимо ввести, это строковое название Реквизита владельца и подчиненного в переменные НазваниеРеквизитаВладельца, НазваниеРеквизитаПодчиненного.
&НаКлиенте
Процедура КомпоновщикНастроекПользовательскиеНастройкиПередНачаломИзменения(Элемент, Отказ)
// Название реквизитов Владельца и Подчиненного
НазваниеРеквизитаВладельца = "ОбъектСтроительства";
НазваниеРеквизитаПодчиненного = "Ось";
// Структуры для хранения текущих отборов и передачи их в форму
СтруктураПодчиненного = Новый Структура;
СтруктураВладельца = Новый Структура;
СтруктураДляПередачиВФорму = Новый Структура;
//Поехали! Если пытаются изменить отбор подчиненного элемента, тогда...
Если Элемент.ТекущиеДанные.Настройка = НазваниеРеквизитаПодчиненного Тогда
// ... считываем текущие отборы и помещаем в СтруктураПодчиненного и СтруктураВладельца
Для каждого строкаНастройки из Отчет.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы[0].Элементы Цикл
Если Строка(строкаНастройки.ЛевоеЗначение) = НазваниеРеквизитаПодчиненного Тогда
// добавляем структуру отбора Подчиненного
СтруктураПодчиненного.Очистить();
СтруктураПодчиненного.Вставить("ЛевоеЗначение", Строка(строкаНастройки.ЛевоеЗначение));
СтруктураПодчиненного.Вставить("ПравоеЗначение", строкаНастройки.ПравоеЗначение);
СтруктураПодчиненного.Вставить("ВидСравнения", Строка(строкаНастройки.ВидСравнения));
СтруктураПодчиненного.Вставить("Использование", строкаНастройки.Использование);
ИначеЕсли Строка(строкаНастройки.ЛевоеЗначение) = НазваниеРеквизитаВладельца Тогда
// добавляем структуру отбора Владельца
СтруктураВладельца.Очистить();
СтруктураВладельца.Вставить("ЛевоеЗначение", Строка(строкаНастройки.ЛевоеЗначение));
СтруктураВладельца.Вставить("ПравоеЗначение", строкаНастройки.ПравоеЗначение);
СтруктураВладельца.Вставить("ВидСравнения", Строка(строкаНастройки.ВидСравнения));
СтруктураВладельца.Вставить("Использование", строкаНастройки.Использование);
КонецЕсли;
КонецЦикла;
// Если Владелец присутствует в списке и используется...
Если СтруктураВладельца.Количество() > 0 Тогда
Если СтруктураВладельца.Использование
И СтруктураВладельца.ВидСравнения = Строка(ВидСравненияКомпоновкиДанных.ВСписке)
И СтруктураПодчиненного.Использование
И СтруктураПодчиненного.ВидСравнения = Строка(ВидСравненияКомпоновкиДанных.ВСписке)
Тогда
//... вот только в этом случае мы открываем нашу форму выбора
СтруктураДляПередачиВФорму.Очистить();
СтруктураДляПередачиВФорму.Вставить("СтруктураПодчиненного", СтруктураПодчиненного);
СтруктураДляПередачиВФорму.Вставить("СтруктураВладельца", СтруктураВладельца);
ФормаВыбора = ПолучитьФорму("Отчет.рзмкПанельОбеспеченияМеталлом.Форма.ФормаВыбораПодчинения", СтруктураДляПередачиВФорму, Элемент);
ИтоговыйПодбор = ФормаВыбора.ОткрытьМодально();
Если Не ИтоговыйПодбор = Неопределено тогда
Для каждого строкаНастройки из Отчет.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы[0].Элементы Цикл
Если Строка(строкаНастройки.ЛевоеЗначение) = НазваниеРеквизитаПодчиненного Тогда
Если Не ТипЗнч(ИтоговыйПодбор.списокзначенийПодчиненные) = Тип("СписокЗначений") Тогда
Продолжить;
КонецЕсли;
строкаНастройки.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке;
строкаНастройки.ПравоеЗначение.Очистить();
Для каждого строкаНовойНастройки Из ИтоговыйПодбор.списокзначенийПодчиненные Цикл
строкаНастройки.ПравоеЗначение.Добавить(строкаНовойНастройки.Значение);
КонецЦикла;
ИначеЕсли Строка(строкаНастройки.ЛевоеЗначение) = НазваниеРеквизитаВладельца Тогда
Если Не ТипЗнч(ИтоговыйПодбор.списокзначенийВладельцы) = Тип("СписокЗначений") Тогда
Продолжить;
КонецЕсли;
строкаНастройки.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке;
строкаНастройки.ПравоеЗначение.Очистить();
Для каждого строкаНовойНастройки Из ИтоговыйПодбор.списокзначенийВладельцы Цикл
строкаНастройки.ПравоеЗначение.Добавить(строкаНовойНастройки.Значение);
КонецЦикла;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Показать
В созданной форме выбора можно будет добавить список Владельцев, по которым необходимо делать отборы и после завершения подбора, выбранные значения Владельцев автоматически попадут в настройки.