Добрый день. Есть документ реализация товаров, поступление номенклатуры осуществляется из Китая и России, разными документами (ПоступлениеТоваровРФ, ПоступлениеТоваровКНР). Нужно получить данные по реализациям, и соединить с поступлениями по условию (Номенклатура реализации, последнее поступление РФ либо последнее поступление КНР , в зависимости от того, какое поступление было позже (пример пришла ручка из РФ и пришла такая же ручка из КНР, в первом случае дата 01.06, во втором 03.06, должен попадать именно второй документ)). Подскажите, пожалуйста, возможно ли реализовать это одним запросом?
Можно попробовать так:
1. Получаем список номенклатуры из реализации во временную таблицу
2. Соединяем эту временную таблицу с номенлатурой из ПоступлениеТоваровРФ и ПоступлениеТоваровКНР, делаем одним запросом с объединением, из документов выбираем дату и цену, также пишем во временную таблицу
3. Из временной таблицы п.2 получаем максимальную дату по номенклатуре
4. Соединяем таблицу из п.3 с таблицей из п.2 по номенклатуре и дате и получаем результат из временной таблицы 2
Единственно, засада может быть, если у документов ПоступлениеТоваровРФ и ПоступлениеТоваровКНР для одной номенклатуры одинаковые даты, ну тут уж вы сами дальше решайте, что будете с этим делать
(13) если правильно понял условие задачи, то как-то так
ВЫБРАТЬ
РеализацияТоваровУслугТовары.Номенклатура КАК Номекнлатура,
РеализацияТоваровУслугТовары.Цена КАК ЦенаРеализации
ПОМЕСТИТЬ ВТ_Реализации
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
ГДЕ
РеализацияТоваровУслугТовары.Ссылка.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
;
/////
ВЫБРАТЬ
ПоступлениеТоваровРФТовары.Ссылка КАК СсылкаПоступлениеТоваров,
ПоступлениеТоваровРФТовары.Ссылка.Дата КАК ДатаПоступлениеТоваров,
ПоступлениеТоваровРФТовары.Номенклатура КАК Номенклатура
ПОМЕСТИТЬ ВТ_ПоступлениеТоваров
ИЗ
Документ.ПоступлениеТоваровРФ.Товары КАК ПоступлениеТоваровРФТовары
ГДЕ
ПоступлениеТоваровРФТовары.Ссылка.Дата МЕЖДУ ДобавитьКДате(&ДатаНачала, Месяц, -6) И &ДатаОкончания
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ПоступлениеТоваровКНРТовары.Ссылка,
ПоступлениеТоваровКНРТовары.Ссылка.Дата,
ПоступлениеТоваровКНРТовары.Номенклатура
ИЗ
Документ.ПоступлениеТоваровКНР.Товары КАК ПоступлениеТоваровКНРТовары
ГДЕ
ПоступлениеТоваровКНРТовары.Ссылка.Дата МЕЖДУ ДобавитьКДате(&ДатаНачала, Месяц, -6) И &ДатаОкончания
;
/////
ВЫБРАТЬ
МАКСИМУМ(ВТ_ПоступлениеТоваров.ДатаПоступлениеТоваров) КАК ДатаПоступлениеТоваров,
ВТ_ПоступлениеТоваров.СсылкаПоступлениеТоваров КАК СсылкаПоступлениеТоваров,
ВТ_ПоступлениеТоваров.Номенклатура КАК Номенклатура
ПОМЕСТИТЬ ВТ_ПоступленияСМаксДатой
ИЗ
ВТ_ПоступлениеТоваров
;
/////
ВЫБРАТЬ
ВТ_ПоступленияСМаксДатой.ДатаПоступлениеТоваров) КАК ДатаПоступление,
ВТ_ПоступленияСМаксДатой.СсылкаПоступлениеТоваров КАК СсылкаПоступление,
ВТ_Реализации.Номенклатура КАК Номенклатура,
ВТ_Реализации.ЦенаРеализации КАК ЦенаРеализации
ИЗ
ВТ_Реализации
ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ПоступленияСМаксДатой КАК ВТ_ПоступленияСМаксДатой
ПО ВТ_ПоступленияСМаксДатой.Номенклатура = ВТ_Реализации.Номенклатура
Показать
ЗЫ код писал в блокноте... за работу не гарантирую, но принцип должен быть понятен
это пробовал, сейчас попробовал максимум дата, но эти оба варианта просто кладут базу (зависает на моменте выполнения запроса, даже если небольшой период выбирать, выбрал три дня, и зависла база).
ВЫБРАТЬ
Максимум(ПоступлениеТоваровРФТовары.Ссылка.Дата) КАК ДатаПоступленияРФ,
ПоступлениеТоваровРФТовары.Ссылка КАК ПоступлениеРФ,
ПоступлениеТоваровРФТовары.Номенклатура КАК Номенклатура,
ПоступлениеТоваровРФТовары.Цена КАК ЦенаПокупки,
ПоступлениеТоваровРФТовары.Ссылка.Контрагент КАК Контрагент,
РеализацияТоваровУслугТовары.Ссылка КАК Реализация,
РеализацияТоваровУслугТовары.Сумма КАК Сумма,
РеализацияТоваровУслугТовары.Цена КАК ЦенаРеализации,
(ПоступлениеТоваровРФТовары.Цена - РеализацияТоваровУслугТовары.Цена) КАК РазницаЦен
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваровРФ.Товары КАК ПоступлениеТоваровРФТовары
ПО РеализацияТоваровУслугТовары.Номенклатура = ПоступлениеТоваровРФТовары.Номенклатура
ГДЕ
РеализацияТоваровУслугТовары.Ссылка.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
И ПоступлениеТоваровРФТовары.Ссылка.Дата МЕЖДУ ДобавитьКДате(&ДатаНачала, Месяц, -6) И &ДатаОкончания
СГРУППИРОВАТЬ ПО
ПоступлениеТоваровРФТовары.Ссылка,
ПоступлениеТоваровРФТовары.Номенклатура,
ПоступлениеТоваровРФТовары.Цена,
ПоступлениеТоваровРФТовары.Ссылка.Контрагент,
РеализацияТоваровУслугТовары.Ссылка,
РеализацияТоваровУслугТовары.Сумма,
РеализацияТоваровУслугТовары.Цена
(13) если правильно понял условие задачи, то как-то так
ВЫБРАТЬ
РеализацияТоваровУслугТовары.Номенклатура КАК Номекнлатура,
РеализацияТоваровУслугТовары.Цена КАК ЦенаРеализации
ПОМЕСТИТЬ ВТ_Реализации
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
ГДЕ
РеализацияТоваровУслугТовары.Ссылка.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
;
/////
ВЫБРАТЬ
ПоступлениеТоваровРФТовары.Ссылка КАК СсылкаПоступлениеТоваров,
ПоступлениеТоваровРФТовары.Ссылка.Дата КАК ДатаПоступлениеТоваров,
ПоступлениеТоваровРФТовары.Номенклатура КАК Номенклатура
ПОМЕСТИТЬ ВТ_ПоступлениеТоваров
ИЗ
Документ.ПоступлениеТоваровРФ.Товары КАК ПоступлениеТоваровРФТовары
ГДЕ
ПоступлениеТоваровРФТовары.Ссылка.Дата МЕЖДУ ДобавитьКДате(&ДатаНачала, Месяц, -6) И &ДатаОкончания
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ПоступлениеТоваровКНРТовары.Ссылка,
ПоступлениеТоваровКНРТовары.Ссылка.Дата,
ПоступлениеТоваровКНРТовары.Номенклатура
ИЗ
Документ.ПоступлениеТоваровКНР.Товары КАК ПоступлениеТоваровКНРТовары
ГДЕ
ПоступлениеТоваровКНРТовары.Ссылка.Дата МЕЖДУ ДобавитьКДате(&ДатаНачала, Месяц, -6) И &ДатаОкончания
;
/////
ВЫБРАТЬ
МАКСИМУМ(ВТ_ПоступлениеТоваров.ДатаПоступлениеТоваров) КАК ДатаПоступлениеТоваров,
ВТ_ПоступлениеТоваров.СсылкаПоступлениеТоваров КАК СсылкаПоступлениеТоваров,
ВТ_ПоступлениеТоваров.Номенклатура КАК Номенклатура
ПОМЕСТИТЬ ВТ_ПоступленияСМаксДатой
ИЗ
ВТ_ПоступлениеТоваров
;
/////
ВЫБРАТЬ
ВТ_ПоступленияСМаксДатой.ДатаПоступлениеТоваров) КАК ДатаПоступление,
ВТ_ПоступленияСМаксДатой.СсылкаПоступлениеТоваров КАК СсылкаПоступление,
ВТ_Реализации.Номенклатура КАК Номенклатура,
ВТ_Реализации.ЦенаРеализации КАК ЦенаРеализации
ИЗ
ВТ_Реализации
ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ПоступленияСМаксДатой КАК ВТ_ПоступленияСМаксДатой
ПО ВТ_ПоступленияСМаксДатой.Номенклатура = ВТ_Реализации.Номенклатура
Показать
ЗЫ код писал в блокноте... за работу не гарантирую, но принцип должен быть понятен
(1)А в регистры у вас что-то пишется по документам ПоступлениеТоваровРФ и ПоступлениеТоваровКНР? Может есть какой-то общий для этих документов, оттуда проще будет получить информацию.
Можно попробовать так:
1. Получаем список номенклатуры из реализации во временную таблицу
2. Соединяем эту временную таблицу с номенлатурой из ПоступлениеТоваровРФ и ПоступлениеТоваровКНР, делаем одним запросом с объединением, из документов выбираем дату и цену, также пишем во временную таблицу
3. Из временной таблицы п.2 получаем максимальную дату по номенклатуре
4. Соединяем таблицу из п.3 с таблицей из п.2 по номенклатуре и дате и получаем результат из временной таблицы 2
Единственно, засада может быть, если у документов ПоступлениеТоваровРФ и ПоступлениеТоваровКНР для одной номенклатуры одинаковые даты, ну тут уж вы сами дальше решайте, что будете с этим делать
Тогда проще получаем список накладных - из них список номенклатуры - по этом списку строим таблицу с датами последнего поступления - к этой таблице добавляем цены из накладных и соединяем все это