Найти значения одной табличной части в другой

1. DENSKR 15 16.03.21 10:10 Сейчас в теме
Нужна помощь! Имеется самописный справочник автоматических скидок. При разработке логики столкнулся с проблемой обработки условий. Логика добавления подарочной номенклатуры при выполнении условий.
Например есть одна ТЧ1 в ней 2 позиции номенклатуры и ее количество - это условия.
Есть другая ТЧ2 это ТЧ заказа где при добавлении номенклатуры в которую - те самые условия должны проверяться.
Как найти все указанные строки из первой ТЧ1(справочника) в ТЧ2(заказа), чтобы проверить строки на соответствие и добавить подарок к заказу.
Как это описать программно: "Если строки 1 ТЧ находятся во 2 ТЧ то все ок"
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
18. vlad636 4 16.03.21 11:33 Сейчас в теме +3 $m
(17) Так попробуйте, не помню уже
ФлВсеОк = Истина;
Для Каждого Стр Из ТЗ2 Цикл
   НайденныеСтроки = ТЗ1.НайтиСтроки(Новый Структура("Номенклатура", Стр.Номенклатура));
   Если НайденныеСтроки.Количество() = 0 Тогда
      ФлВсеОк = Ложь;
      Прервать;
   Иначе
      ВремКоличество = 0;
      Для Индекс = 0 По НайденныеСтроки.Количество() - 1 Цикл
         ВремКоличество =       ВремКоличество + НайденныеСтроки[Индекс]["Количество"];      
      КонецЦикла;
      Если Стр.Количество > ВремКоличество Тогда
         ФлВсеОк = Ложь;
         Прервать;
      КонецЕсли;
   КонецЕсли;
КонецЦикла;
Показать
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. FatPanzer 16.03.21 10:14 Сейчас в теме
ТЧ1.НайтиСтроки(Новый Структура("ИмяКолонки1,ИмяКолонки2", СтрокаТЧ2.ЗначениеКолонки1, СтрокаТЧ2.ЗначениеКолонки2));
Ul_developer; Albert_2008; v3n7; +3 Ответить
3. DENSKR 15 16.03.21 10:16 Сейчас в теме
(2) Наверное не совсем то что нужно.
Например в ТЧ1 находятся 2 строки:
Молоко 3 шт
Печенье 1 шт

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

Как написать что если строки 1 ТЧ находятся во 2 ТЧ то все ок?
4. FatPanzer 16.03.21 10:21 Сейчас в теме
(3) Вы уже определитесь - вам надо их найти? Или написать, что все ок? Тогда Сообщить("Все ок");
6. DENSKR 15 16.03.21 10:25 Сейчас в теме
(4) Если они нашлись то все ок)))
Попытаюсь подробнее описать: Нужно выбрать находящиеся в ТЧ1 позиции номенклатуры с необходимым количеством или большим чем это количество в ТЧ 2 если они там тесть и сказать что все ок.
5. biimmap 1919 16.03.21 10:25 Сейчас в теме
Такие задачи решаются запросом. поместите обе таблицы в запрос. Через связи это можно сделать
7. DENSKR 15 16.03.21 10:25 Сейчас в теме
8. biimmap 1919 16.03.21 10:28 Сейчас в теме
Запрос = Новый Запрос;
	
	Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
	
	Запрос.Текст = 
	"ВЫБРАТЬ 
	|	* 
	|ПОМЕСТИТЬ ВТ_НазваниеВременнойТаблицы
	|ИЗ 
	|	&ТаблицаПараметр КАК ПсевдонимТаблицы";
	
	Запрос.УстановитьПараметр("ТаблицаПараметр ", ТЧ.Выгрузить());
	
	Запрос.Выполнить();
Показать
9. DENSKR 15 16.03.21 10:30 Сейчас в теме
(8) Ну так это для каждой таблицы сделать? И что дальше?
11. biimmap 1919 16.03.21 10:34 Сейчас в теме
(9) да так для каждой. потом напишите левое соединение, наложите нужное Вам условие и будет счастье. Без обид за вас писать не стану
12. glek 119 16.03.21 10:44 Сейчас в теме
(9)
Выбрать
ТЗ1.Номенклатура
ТЗ1.Количество
Поместить втТЗ1
Из &ТЗ1 Как ТЗ1
;
Выбрать 
ТЗ2.Номенклатура
ТЗ2.Количество
Поместить ВТТЗ2
Их &ТЗ2 Как ТЗ2
;
Выбрать
1 Как Поле1
Из втТЗ1 как ВТЗТЗ1
Где (втТЗ1.Номенклатура, втТЗ1.Количество) в (Выбрать ВТТЗ2.Номенклатура, ВТТЗ2.Количество)

это если необходимо на точное равенство
Если не точное, а "не меньше", то делаем внутренне соединение тип
ВТТЗ1. Номенклатура = втТз2.Номенклатура
И ВТТЗ1.Количество >= втТз2.Количество
Показать
24. DENSKR 15 16.03.21 15:48 Сейчас в теме
(12) И как определить что запрос отработал корректно?
25. DENSKR 15 16.03.21 15:49 Сейчас в теме
(12) Это же по позиционно он будет смотреть?
10. vlad636 4 16.03.21 10:31 Сейчас в теме
Примерно так:
ТЗ1 - справочник
ТЗ2 - Заказ
ФлВсеОк = Истина;
Для Каждого Стр Из ТЗ2 Цикл
   НайденнаяСтрока = ТЗ1.Найти(Стр.Номенклатура);
   Если НайденнаяСтрока = Неопределено Тогда
      ФлВсеОк = Ложь;
      Прервать;
   ИначеЕсли Стр.Количество > НайденнаяСтрока.Количество Тогда
      ФлВсеОк = Ложь;
      Прервать;
   КонецЕсли;
КонецЦикла; 
Показать
13. DENSKR 15 16.03.21 10:51 Сейчас в теме
(10) Вот это вроде подходит, но если в ТЗ2 будет более строк чем в ТЗ справочника то ФлВсеОк уже будет равен Ложь...
14. vlad636 4 16.03.21 11:07 Сейчас в теме
(13) ну делайте не ТЗ1.Найти(Стр.Номенклатура), а ТЗ1.НайтиСтроки(Новый Структура("Номенклатура", Стр.Номенклатура)) и уже в цикле по найденным строкам делайте проверку на количество
15. DENSKR 15 16.03.21 11:24 Сейчас в теме
(14)Не могу сообразить как это применить. То есть цикл в цикле? Можно попросить вас расписать...
16. vlad636 4 16.03.21 11:25 Сейчас в теме
ФлВсеОк = Истина;
Для Каждого Стр Из ТЗ2 Цикл
   НайденныеСтроки = ТЗ1.НайтиСтроки(Новый Структура("Номенклатура", Стр.Номенклатура));
   Если НайденныеСтроки.Количество() = 0 Тогда
      ФлВсеОк = Ложь;
      Прервать;
   Иначе
      ВремКоличество = 0;
      Для Индекс = 0 По НайденныеСтроки.Количество() - 1 Цикл
         ВремКоличество =       ВремКоличество + НайденныеСтроки[Индекс, "Количество"];       
      КонецЦикла;
      Если Стр.Количество > ВремКоличество Тогда
         ФлВсеОк = Ложь;
         Прервать;
      КонецЕсли;
   КонецЕсли;
КонецЦикла; 
Показать
17. DENSKR 15 16.03.21 11:29 Сейчас в теме
(16) Тут ругается [Индекс<<?>>, "Количество"] - Ожидается символ ']'
18. vlad636 4 16.03.21 11:33 Сейчас в теме +3 $m
(17) Так попробуйте, не помню уже
ФлВсеОк = Истина;
Для Каждого Стр Из ТЗ2 Цикл
   НайденныеСтроки = ТЗ1.НайтиСтроки(Новый Структура("Номенклатура", Стр.Номенклатура));
   Если НайденныеСтроки.Количество() = 0 Тогда
      ФлВсеОк = Ложь;
      Прервать;
   Иначе
      ВремКоличество = 0;
      Для Индекс = 0 По НайденныеСтроки.Количество() - 1 Цикл
         ВремКоличество =       ВремКоличество + НайденныеСтроки[Индекс]["Количество"];      
      КонецЦикла;
      Если Стр.Количество > ВремКоличество Тогда
         ФлВсеОк = Ложь;
         Прервать;
      КонецЕсли;
   КонецЕсли;
КонецЦикла;
Показать
19. DENSKR 15 16.03.21 11:35 Сейчас в теме
(18) Мне это подходит, спасибо огромное!
20. biimmap 1919 16.03.21 11:58 Сейчас в теме
(19) Вам же написали как это сделать грамотно!? Зачем принимаете кривой вариант реализации?
21. DENSKR 15 16.03.21 13:25 Сейчас в теме
22. FatPanzer 16.03.21 13:27 Сейчас в теме
например, не учитывается тот факт, что в каждой из таблиц могут быть по несколько строк одной и той же номенклатуры
23. biimmap 1919 16.03.21 13:35 Сейчас в теме
(21) Такие задачи решаются только запросами.
26. SlavaKron 16.03.21 15:56 Сейчас в теме
Мне кажется, у вас постановка задачи изначально некорректная – вы сами говорите, что есть справочник автоматических скидок, следовательно, необходимо найти все скидки, которые сработали для данного заказа, так?

Тогда в оперативной памяти у нас только одна табличная часть – Товары заказа и нам надо найти ссылки скидок, удовлетворяющих условию – скидочный набор полностью присутствует в заказе в количестве, не меньшим, чем указано в условиях скидки.
27. DENSKR 15 16.03.21 16:17 Сейчас в теме
(26) Не сработали а должны сработать.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот