Здравствуйте уважаемые программисты. Это код для того, чтобы в БП 3.0 создавать договоры по имени клиента, если у него отсутствует договор. В БП информация ежедневно загружается из УТ. Поэтому и есть необходимость в такой обработке. Код запускается в БП 3.0

Суть проблемы: Если код создания объекта в цикле, то обработка вообще не работает, а если вытащить её из цикла, то пишет, что невозможно записать, так как не указан контрагент или указан неверно.
Прошу помочь.

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

    РезультатЗапроса = Запрос.Выполнить();

    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

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

    КонецЦикла;
    КонецПроцедуры

    &НаКлиенте
    Процедура ОтборДоговора(Команда)
    ОтборДоговораНаСервере();
    КонецПроцедуры
```

P.S. ВидДоговора - это перечисление
---
Начнем с того, что Вы повелись на псевдоним Владельца. Правой кнопкой выбираем Стандартные реквизиты. Там Владелец обозначен Контрагент. И код Владельцу присваивать совершенно не уместно. В счет фактуре договор это

```1c
    ПредопределенноеЗначение("Справочник.ДоговорыКонтрагентов.ПустаяСсылка")
```

В общем запрос для создания договора должен выглядеть так

```1c
    Запрос.Текст =
    "ВЫБРАТЬ
    | СчетНаОплатуПокупателю.Контрагент КАК Владелец
    | СчетНаОплатуПокупателю.Контрагент.Наименование КАК Наименование,
    | СчетНаОплатуПокупателю.Организация КАК Организация
    |ИЗ
    | Документ.СчетНаОплатуПокупателю КАК СчетНаОплатуПокупателю
    |ГДЕ
    | НЕ СчетНаОплатуПокупателю.ДоговорКонтрагента = ЗНАЧЕНИЕ(Справочник.ДоговорыКонтрагентов.ПустаяСсылка)";
```

Заметьте. Я получаю свойства нового договора прямо в запросе, чтобы потом написать

```1c
    ЗаполнитьЗначенияСвойств(НовыйЭлемент , ВыборкаДетальныеЗаписи);
    НовыйЭлемент .Записать();
```
---
Начнем с того, что Вы повелись на псевдоним Владельца. Правой кнопкой выбираем Стандартные реквизиты. Там Владелец обозначен Контрагент. И код Владельцу присваивать совершенно не уместно. В счет фактуре договор это

```1c
    ПредопределенноеЗначение("Справочник.ДоговорыКонтрагентов.ПустаяСсылка")
```

В общем запрос для создания договора должен выглядеть так

```1c
    Запрос.Текст =
    "ВЫБРАТЬ
    | СчетНаОплатуПокупателю.Контрагент КАК Владелец
    | СчетНаОплатуПокупателю.Контрагент.Наименование КАК Наименование,
    | СчетНаОплатуПокупателю.Организация КАК Организация
    |ИЗ
    | Документ.СчетНаОплатуПокупателю КАК СчетНаОплатуПокупателю
    |ГДЕ
    | НЕ СчетНаОплатуПокупателю.ДоговорКонтрагента = ЗНАЧЕНИЕ(Справочник.ДоговорыКонтрагентов.ПустаяСсылка)";
```

Заметьте. Я получаю свойства нового договора прямо в запросе, чтобы потом написать

```1c
    ЗаполнитьЗначенияСвойств(НовыйЭлемент , ВыборкаДетальныеЗаписи);
    НовыйЭлемент .Записать();
```
---
ра прямо в запросе, чтобы потом на

Благодарю за помощь! Огромное спасибо.

Получился такой код:

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

    РезультатЗапроса = Запрос.Выполнить();

    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

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

    &НаКлиенте
    Процедура ОтборДоговора(Команда)
    ОтборДоговораНаСервере();
    КонецПроцедуры
```

 но выдаёт такую ошибку:

{ВнешняяОбработка.ВнешняяОбработка1.Форма.Форма.Форма(15)}: Ошибка при вызове метода контекста (Выполнить)
 РезультатЗапроса = Запрос.Выполнить();
по причине:
{(5, 10)}: Неверные параметры "Перечисление.ВидыДоговоров.СПокупателем"
Значение(<<?>>Перечисление.ВидыДоговоров.СПокупателем) как ВидДоговора
---
Это Вы поторопились. Надо думать, а не исполнять сразу.1С конфиг много, мегет быть все по разному Смотрите в свойства.как на рисунке.
Так и должно обзываться в запросе. Единственное ПречислениеСсылка Ссылка лишнее слово. Будет ругаться
Я просто Вам показывал Ваши ошибки и путь решения. Остальное Вы сами:)
---
НовыйЭлемент.ВидДоговора = "С Покупателем";
Ну а если всеже кодом то

```1c
    НовыйЭлемент.ВидДоговора = Перечисления.ВидыДоговоров.СПокупателем
```

В БП Вид договора это ПеречислениеСсылка.ВидыДоговоровКонтрагентов. У Вас не знаю
---
НовыйЭлемент.ВидДоговора = Перечисления.ВидыДоговоров.СПокупателем
У меня виды договор с контрагентами. поменяю., но он поймёт, что нужно выбрать с покупателем?
---
Зырим в свойства договора в пофигураторе. В запросе назначаем псевдонимы те же(после КАК)
И штатный метод ЗаполнитьЗначенияСвойств схавает и за ушами трещать будет:)
Главное не обманывать типа:

```1c
    Владелец = Контрагент.код
```

То молча будет пусто.
А подставишь свойство с нужным типом правильно. Все будет ОК
---
ЗНАЧЕНИЕ(Перечисление.ВидыДоговоровКонтрагентов.СПокупателем как ВидДоговора
Поймет. Кудаж Уан эзина денеться:)
---
И да. Забыл

```1c
    Значение(Перечисление.ВидыДоговоров.СПокупателем) как ВидДоговора
```

 тоже в запрос
---
И чтоб было все чики пуки

```1c
    НовыйЭлемент .УстановитьНовыйКод();
```
---
За здравие желаю, то есть плюсы спасибо. О результатах должить немедля.
Ну чтобы не наделать фатальных глупостей подскажу финт ушами

```1c
    НачатьТранзакцию();
    блабла код
    ОтменитьТранзакцию();
```

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

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

    РезультатЗапроса = Запрос.Выполнить();

    Выборка = РезультатЗапроса.Выбрать();

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

    Иначе
    Объект.ДоговорКонтрагента = Договор;
    КонецЕсли;
    Объект.Записать();

    КонецПроцедуры

    &НаКлиенте
    Процедура ОтборДоговора(Команда)
    ОтборДоговораНаСервере();
    КонецПроцедуры
```
---
Иначе
Объект.ДоговорКонтрагента = Договор;
КонецЕсли:
Объект.Записать();
Поменял код на такой, заработало всё. Но сейчас выдаёт ошибку, что "поле объекта не обнаружено (ДоговорКонтрагента)

```1c
    &НаСервере
    Процедура ОтборДоговораНаСервере()

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

    &НаКлиенте
    Процедура ОтборДоговора(Команда)
    ОтборДоговораНаСервере();
    КонецПроцедуры
```
---
Всё, получилось, поменял сам)