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

не могу правильно поставить запрос. Гугл не помог ((.
Накладная поле выбора типа ДокументСсылка.ПриходнаяНакладная

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

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

Вариант 2

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

    ОБЪЕДИНИТЬ ВСЕ

    ВЫБРАТЬ
    РеализацияТоваровТовары.Номенклатура,
    2
    ИЗ
    Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары) КАК ВложенныйЗапрос

    СГРУППИРОВАТЬ ПО
    ВложенныйЗапрос.Номенклатура

    ИМЕЮЩИЕ
    СУММА(ВложенныйЗапрос.Количество) = 2
```

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

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ РАЗЛИЧНЫЕ
    Приходная.Ссылка,
    Приходная.Номенклатура
    ПОМЕСТИТЬ ВТ_Приходная
    ИЗ
    Документ.Приходная.Товары КАК Приходная
    ГДЕ
    Приходная.Номенклатура В
    (ВЫБРАТЬ
    ВТ_Накладная.Номенклатура
    ИЗ
    ВТ_Накладная КАК ВТ_Накладная)
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    ВТ_Накладная.Номенклатура,
    ВТ_Приходная.Ссылка
    ИЗ
    ВТ_Накладная КАК ВТ_Накладная
    ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Приходная КАК ВТ_Приходная
    ПО ВТ_Накладная.Номенклатура = ВТ_Приходная.Номенклатура
```
---
```1c
    ВЫБРАТЬ
    ТаблицаНоменклатуры.Номенклатура.Ссылка КАК НоменклатураДубли
    ИЗ
    ТребуемыйДокумент.ТаблицаНоменклатуры КАК ТаблицаНоменклатуры
    ГДЕ
    ТаблицаНоменклатуры.Ссілка = &МойДокумент
    СГРУППИРОВАТЬ ПО
    ТаблицаНоменклатуры.Номенклатура.Ссылка
    ИМЕЮЩИЕ
    КОЛИЧЕСТВО(ТаблицаНоменклатуры.Ссылка) > 1
```
---
Спасибо друзья за отклик, но все не то.
все намного проще.
задача заполнить недостающие позиции в накладной.
То есть таблица Товары во внешней обработки получена из чтения Искель накладной.
в ней проводится сопоставление с нашими карточками товара. если накладная большая то времени уходит очень много, плюс если ШК новые и нет в накладной от поставщика, то времени уходит на сбор еще больше. А простой товара на складе, это потеря потенциальной прибыли. Вот и встала ЗАДАЧА пускать в оборот накладные не до конца обработаны. плодить куски накладных тоже не вариант. Плюнуть и создать дубли если есть тоже не вариант.
Вот и надо всего лишь добавить в накладную уже сопоставленую позицию и пропустить уже имеющуюся.

Код все процедуры:

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

    нов=Док.Товары.Добавить();
    нов.Номенклатура=Строка.Номенклатура;
    нов.ЕдиницаИзмерения=нов.Номенклатура.БазоваяЕдиницаИзмерения;
    нов.Количество=Строка.Количество;
    нов.Коэффициент=нов.ЕдиницаИзмерения.Коэффициент;
    нов.СтавкаНДС=нов.Номенклатура.СтавкаНДС;
    нов.Сумма=Строка.Сумма;
    нов.Цена=Строка.Цена;
    КонецЕсли;
    КонецЕсли;
    КонецЦикла;
    док.Записать(РежимЗаписиДокумента.Запись);
    форма=док.ПолучитьФорму("ФормаДокумента");
    форма.Открыть();

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

Мне надо именно правильно сформулировать текст запроса
---
Судя по тексту Вы выбираете из всех Приходных накладных, так и должно? или все таки очепятка?
И все же к каждой строке делать запрос. Это не комильфо. Правильней загнать таблицу из Ёкселя в ВТ и выбрать в запросе
Я через менеджер ВТ

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

Загнали Товары из Ёкселя во временную таблицу
Теперь выполняем запрос добавляемых товаров

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

И если хочется выполняем запрос для сообщения

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

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

```1c
    Процедура ДобавитьВНакладную(Элемент)
    Если не ЗначениеЗаполнено(Накладная) тогда
    Предупреждение("Не выбран документ для загрузки");
    Возврат
    КонецЕсли;
    Док=Накладная.ПолучитьОбъект();
    для Каждого Строка из Товары Цикл
    Если ЗначениеЗаполнено(Строка.Номенклатура) Тогда
    нов=Док.Товары.Добавить();
    нов.Номенклатура=Строка.Номенклатура;
    нов.ЕдиницаИзмерения=нов.Номенклатура.БазоваяЕдиницаИзмерения;
    нов.Количество=Строка.Количество;
    нов.Коэффициент=нов.ЕдиницаИзмерения.Коэффициент;
    нов.СтавкаНДС=нов.Номенклатура.СтавкаНДС;
    нов.Сумма=Строка.Сумма;
    нов.Цена=Строка.Цена;
    КонецЕсли;
    КонецЦикла;
    док.Записать(РежимЗаписиДокумента.Запись);
    форма=док.ПолучитьФорму("ФормаДокумента");
    форма.Открыть();

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

В итоге все работает, но добавляет все строки в выбраню Накладную. и получается что в Икселе 100 позиций а в ПНакоадной уже есть 30 позицией, то получаем 130 позиций. Где 30 позиций продублированы.
Если не получится я уже наверное сделаю что перед добавлением просто стирать все позиции в ПНакладной. Итог получится тот же.
Меня именно интересует как пройтись запросом на совпадение по Номенклатуры.
---
В текущем алгоритме с вашими скилами быстрее обойтись без запроса.

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