Имеется самописный отчет по ценам (ПрайсЛистам) организации.
В запросе выбирается 2 цены из 2х разных регистров сведений: (РегистрЦен и самописный РегистрЦенКонтрагентов).
В параметрах(Элементах отбора) присутствуют ссылки на 4 справочника (Контрагент, Договор,ВидЦены и Номенклатуру).
Имеется справочник "ВидЦен" который не имеет Владельца! Но у справочника "договоров" есть реквизит с ссылкой на справочник "ВидЦен" . Так вот вопрос: Как при выборе договора автоматически подставить "вид цены" в элемент отбора.
Типа если ЗначениеЗаполнено (Объект.Договор) Тогда ВидЦен = "Договор.Ссылка.ВидЦен".
---
В выражение параметра ВидЦен написать:
Выбор Когда ЗначениеЗаполнено(&Договор) Тогда ОбщегоНазначения.ЗначениеРеквизитаОбъекта(&Договор,"ВидЦен")
Иначе Неопределено
Конец
---
При компоновке результата (в модуле отчета, если он у тебя на скд) перехвати настройки, сделай нужную проверка и добавь в отбор нужное значение.
---
Вот код модуля

```1c
    Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)

    СтандартнаяОбработка = Ложь;

    МассивЗаголовковРесурсов = Новый Массив;
    НастройкиОтчета = КомпоновщикНастроек.ПолучитьНастройки();
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, НастройкиОтчета, ДанныеРасшифровки);

    //Создадим и инициализируем процессор компоновки
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки, Истина);

    //Создадим и инициализируем процессор вывода результата
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ДокументРезультат);

    //Обозначим начало вывода
    ПроцессорВывода.НачатьВывод();
    ТаблицаЗафиксирована = Ложь;

    ДокументРезультат.ФиксацияСверху = 0;
    //Основной цикл вывода отчета
    Пока Истина Цикл
    //Получим следующий элемент результата компоновки
    ЭлементРезультата = ПроцессорКомпоновки.Следующий();

    Если ЭлементРезультата = Неопределено Тогда
    //Следующий элемент не получен - заканчиваем цикл вывода
    Прервать;
    Иначе
    // Зафиксируем шапку
    Если Не ТаблицаЗафиксирована
    И ЭлементРезультата.ЗначенияПараметров.Количество() > 0
    И ТипЗнч(КомпоновщикНастроек.Настройки.Структура[0]) <> Тип("ДиаграммаКомпоновкиДанных") Тогда

    ТаблицаЗафиксирована = Истина;
    ДокументРезультат.ФиксацияСверху = ДокументРезультат.ВысотаТаблицы;

    КонецЕсли;
    //Элемент получен - выведем его при помощи процессора вывода
    ПроцессорВывода.ВывестиЭлемент(ЭлементРезультата);
    КонецЕсли;
    КонецЦикла;

    ПроцессорВывода.ЗакончитьВывод();
    КонецПроцедуры
```
---
Попробуй как -нибудь так найти договор и вид цены, и установи параметр

```1c
    Для Каждого ПараметрПользователя из КомпоновщикНастроек.ПользовательскиеНастройки.Элементы Цикл
    Если ТипЗнч(ПараметрПользователя) = Тип("ЭлементОтбораКомпоновкиДанных") Тогда

    Если ТипЗнч(ПараметрПользователя.Значение) = Тип("СправочникСсылка.ДоговорыКонтрагентов") Тогда

    //нашли договор
    КонецЕсли;

    КонецЕсли;
    КонецЦикла;
```
---
Создать форму отчета.
На элемент формы КомпоновщикНастроекПользовательскиеНастройки повесить обработку события ПриИзменении, в которой написать примерно такое:

```1c
    Значение = Отчет.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы[1].Значение;
    Если Значение <> Неопределено Тогда
    Отчет.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы[2].Значение = Значение.ВидЦен
    КонецЕсли;
```

В тонком клиенте, соответственно, надо вызвать сервер.
---
При выборе Договора мне необходимо из этого договора выбрать "ВидЦен" и вставить выбранный "ВидЦен" в поле отбора отчета.
---
При чем этот вид цен автоматически должен меняться при выборе другого договора.
Я пробовал выбрать в запросе "Где Договор.ВидЦен=&ВидЦен" Но толку от этого нуль.
---
А если пользователь уберет отборы или поменяет их порядок, то полетят ошибки.
---
Пользователь отбирает только по полям "Контрагент", "Номенклатура", "Договор" .
Поле отбора "ВидЦен" должно заполняться автоматически при выборе договора.
---
Ну для начала регистры ЦеныНоменклатуры и ЦеныНоменклатурыКонтрагентов являются типовыми для УНФ. С незапамятных времен. И там и там есть измерение ВидЦен.
Что-то не то с задачей.
---
(РегистрЦен и самописный РегистрЦенКонтрагентов)
Я же специально указал. То что есть типовой понятно...
---
В него записываются индивидуальные цены отличные от обычных "ЦенНоменклатуры"
---
Ну так во-первых покажите структуру этого "самописного" регистра сведений. Скриншот, какие у него измерения, какие ресурсы, какие реквизиты.
периодический/непериодический.

А во-вторых, странно, что отбор происходит не по измерениям, а по справочникам.
---
Вот 2 регистра
---
Так же если устанавливать связь параметров выбора "Отбор.Ссылка" Поле "договор", связь пытается найти неопределенную ссылку.
---
Может подойдет в СКД тип данных для правое значение отбора ВидЦен выбрать поле компоновки данных Договор.ВидЦен.
Отображаться значение не будет, но отбор будет происходить как Вам требуется.
---
Именно, в случае отбора ВидЦен равно Договор.ВидЦен запрос отрабатывает исключительно записи второго регистра сведений я так понимаю это специфика компоновки.
---
случае отбора ВидЦен равно Договор.ВидЦен запрос отрабатывает исключительно записи второго регистра сведений я так понимаю это

Тогда может лезть глубже в справочник и делать отбор не по ссылке на справочник ВидЦен, а по ВидЦен.Наименование и и Договор.ВидЦен.Наименование.
Это единственное что можно сравнить у этих двух полей.
---
Я пробовал, но нужно не сравнение а исходя из параметров отбора. Если вручную проставляю Договор и Вид Цены То отображается всё так как необходимо. Если В СКД Указать отбор ВидЦен=Договор.ВидЦен То тут сразу выбирается все ТОЛЬКО из регистра цен контрагента. Я Так же пробывал разделить запрос на 2 набора данных, но результат один и тот же.
---
Я предлагаю сделать отбор ВидЦен.Наименование=Договор.ВидЦен.Наименование скорее всего Поля ВидЦен в регистрах из разных справочников, поэтому СКД выдаёт данные только из одного регистра.
---
По наименованию аналогичная ситуация. Справочник один и тот же. Регистры сведений разные. Ресурс в РСвед "ВидЦен" ссылается на один и тот справочник.
---
Выложите текст запроса
---
Значит нужно передавать ВидЦены в параметры запроса
Кривовато, но должно работать

```1c
    Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)

    СтандартнаяОбработка = Ложь;

    Для Каждого ЭлементОтбора Из КомпоновщикНастроек.Настройки.Отбор.Элементы Цикл
    Если ЭлементОтбора.Использование
    И ТипЗнч(ЭлементОтбора.ПравоеЗначение) = ТипЗнч(Справочники.ДоговорыКонтрагентов.ПустаяСсылка())
    И НЕ ЭлементОтбора.ПравоеЗначение = Справочники.ДоговорыКонтрагентов.ПустаяСсылка() Тогда

    ПараметрВидЦены = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("ВидЦены");
    Если ПараметрВидЦены <> Неопределено Тогда
    ПараметрВидЦены.Значение = ЭлементОтбора.ПравоеЗначение.ВидЦены;
    ПараметрВидЦены.Использование = Истина;
    КонецЕсли;
    КонецЕсли;
    КонецЦикла;

    МассивЗаголовковРесурсов = Новый Массив;
    НастройкиОтчета = КомпоновщикНастроек.ПолучитьНастройки();
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, НастройкиОтчета, ДанныеРасшифровки);

    //Создадим и инициализируем процессор компоновки
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки, Истина);

    //Создадим и инициализируем процессор вывода результата
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ДокументРезультат);

    //Обозначим начало вывода
    ПроцессорВывода.НачатьВывод();
    ТаблицаЗафиксирована = Ложь;
    ...
```

В запросе пишете
{ГДЕ
 (РС1.ВидЦены = &ВидЦены),
 (РС2.ВидЦены = &ВидЦены)}
---
Таким образом тоже не получается обойти. Он не понимает ДоговорыКонтрагентов.ПустаяСсылка как я понял.
---
я не знаю из какого справочника вы договор берете. написал для примера. в УТ справочник ДоговорыКонтрагентов, где нет реквизита ВидЦены.
Подставляйте, что у Вас...
---
Именно в справочнике "ДоговорыКонтрагентов" есть ссылка на "ВидЦен". У вас все правильно написано. Не отрабатывает выбор из договора.
---
А в чем сложность в СКД на закладке параметры указать выражение для параметра ВидЦен из параметра Договор?
---
Договор находится в структуре пользовательских отборов, ВидЦен задан как параметр. Как написать выражение?
---
Если договор задан как отбор, то может быть сравнение на не равно, не в списке, не в группе - и тд.
Тогда брать вид цен из договора будет не корректно.
Его можно брать только если вид сравнения будет равно.
А если так, то почему бы в параметр не перенести?
---
Да уж
---
Чтобы написать выражение "&Договор.ВидЦен" необходимо указать параметр в запросе "&Договор.ВидЦен".
---
Чтобы такой параметр присутствовал. Присутствует только &Договор
---
В выражение параметра ВидЦен написать:
Выбор Когда ЗначениеЗаполнено(&Договор) Тогда ОбщегоНазначения.ЗначениеРеквизитаОбъекта(&Договор,"ВидЦен")
Иначе Неопределено
Конец
---
Выбор Когда ЗначениеЗаполнено(&Договор) Тогда ОбщегоНазначения.ЗначениеРеквизитаОбъекта(&Договор,"ВидЦен")
Иначе Неопределено
Конец
Это РЕШЕНИЕ всё правильно отрабатывает! Спасибо огромное!
---
Пожалуйста =)
---
Неопределено для составного типа.
---
Если там не составной тип то лучше ЗНАЧЕНИЕ(Справочник.ВидыЦен.ПустаяСсылка)
---
интересно