// Получает договор контрагента по умолчанию с учетом условий отбора. Возвращается основной договор или единственный или пустая ссылка
//
// Параметры
//  ВладелецДоговора    –     <СправочникСсылка.Контрагенты> 
//                                                      Контрагент, договор которого нужно получить
//  ОрганизацияДоговора      –     <СправочникСсылка.Организации> 
//                                                      Организация, договор которой нужно получить
//  СписокВидовДоговора      –     <Массив> или <СписокЗначений>, состоящий из значений типа <ПеречислениеСсылка.ВидыДоговоровКонтрагентов> 
//                                                      Нужные виды договора
//  СтруктураПараметров      –     <Структура>
//                                                      Структура дополнительных параметров отбора договоров по реквизитам.
//                                                      Элементы структуры СтруктураПараметров:
//                                                      Ключ - имя реквизита договора, Значение - еще одна структура
//                                                      
//                                                      Элементы структуры, которая находится в Значение:
//                                                      Ключ - "ЗначениеОтбора", Значение - значение реквизита договора для отбора. Обязательный элемент.
//                                                      Ключ - "ВидСравненияОтбора", Значение - <ВидСравнения>. Необязательный элемент, по умолчанию ВидСравнения.Равно
//
// Возвращаемое значение:
//   <СправочникСсылка.ДоговорыКонтрагентов> – найденный счет или пустая ссылка
//
Функция УстановитьДоговорКонтрагента(ДоговорКонтрагента,ВладелецДоговора, ОрганизацияДоговора, СписокВидовДоговора=неопределено, СтруктураПараметров = Неопределено) Экспорт
        НовыйДоговор = Справочники.ДоговорыКонтрагентов.ПустаяСсылка();
        Запрос = Новый Запрос;
        ТекстЗапроса = 
        "ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 2
        |       ДоговорыКонтрагентов.Ссылка,
        |       ВЫБОР
        |               КОГДА СправочникВладелец.Ссылка ЕСТЬ НЕ NULL 
        |                       ТОГДА 1
        |               ИНАЧЕ 2
        |       КОНЕЦ КАК Приоритет
        |ИЗ
        |       Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
        |               ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК СправочникВладелец
        |               ПО ДоговорыКонтрагентов.Владелец = СправочникВладелец.Ссылка
        |                       И ДоговорыКонтрагентов.Ссылка = СправочникВладелец.ОсновнойДоговорКонтрагента
        |ГДЕ
        |       &ТекстФильтра
        |
        |УПОРЯДОЧИТЬ ПО
        |       Приоритет";
        
        Запрос.УстановитьПараметр("ВладелецДоговора", ВладелецДоговора);
        Запрос.УстановитьПараметр("ОрганизацияДоговора", ОрганизацияДоговора);
        Запрос.УстановитьПараметр("СписокВидовДоговора", СписокВидовДоговора);
        
        ТекстФильтра = "
        |       ДоговорыКонтрагентов.Владелец = &ВладелецДоговора
        |       И ДоговорыКонтрагентов.Организация = &ОрганизацияДоговора
        |       И ДоговорыКонтрагентов.ПометкаУдаления = ЛОЖЬ"
        +?(СписокВидовДоговора<>неопределено,"
        |       И ДоговорыКонтрагентов.ВидДоговора В (&СписокВидовДоговора)","");
        
        Если ТипЗнч(СтруктураПараметров) = Тип("Структура") Тогда
                Для каждого Параметр Из СтруктураПараметров Цикл
                        ИмяРеквизита = Параметр.Ключ;
                        СтруктураОтбора = Параметр.Значение;
                        ВидСравненияЗапроса = ПолучитьВидСравненияДляЗапроса(СтруктураОтбора);
                        ТекстФильтра = ТекстФильтра + "
                        |       И ДоговорыКонтрагентов." + ИмяРеквизита + " " + ВидСравненияЗапроса + " (&" + ИмяРеквизита + ")";
                        Запрос.УстановитьПараметр(ИмяРеквизита, СтруктураОтбора.ЗначениеОтбора);
                КонецЦикла;
        КонецЕсли;
        
        ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ТекстФильтра", ТекстФильтра);
        
        Запрос.Текст = ТекстЗапроса;
        Результат = Запрос.Выполнить();
        
        Если Не Результат.Пустой() Тогда
        
                Выборка = Результат.Выбрать();
                Выборка.Следующий();
                
                НайденОсновнойДоговор = Выборка.Приоритет = 1;
                НайденОдинДоговор     = Выборка.Количество() = 1;
                
                Если НайденОсновнойДоговор ИЛИ НайденОдинДоговор Тогда
                        НовыйДоговор = Выборка.Ссылка;
                КонецЕсли;
        
        КонецЕсли;
        
        Если (ДоговорКонтрагента.Владелец<>ВладелецДоговора ИЛИ ДоговорКонтрагента.Организация<>ОрганизацияДоговора) ИЛИ (не ЗначениеЗаполнено(ДоговорКонтрагента)) Тогда 
                ДоговорКонтрагента = НовыйДоговор;
                Возврат Истина;
        Иначе
                Возврат Ложь;
        КонецЕсли;
        
КонецФункции // ПолучитьДоговорКонтрагента()