Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
07 фев 2026, 09:31

Выбрать верные данные из 2 запросов

Автор Sasha1C, 19 дек 2025, 10:04

0 Пользователей и 1 гость просматривают эту тему.

Sasha1C

Добрый день, мой вопрос максимально глупый, но как есть. Есть 2 запроса из-который мы получаем номенклатуру из разных источников. Вопрос: Если номенклатура найдена во втором запросе, то я должен взять ее и полдставить к ней цену из первого запроса, а если НЕ ЗначениеЗаполнено(номенклатура) во втором запросе, тогда взять номенклатуру из первого запроса. Подскажите пожалуйста направление куда копать для решения вопроса, а то запутался. Запрос = Новый Запрос;

Запрос.УстановитьПараметр("Калькуляции", Калькуляции);

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

Шапка = Запрос.Выполнить().Выгрузить();

Для каждого Строка Из Шапка Цикл

Запрос.УстановитьПараметр("Дата",          КонецДня(Строка.Дата));
Запрос.УстановитьПараметр("ПлановаяКалькуляция", Строка.Ссылка);

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

ТоварыДляЗагрузки =Запрос.Выполнить().Выгрузить();

СтрокаТабличнойЧасти = ЭтотОбъект.Товары.Добавить();

Для Каждого СтрокаТоваров Из ТоварыДляЗагрузки Цикл

Если ЗначениеЗаполнено(СтрокаТоваров.Номенклатура) Тогда
СтрокаТабличнойЧасти.Номенклатура = СтрокаТоваров.Номенклатура;
СтрокаТабличнойЧасти.СтавкаНДС = СтрокаТоваров.НоменклатураСтавкаНДС;
СтрокаТабличнойЧасти.Цена = Строка.ЦенаОтпускная; 
Иначе
СтрокаТабличнойЧасти.Номенклатура = Строка.Номенклатура;
СтрокаТабличнойЧасти.СтавкаНДС = СтрокаТоваров.НоменклатураСтавкаНДС;
СтрокаТабличнойЧасти.Цена = Строка.ЦенаОтпускная;
КонецЕсли;

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

Sasha1C

Варварский метод, но работает)

Запрос = Новый Запрос;

Запрос.УстановитьПараметр("Калькуляции", Калькуляции);

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

Шапка = Запрос.Выполнить().Выгрузить();

Для каждого Строка Из Шапка Цикл

Запрос.УстановитьПараметр("Дата",          КонецДня(Строка.Дата));
Запрос.УстановитьПараметр("ПлановаяКалькуляция", Строка.Ссылка);

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

ТоварыДляЗагрузки =Запрос.Выполнить().Выгрузить();

СтрокаТабличнойЧасти = ЭтотОбъект.Товары.Добавить();
СтрокаТабличнойЧасти.Номенклатура = Строка.Номенклатура;
СтрокаТабличнойЧасти.СтавкаНДС = Строка.НоменклатураСтавкаНДС;
СтрокаТабличнойЧасти.Цена = Строка.ЦенаОтпускная;

Для Каждого СтрокаТоваров Из ТоварыДляЗагрузки Цикл

СтрокаТабличнойЧасти.Номенклатура = СтрокаТоваров.Номенклатура;
СтрокаТабличнойЧасти.СтавкаНДС = СтрокаТоваров.НоменклатураСтавкаНДС;
СтрокаТабличнойЧасти.Цена = Строка.ЦенаОтпускная; 

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

LexaK

Запрос в цикле....
За такое , нас сразу выгоняли с экзамена!

попробуйте написать один запрос и без всяких циклов!
ведь именно это, от вас ждет препод.
если помогло нажмите: Спасибо!

Sasha1C

LexaK, Спасибо, понимаю что запрос в цикле, но там идет перебор, и благо всего несколько обращений к серверу, по этой причине и закрыл глаза на это.

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск