Нужна помощь по отсеиванию договоров которые уже созданы. По наименованию вроде работает, а вот по контрагентам никак не получается. То есть если например мы создаем Договор с именем 1 и Контрагентом 1 то он должен говорить что такой договор уже есть, а если создаем с именем 1 и Контрагентом 2 то он должен создать новый (ну и также если имя2 контр1). Если вообще убрать контрагента то он создает только 1 а далее пишет что создан (но так вроде и должно (или нет) ). Помогите пожалуйста, если что-то не правильно написал то плез не бомбите я новичок.

```1c
    СозданныеДокументы = Новый Соответствие;
    Для СтрокаОтсчета = 2 по КоличествоСтрок Цикл
    Договор = "ЙЦУКЕНГ10";
    //Договор = Excel.Cells(СтрокаОтсчета, 21).Text;
    Контрагентй = Справочники.Контрагенты.НайтиПоНаименованию(Excel.Cells(СтрокаОтсчета, 23).Text, Истина);
    НовыйОбъект = СозданныеДокументы[Контрагентй];

    Если НовыйОбъект = Неопределено Тогда
    НовыйОбъект = Справочники.ДоговорыКонтрагентов.СоздатьЭлемент();
    НовыйОбъект.Владелец = Контрагентй;

    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
    | ДоговорыКонтрагентов.Владелец КАК Владелец
    |ИЗ
    | Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
    |ГДЕ
    | ДоговорыКонтрагентов.Владелец.Наименование = &Наименование" ;

    Запрос.УстановитьПараметр("Наименование", Контрагентй);

    ВФ = Запрос.Выполнить().Выбрать();
    Пока ВФ.Следующий() Цикл
    Владелец = ВФ.Владелец;

    КонецЦикла;

    НовыйОбъект.Организация = Объект.Организация;
    НовыйОбъект.Наименование = Договор;
    НовыйОбъект.ВидДоговора = Перечисления.ВидыДоговоровКонтрагентов.СПокупателем;
    НовыйОбъект.ВалютаВзаиморасчетов = Справочники.Валюты.НайтиПоНаименованию("руб.", Истина);
    СозданныеДокументы.Вставить(Контрагентй, НовыйОбъект);
    КонецЕсли;
    КонецЦикла;

    Для каждого КлючИЗначение из СозданныеДокументы Цикл
    //Для каждого СтрокаМассив из МассивКолонок Цикл
    Если Справочники.ДоговорыКонтрагентов.НайтиПоНаименованию("ЙЦУКЕНГ10",Истина).Наименование <> Договор
    Тогда

    НовыйОбъект = КлючИЗначение.Значение;
    НовыйОбъект.Записать();
    Сообщить("Создан и заполнен договор " + Строка(НовыйОбъект));
    ИначеЕсли Владелец <> Контрагентй Тогда

    НовыйОбъект = КлючИЗначение.Значение;
    НовыйОбъект.Записать();
    Сообщить("Создан и заполнен договор " + Строка(НовыйОбъект));

    Иначе
    Сообщить("йцу");
    КонецЕсли;
    КонецЦикла;
```
---
Вот это работает вроде

```1c
    СозданныеДокументы = Новый Соответствие;
    Для СтрокаОтсчета = 2 по КоличествоСтрок Цикл
    Договор = Excel.Cells(СтрокаОтсчета, 21).Text;
    Контрагент = Справочники.Контрагенты.НайтиПоНаименованию(Excel.Cells(СтрокаОтсчета, 23).Text, Истина);
    НовыйОбъект = СозданныеДокументы[Контрагент];
    Если НовыйОбъект = Неопределено Тогда
    НовыйОбъект = Справочники.ДоговорыКонтрагентов.СоздатьЭлемент();
    НовыйОбъект.Владелец = Контрагент;
    НовыйОбъект.Наименование = Договор;
    НовыйОбъект.ВидДоговора = Перечисления.ВидыДоговоровКонтрагентов.СПокупателем;
    НовыйОбъект.ВалютаВзаиморасчетов = Справочники.Валюты.НайтиПоНаименованию("руб.", Истина);
    НовыйОбъект.Организация = Объект.Организация;
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
    | ДоговорыКонтрагентов.Владелец КАК Владелец
    |ИЗ
    | Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
    |ГДЕ
    | ДоговорыКонтрагентов.Владелец.Наименование = &Наименование
    | И ДоговорыКонтрагентов.Наименование = &НаименованиеДоговора" ;

    Запрос.УстановитьПараметр("Наименование", Контрагент.Наименование);
    Запрос.УстановитьПараметр("НаименованиеДоговора", Договор);

    ВФ = Запрос.Выполнить().Выбрать();
    Если НЕ ВФ.Следующий() тогда
    Попытка
    НовДоговр = Справочники.ДоговорыКонтрагентов.СоздатьЭлемент();
    НовДоговр.Владелец = Контрагент;
    НовДоговр.Наименование = Договор;
    НовыйОбъект.Записать();
    //Сообщить("Создан и заполнен договор " + НовДоговр.Наименование);
    Исключение
    Сообщить("НЕ Создан договор тк такие уже есть" );
    КонецПопытки;
    КонецЕсли;
    КонецЕсли;
    КонецЦикла;
```
---
не будем про запрос в цикле и т.п...

Договор искать можно, с указанием владельца:

```1c
    ДоговорСсылка = Справочники.ДоговорыКонтрагентов.НайтиПоНаименованию(ДоговорНаименование,Истина,,КонтрагентСсылка);
    Если ДоговорСсылка.Пустая() Тогда
    //Создаем договор
    КонецЕсли;
```

Насколько понимаю, есть лист Excel в котором в колонках 21 и 23 содержатся наименования договора и контрагента, соответственно. Тогда можно отобрать лишь уникальные наборы договор-контрагент и уже их обрабатывать.

Например, создать таблицу значений:

```1c
    ОписаниеТиповС = Новый ОписаниеТипов("Строка",,,Новый КвалификаторыСтроки(100));
    ТЗ = Новый ТаблицаЗначений;
    ТЗ.Колонки.Добавить("Договор", ОписаниеТиповС);
    ТЗ.Колонки.Добавить("Контрагент", ОписаниеТиповС);
```

Заполнить ее данными и убрать повторяющиеся строки:

```1c
    ТЗ.Свернуть("Договор,Контрагент",);
```

А уже дальше обрабатывать.
---
Вот это работает вроде

```1c
    СозданныеДокументы = Новый Соответствие;
    Для СтрокаОтсчета = 2 по КоличествоСтрок Цикл
    Договор = Excel.Cells(СтрокаОтсчета, 21).Text;
    Контрагент = Справочники.Контрагенты.НайтиПоНаименованию(Excel.Cells(СтрокаОтсчета, 23).Text, Истина);
    НовыйОбъект = СозданныеДокументы[Контрагент];
    Если НовыйОбъект = Неопределено Тогда
    НовыйОбъект = Справочники.ДоговорыКонтрагентов.СоздатьЭлемент();
    НовыйОбъект.Владелец = Контрагент;
    НовыйОбъект.Наименование = Договор;
    НовыйОбъект.ВидДоговора = Перечисления.ВидыДоговоровКонтрагентов.СПокупателем;
    НовыйОбъект.ВалютаВзаиморасчетов = Справочники.Валюты.НайтиПоНаименованию("руб.", Истина);
    НовыйОбъект.Организация = Объект.Организация;
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
    | ДоговорыКонтрагентов.Владелец КАК Владелец
    |ИЗ
    | Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
    |ГДЕ
    | ДоговорыКонтрагентов.Владелец.Наименование = &Наименование
    | И ДоговорыКонтрагентов.Наименование = &НаименованиеДоговора" ;

    Запрос.УстановитьПараметр("Наименование", Контрагент.Наименование);
    Запрос.УстановитьПараметр("НаименованиеДоговора", Договор);

    ВФ = Запрос.Выполнить().Выбрать();
    Если НЕ ВФ.Следующий() тогда
    Попытка
    НовДоговр = Справочники.ДоговорыКонтрагентов.СоздатьЭлемент();
    НовДоговр.Владелец = Контрагент;
    НовДоговр.Наименование = Договор;
    НовыйОбъект.Записать();
    //Сообщить("Создан и заполнен договор " + НовДоговр.Наименование);
    Исключение
    Сообщить("НЕ Создан договор тк такие уже есть" );
    КонецПопытки;
    КонецЕсли;
    КонецЕсли;
    КонецЦикла;
```
---
2 выборки будет, Контрагенты и Договора, потом соединяете, если у контрагента нет договора, то создаете
---
Запрос в цикле - ужос ужос ужос
---
Сообщение было скрыто модератором.
---
Надо вне цикла сделать запрос по контрагентам и договорам, вывести их в ТаблицуЗначений и в ней потом искать по контрагенту и договору, а при каждом добавлении нового договора, ее дополнять.
---
Напиши код. На словах легко сказать, я тоже так могу.
---
А хамить нехорошо. Человек вам свое решение предложил. Все остальное можно найти в гугле. Готовый код искать долго.
---
my opinion

```1c
    СозданныеДокументы = Новый Соответствие;
    Для СтрокаОтсчета = 2 по КоличествоСтрок Цикл
    Договор = "ЙЦУКЕНГ10";
    //Договор = Excel.Cells(СтрокаОтсчета, 21).Text;
    Контрагентй = Справочники.Контрагенты.НайтиПоНаименованию(Excel.Cells(СтрокаОтсчета, 23).Text, Истина);
    НовыйОбъект = СозданныеДокументы[Контрагентй];

    Если НовыйОбъект = Неопределено Тогда
    НовыйОбъект = Справочники.ДоговорыКонтрагентов.СоздатьЭлемент();
    НовыйОбъект.Владелец = Контрагентй;

    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
    | ДоговорыКонтрагентов.Владелец КАК Владелец
    |ИЗ
    | Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
    |ГДЕ
    | ДоговорыКонтрагентов.Владелец.Наименование = &Наименование
    | И ДоговорыКонтрагентов.Наименование = &НаименованиеДоговора" ;

    Запрос.УстановитьПараметр("Наименование", Контрагентй.Наименование);
    Запрос.УстановитьПараметр("НаименованиеДоговора", Договор);

    ВФ = Запрос.Выполнить().Выбрать();
    Если НЕ ВФ.Следующий() тогда
    //Владелец = ВФ.Владелец;

    Попытка
    НовДоговр = Справочники.ДоговорыКонтрагентов.СоздатьЭлемент();
    НовДоговр.Владелец = Контрагентй;
    НовДоговр.Наименование = Договор;
    //НовыйОбъект = КлючИЗначение.Значение;

    // НовыйОбъект.Организация = Объект.Организация;
    // НовыйОбъект.Наименование = Договор;
    // НовыйОбъект.ВидДоговора = Перечисления.ВидыДоговоровКонтрагентов.СПокупателем;
    // НовыйОбъект.ВалютаВзаиморасчетов = Справочники.Валюты.НайтиПоНаименованию("руб.", Истина);
    //ДРУГИЕ РЕКВИЗИТЫ
    НовыйОбъект.Записать();

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

    Исключение
    // Сообщить("йцу");
    Сообщить("НЕ Создан и заполнен договор " + НовДоговр.Наименование, СтатусСообщения.Важное);

    КонецПопытки;;

    КонецЕсли;;

    // СозданныеДокументы.Вставить(Контрагентй, НовыйОбъект);
    КонецЕсли;
    КонецЦикла;
```
---
Это в какой конфигурации такие названия?
НовДоговр.Владелец = Контрагентй;
---
```1c
    Справочники.Контрагенты.НайтиПоНаименованию
```

Возвращает ссылку, Контрагентй - Переменная. Какая разница какое имя у переменной.
---
Какой-то хаос в коде.

Первое что бросается в глаза, помимо не оптимального кода это то что

Контрагентй = Справочники.Контрагенты.НайтиПоНаименованию(Excel.Cells(СтрокаОтсчета, 23).Text, Истина); - здесь получаем ссылку

а затем в запросе под этой ссылкой пытаемся сравнить наименование (тест)
|ГДЕ
| ДоговорыКонтрагентов.Владелец.Наименование = &Наименование" ;

        Запрос.УстановитьПараметр("Наименование", Контрагентй);

PS^ и да, учитесь называть переменные правильно, глаза режит такой код.
---
А разве нельзя из Excel выгрузить в ТЗ Создать свою ТЗ из имеющихся договоров приблизительно одинаковой структуры. А потом запросом сравнить две ТЗ оставить только строки которые есть в файле. Обойти результат запроса и просто создать документы? Зачем вообще циклы если есть запрос. Я у себя так делал с похожими задачами.