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