1С Комплексная автоматизация 2.0

Поставлена задача в ЗаказПоставщику созданному на основании ЗаказаКлиента загрузить Цены продажи, для того чтобы видеть предварительную маржу. Создал процедуру запускаемую по кнопке, но результат запроса выходит пустой, хотя в конструкторе запросов все сделано правильно.

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

    СтрокиТовары.ЦенаПродажи=ВыборкаЦен[0].Цена;

    КонецЦикла;

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

    &НаКлиенте
    Процедура Маржа(Команда)
    МаржаНаСервере();
    КонецПроцедуры
```

Как правильно запросить цены продажи из документа основания?
---
Вот так попробуй, но запрос в цикле не лучшее решение

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

    СтрокиТовары.ЦенаПродажи=ВыборкаЦен[0].Цена;

    КонецЦикла;
```
---
НаименованиеНоменклатура у тебя ссылка и это условие не работает
И ЗаказКлиентаТовары.Номенклатура.Наименование = &Наименование
---
Вот так попробуй, но запрос в цикле не лучшее решение

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

    СтрокиТовары.ЦенаПродажи=ВыборкаЦен[0].Цена;

    КонецЦикла;
```
---
Полагаю, кодом

```1c
    СтрокиТовары.ЦенаПродажи=ВыборкаЦен[0].Цена;
```

вы предполагаете обратиться к первой строке таблицы значений? Тогда и нужно использовать соответствующий метод для получения данных из результата запроса.

```1c
    ВыборкаЦен=ЗапросЦены.Выполнить().Выгрузить(); // вместо Выбрать(...) используйте Выгрузить(...)
```

Но это так, цветочки. Ягодки в том, что вы генерите несколько запросов согласно кол-ву строк в ТЧ. И для сопоставления используете ненадежные данные - например, ищете по номеру документа. А если номер - периодический и будет куча документов с таким номером?...
---
Спасибо, помогло.
Я понимаю что запрос в цикле не лучшее решение, но других вариантов я пока не знаю ((.
Как бы Вы реализовали данную задачу?
---
Конфигурацию такую я незнаю, но
Открой процедуру ОбработкаЗаполнения документа ЗаказПоставщику, там наверняка уже есть цикл подобный

```1c
    Для Каждого ТекСтрока Из ДанныеЗаполнения.Товары Цикл
    НоваяСтрока = Товары.Добавить();
    НоваяСтрока.Количество = ТекСтрока .Количество;
    НоваяСтрока.Номенклатура = ТекСтрока .Номенклатура;
    .........
    КонецЦикла;
```

Добавь туда
```1c
    НоваяСтрока.Цена = ТекСтрока .Цена;
```
---
Или тебе это надо делать в уже созданных документах?
---
ВыборкаЦен.Следующий() пропущено

```1c
    ВыборкаЦен.Следующий();
    ......= ВыборкаЦен.Цена;
```
---
Запрос в цикле делать НЕЛЬЗЯ!!! Это нагружает систему! А если 1000 строк в документе?Нужно попробовать альтернативное решение одним запросом. Выбираете из заказа покупателя номенклатуру и цену, помещаете в виртуальную таблицу, далее из текущего документа номенклатуру, устанавливаете связь по ней, необходимые условия. В итоговую таблицу номенклатура из заказа поставщика, цены из заказа покупателя. Далее выборку подгружаете в необходимое место. Думаю как-то так, и все должно получиться
---
А что мешает, выгрузить номенклатуру в список и в условии сделать
```1c
    ЗаказКлиентаТовары.Номенклатура в (спНоменклатура)"
```
 зачем в цикл все загонять