Есть такой кусок в обработке проведения документа "Заказ покупателя":

```1c
    Для Каждого Стр ИЗ Товары Цикл
    Результат = ОбщийМодуль.Проверка(Дата,номенклатура,контрагент)
    Если Результат Тогда
    Отказ = Истина
    Конецесли
    конеццикла
```

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

```1c
    //в модуле документа
    Процедура ОбработкаПроведения(Отказ, Режим)
    ...
    ПроверкаЦен(Отказ);
    ...
    КонецПроцедуры;

    Процедура ПроверкаЦен(Отказ)

    Если Отказ Тогда Возврат; КонецЕсли;

    //Запрос - шаблон
    лкЗапрос = Новый Запрос;
    лкЗапрос.Текст = "
    |Выбрать
    | Док.НомерСтроки,
    | Представление(Док.Номенклатура) как Номенклатура,
    | Док.Цена,
    | РегЦен.Цена кк ЦенаРег
    |из
    | Документ.ЗаказПокупателя.Товары Док
    |левое соединение
    | РегиствеСведении.Рег.СрезПоследних(&Дата,ТипЦен = &ТипЦен) КАК РегЦен //пока сократил И Номенклатура в (&СписокНоменклатура) КАК РегЦен
    | по Док.Номенклатура = РегЦен.Номенклатура
    |где
    | Док.Ссылка = &Ссылка
    |и Док.Цена <> ЕстьNull(РегЦен.Цена,0)//или какое другое условие
    |Упорядочить по
    | Док.НомерСтроки
    |";
    лкЗапрос.УстановитьПараметр("Дата", Дата);
    лкЗапрос.УстановитьПараметр("ТипЦен", ТипЦен);
    лкЗапрос.УстановитьПараметр("Ссылка", Ссылка);

    лкРезультат = лкЗапрос.Выполнить();
    Если Не лкРезультат.Пустой() Тогда
    //есть расхождения цен
    Отказ = Истина;
    //очень полезно вывести эту информацию при испольждовании в групповых операциях
    Сообщить("Есть ошибки по ценам в документе: " + Ссылка);
    лкВыборка = лкРезультат.Выбрать();
    Пока лкВыборка.Следующий() Цикл
    Сообщить("Строка: " + лкВыборка.НомерСтроки
    + " товар: " + лкВыборка.Номенклатура
    + " цена док: " + лкВыборка.Цена
    + " цена рег: " + лкВыборка.ЦенаРег
    );

    КонецЦикла;
    КонецЕсли;

    КонецПроцедуры;
```
---
а что в ОбщийМодуль.Проверка( ?
---
Запрос,куда передаются дата,ном и контрагент.
В итоге оттуда берётся сумма и происходит проверка,которая возвращает истину или ложь
Думал перебирать циклом на Запрос.УстановитьПараметр("Номенклатура",Номенклатура) , но по-моему это ещё хуже :)
---
Какой то левый код.." не типовой" :)
---
Вот вот !) Я же его и добавил :)
---
Вот вот !) Я же его и добавил :)
ни чего необычного, типичный гов-но код
вот это
Запрос.установитьПараметр("СписокНоменклатура",Товары.Выгрузить("Номенклатура"));
тоже,
так как в момент обработки проведения, документ уже записан в базу и достаточно передать его ссылку в запрос,
а не выгружать все товары из ТЧ и передавать из в виде параметра

потом предвижу ваш код дальше, когда вы захотите вывести сообщение по той строчке, в которой номенклатура не соответствует цене
Строка: ННН, товар: Стол - не соответствие цен. (ну или чего там)
---
напишите, как сделать правильно
---
попробуйте такую процедуру, не идеал конечно,

```1c
    //в модуле документа
    Процедура ОбработкаПроведения(Отказ, Режим)
    ...
    ПроверкаЦен(Отказ);
    ...
    КонецПроцедуры;

    Процедура ПроверкаЦен(Отказ)

    Если Отказ Тогда Возврат; КонецЕсли;

    //Запрос - шаблон
    лкЗапрос = Новый Запрос;
    лкЗапрос.Текст = "
    |Выбрать
    | Док.НомерСтроки,
    | Представление(Док.Номенклатура) как Номенклатура,
    | Док.Цена,
    | РегЦен.Цена кк ЦенаРег
    |из
    | Документ.ЗаказПокупателя.Товары Док
    |левое соединение
    | РегиствеСведении.Рег.СрезПоследних(&Дата,ТипЦен = &ТипЦен) КАК РегЦен //пока сократил И Номенклатура в (&СписокНоменклатура) КАК РегЦен
    | по Док.Номенклатура = РегЦен.Номенклатура
    |где
    | Док.Ссылка = &Ссылка
    |и Док.Цена <> ЕстьNull(РегЦен.Цена,0)//или какое другое условие
    |Упорядочить по
    | Док.НомерСтроки
    |";
    лкЗапрос.УстановитьПараметр("Дата", Дата);
    лкЗапрос.УстановитьПараметр("ТипЦен", ТипЦен);
    лкЗапрос.УстановитьПараметр("Ссылка", Ссылка);

    лкРезультат = лкЗапрос.Выполнить();
    Если Не лкРезультат.Пустой() Тогда
    //есть расхождения цен
    Отказ = Истина;
    //очень полезно вывести эту информацию при испольждовании в групповых операциях
    Сообщить("Есть ошибки по ценам в документе: " + Ссылка);
    лкВыборка = лкРезультат.Выбрать();
    Пока лкВыборка.Следующий() Цикл
    Сообщить("Строка: " + лкВыборка.НомерСтроки
    + " товар: " + лкВыборка.Номенклатура
    + " цена док: " + лкВыборка.Цена
    + " цена рег: " + лкВыборка.ЦенаРег
    );

    КонецЦикла;
    КонецЕсли;

    КонецПроцедуры;
```
---
Единственное данные не корректны.
Мне нужно Если Цена из ТЧ Товары < Цена из Регистра Тогда Не проводим!
В вашем случае не так.
---
э-э-э, а у вас что пальчик отсох, что бы подправить условие запроса?

вместо "<>" сделать "<"

там даже коммент есть: //или какое другое условие
---
по мне так достаточно только ссылку предавать
---
И как перебирать в запросе несколько позиции номенклатура после ?
---
пусть sql перебирает
---
запрос в цикле
да еще и серверный вызов в цикле
почему в запрос не обработать сразу все данные?
---
А как передать несколько позиции номенклатура поочередно в запрос ?
Лучше чем
```1c
    Для Каждого СТр ИЗ Товары Цикл
    Запрос.УстановпитьПараметр("Номенклатура",Стр):
    конеццикла
```

не придумал.
---
текст запроса?
---
Примерно такой
```1c
    ВЫБРАТЬ
    Рег.Цен
    Рег.ТипЦен
    Рег.номенклатура
    ИЗ РегиствеСведении.Рег.СрезПоследних(&ДатаЦен,ТипЦен = &ТипЦен И Номенклатура = &Номенклатура)
    КАК РегСрезПоследних

    Запрос.установитьПараметр("ДатаЦен",Дата);
    Запрос.установитьПараметр("ТипЦен ",ТипЦен );
    Запрос.установитьПараметр("Номенклатура ",Номенклатура );
```
---
```1c
    ВЫБРАТЬ
    Рег.Цен
    Рег.ТипЦен
    Рег.номенклатура
    ИЗ РегиствеСведении.Рег.СрезПоследних(&ДатаЦен,ТипЦен = &ТипЦен И Номенклатура в (&СписокНоменклатура)
    КАК РегСрезПоследних

    Запрос.установитьПараметр("ДатаЦен",Дата);
    Запрос.установитьПараметр("ТипЦен ",ТипЦен );
    Запрос.установитьПараметр("СписокНоменклатура",Товары.Выгрузить("Номенклатура"));
```
---
И выходит после выгрузить в выборку и перебирать Для Каждого... каждую номенклатуру и уже там проверять ?
---
Смотря что надо проверять
---
Цену номенклатуры из регистра с ценой номенклатуры из объекта.
---
Соединить таблицу данных регистра с таблицей товары заказа по номенклатуре
выбрать те где цены не совпадают
---
Вы откуда знаете :)
---
Что знаю? ;)
---
Проблема возникла. Товары не Выгрузить,мол это Массив.
Так как это тип ДокументТабличнаяЧасть.ЗаказПокупателя.Товары
как быть ?
---
А Как сравнивать каждую позицию цены ?

Ну тоесть мне надо после запроса сравнить

Если Цена Номенклатуры из ТЧ Товары < Выборка Цена Тогда не ПРОВОДИМ.
Просто в обходе выборки Сделать Цена = Товары.ВЫгрузитьКОлонку("Цена")
И
```1c
    Пока ВЫборка.Следующий() Цикл
    Цена = Товары.ВЫгрузитьКОлонку("Цена")
    ]для каждого Стр Из Цена Цикл
    Если Цена < Выборка. Цена Тогда
    "НЕПРОВОДИМ"
    конецЦикла

    конеццикла
```

Как сделать корректнее ?!
---
с днём дурака ?