Имя: Пароль:
1C
1С v8
Помогите с запросом, как его упростить? Вроде просто, но не пойму как..
0 MP-40
 
18.09.12
14:03
Привет! Подскажите с запросом. Требуется получить продажи в выбранном типе цен (тип цен «Контрольная»). Когда для номенклатуры не задана контрольная цена, то необходимо получать нулевую цену, иначе контрольную на момент продажи товара.

Написал такой запрос:


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

СГРУППИРОВАТЬ ПО
   Запрос.Менеджер,
   Запрос.Период,
   Запрос.Контрагент,
   Запрос.ТорговаяТочка,
   Запрос.ТипЦены,
   Запрос.Номенклатура,
   Запрос.Регистратор,
   Запрос.ПериодРегистратор,
   Запрос.НоменклатурнаяГруппа,
   Запрос.Организация,
   Запрос.СтоимостьОборотПродажа,
   Запрос.СтоимостьБезСкидокОборотПродажа,
   Запрос.КоличествоОборотПродажа

Выводит данные вроде правильно, но как-то его наверняка можно упростить, вместо последней группировки отбирать сразу во внутреннем запросе или подзапросе. Непойму как это корректно сделать(((
1 slad
 
18.09.12
14:10
Используй временные таблицы
2 MP-40
 
18.09.12
14:11
(1) пакетные запросы имеете в виду?
3 slad
 
18.09.12
14:12
да, ПОМЕСТИТЬ
4 MP-40
 
18.09.12
14:23
Ок, ну а как в пакетном виде должен выглядеть тогда нужный запрос?
5 MP-40
 
18.09.12
15:13
Вот, к такому запросу пришел:

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

СГРУППИРОВАТЬ ПО
   ПродажиОбороты.Регистратор,
   ПродажиОбороты.Регистратор.Дата,
   ПродажиОбороты.Номенклатура,
   ПродажиОбороты.Регистратор.ТорговаяТочка,
   ПродажиОбороты.Регистратор.ОсновнойМенеджерПокупателяДляВыписки,
   ПродажиОбороты.Регистратор.Контрагент,
   ПродажиОбороты.Регистратор.Организация,
   ПродажиОбороты.Номенклатура.НоменклатурнаяГруппа,
   ПродажиОбороты.КоличествоОборот,
   ПродажиОбороты.СтоимостьОборот,
   ПродажиОбороты.СтоимостьБезСкидокОборот,
   НАЧАЛОПЕРИОДА(ПродажиОбороты.Период, ДЕНЬ),
   ЕСТЬNULL(ВложенныйЗапрос.Цена, 0),
   ЕСТЬNULL(ВложенныйЗапрос.ТипЦен, ЗНАЧЕНИЕ(Справочник.ТипыЦенНоменклатуры.Контрольная))
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший