Нужна помощь! Имеется самописный справочник автоматических скидок. При разработке логики столкнулся с проблемой обработки условий. Логика добавления подарочной номенклатуры при выполнении условий.
Например есть одна ТЧ1 в ней 2 позиции номенклатуры и ее количество - это условия.
Есть другая ТЧ2 это ТЧ заказа где при добавлении номенклатуры в которую - те самые условия должны проверяться.
Как найти все указанные строки из первой ТЧ1(справочника) в ТЧ2(заказа), чтобы проверить строки на соответствие и добавить подарок к заказу.
Как это описать программно: "Если строки 1 ТЧ находятся во 2 ТЧ то все ок"
---
Так попробуйте, не помню уже

```1c
    ФлВсеОк = Истина;
    Для Каждого Стр Из ТЗ2 Цикл
    НайденныеСтроки = ТЗ1.НайтиСтроки(Новый Структура("Номенклатура", Стр.Номенклатура));
    Если НайденныеСтроки.Количество() = 0 Тогда
    ФлВсеОк = Ложь;
    Прервать;
    Иначе
    ВремКоличество = 0;
    Для Индекс = 0 По НайденныеСтроки.Количество() - 1 Цикл
    ВремКоличество = ВремКоличество + НайденныеСтроки[Индекс]["Количество"];
    КонецЦикла;
    Если Стр.Количество > ВремКоличество Тогда
    ФлВсеОк = Ложь;
    Прервать;
    КонецЕсли;
    КонецЕсли;
    КонецЦикла;
```
---
```1c
    ТЧ1.НайтиСтроки(Новый Структура("ИмяКолонки1,ИмяКолонки2", СтрокаТЧ2.ЗначениеКолонки1, СтрокаТЧ2.ЗначениеКолонки2));
```
---
Наверное не совсем то что нужно.
Например в ТЧ1 находятся 2 строки:
Молоко 3 шт
Печенье 1 шт

В ТЧ 2 находятся
Молоко 3 шт
Печенье 1 шт
Конфеты 2 шт

Как написать что если строки 1 ТЧ находятся во 2 ТЧ то все ок?
---
Вы уже определитесь - вам надо их найти? Или написать, что все ок? Тогда Сообщить("Все ок");
---
Если они нашлись то все ок)))
Попытаюсь подробнее описать: Нужно выбрать находящиеся в ТЧ1 позиции номенклатуры с необходимым количеством или большим чем это количество в ТЧ 2 если они там тесть и сказать что все ок.
---
Такие задачи решаются запросом. поместите обе таблицы в запрос. Через связи это можно сделать
---
например?
---
```1c
    Запрос = Новый Запрос;

    Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;

    Запрос.Текст =
    "ВЫБРАТЬ
    | *
    |ПОМЕСТИТЬ ВТ_НазваниеВременнойТаблицы
    |ИЗ
    | &ТаблицаПараметр КАК ПсевдонимТаблицы";

    Запрос.УстановитьПараметр("ТаблицаПараметр ", ТЧ.Выгрузить());

    Запрос.Выполнить();
```
---
Ну так это для каждой таблицы сделать? И что дальше?
---
да так для каждой. потом напишите левое соединение, наложите нужное Вам условие и будет счастье. Без обид за вас писать не стану
---
```1c
    Выбрать
    ТЗ1.Номенклатура
    ТЗ1.Количество
    Поместить втТЗ1
    Из &ТЗ1 Как ТЗ1
    ;
    Выбрать
    ТЗ2.Номенклатура
    ТЗ2.Количество
    Поместить ВТТЗ2
    Их &ТЗ2 Как ТЗ2
    ;
    Выбрать
    1 Как Поле1
    Из втТЗ1 как ВТЗТЗ1
    Где (втТЗ1.Номенклатура, втТЗ1.Количество) в (Выбрать ВТТЗ2.Номенклатура, ВТТЗ2.Количество)

    это если необходимо на точное равенство
    Если не точное, а "не меньше", то делаем внутренне соединение тип
    ВТТЗ1. Номенклатура = втТз2.Номенклатура
    И ВТТЗ1.Количество >= втТз2.Количество
```
---
И как определить что запрос отработал корректно?
---
Это же по позиционно он будет смотреть?
---
Примерно так:
ТЗ1 - справочник
ТЗ2 - Заказ

```1c
    ФлВсеОк = Истина;
    Для Каждого Стр Из ТЗ2 Цикл
    НайденнаяСтрока = ТЗ1.Найти(Стр.Номенклатура);
    Если НайденнаяСтрока = Неопределено Тогда
    ФлВсеОк = Ложь;
    Прервать;
    ИначеЕсли Стр.Количество > НайденнаяСтрока.Количество Тогда
    ФлВсеОк = Ложь;
    Прервать;
    КонецЕсли;
    КонецЦикла;
```
---
Вот это вроде подходит, но если в ТЗ2 будет более строк чем в ТЗ справочника то ФлВсеОк уже будет равен Ложь...
---
ну делайте не ТЗ1.Найти(Стр.Номенклатура), а ТЗ1.НайтиСтроки(Новый Структура("Номенклатура", Стр.Номенклатура)) и уже в цикле по найденным строкам делайте проверку на количество
---
Не могу сообразить как это применить. То есть цикл в цикле? Можно попросить вас расписать...
---
```1c
    ФлВсеОк = Истина;
    Для Каждого Стр Из ТЗ2 Цикл
    НайденныеСтроки = ТЗ1.НайтиСтроки(Новый Структура("Номенклатура", Стр.Номенклатура));
    Если НайденныеСтроки.Количество() = 0 Тогда
    ФлВсеОк = Ложь;
    Прервать;
    Иначе
    ВремКоличество = 0;
    Для Индекс = 0 По НайденныеСтроки.Количество() - 1 Цикл
    ВремКоличество = ВремКоличество + НайденныеСтроки[Индекс, "Количество"];
    КонецЦикла;
    Если Стр.Количество > ВремКоличество Тогда
    ФлВсеОк = Ложь;
    Прервать;
    КонецЕсли;
    КонецЕсли;
    КонецЦикла;
```
---
Тут ругается [Индекс<<?>>, "Количество"] - Ожидается символ ']'
---
Так попробуйте, не помню уже

```1c
    ФлВсеОк = Истина;
    Для Каждого Стр Из ТЗ2 Цикл
    НайденныеСтроки = ТЗ1.НайтиСтроки(Новый Структура("Номенклатура", Стр.Номенклатура));
    Если НайденныеСтроки.Количество() = 0 Тогда
    ФлВсеОк = Ложь;
    Прервать;
    Иначе
    ВремКоличество = 0;
    Для Индекс = 0 По НайденныеСтроки.Количество() - 1 Цикл
    ВремКоличество = ВремКоличество + НайденныеСтроки[Индекс]["Количество"];
    КонецЦикла;
    Если Стр.Количество > ВремКоличество Тогда
    ФлВсеОк = Ложь;
    Прервать;
    КонецЕсли;
    КонецЕсли;
    КонецЦикла;
```
---
Мне это подходит, спасибо огромное!
---
Вам же написали как это сделать грамотно!? Зачем принимаете кривой вариант реализации?
---
Чем он кривой?
---
например, не учитывается тот факт, что в каждой из таблиц могут быть по несколько строк одной и той же номенклатуры
---
Такие задачи решаются только запросами.
---
Мне кажется, у вас постановка задачи изначально некорректная – вы сами говорите, что есть справочник автоматических скидок, следовательно, необходимо найти все скидки, которые сработали для данного заказа, так?

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