8.х Нужна помощь с запросом.

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем Dimka77, 13 апр 2011.

  1. TopicStarter Overlay
    Dimka77
    Offline

    Dimka77 Опытный в 1С

    Регистрация:
    6 июн 2009
    Сообщения:
    279
    Симпатии:
    0
    Баллы:
    26
    УТ 10.3
    Нужно сформировать запрос, который вывел бы информацию следующим образом:
    _____________________________________________________________
    |КодНоменклатуры | ТипЦеныНомен1 | ТипЦеныНомен2 | ТипЦеныНомен3|
    -------------------------------------------------------------------------------------------------

    Т.е. получается, этакий прайс-лист организации, где:
    ТипЦеныНомен1 - розничная цена
    ТипЦеныНомен2 - оптовая цена
    ТипЦеныНомен3 - крупнооптовая цена.

    Что-то сообразить не могу как сделать, есть идеи? :angry:
  2. r-d-v2008
    Offline

    r-d-v2008 Опытный в 1С

    Регистрация:
    16 сен 2010
    Сообщения:
    272
    Симпатии:
    0
    Баллы:
    26
    Запросы вообще делали?
  3. TopicStarter Overlay
    Dimka77
    Offline

    Dimka77 Опытный в 1С

    Регистрация:
    6 июн 2009
    Сообщения:
    279
    Симпатии:
    0
    Баллы:
    26
    Конечно делал, но не получается, вот и решил обратиться за помощью.
    Это пример того, как я не умею формировать запросы:
    Код:
    ВЫБРАТЬ
    ЦеныНоменклатурыСрезПоследних.Номенклатура.Код КАК Код,
    ЦеныНоменклатурыСрезПоследних.Цена
    ИЗ
    РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних
    ГДЕ
    ЦеныНоменклатурыСрезПоследних.ТипЦен = &РозничнаяЦена
    
    
    Этот прототип должен вывести Код и в соседнем поле Розничную цену, но как сюда ещё прикрутить другие поля с ценами? Может вложенным запросом? Но тогда запрос будет выполняться целую вечность :(
    Может есть проще реализация?
  4. Dmitriy_76
    Offline

    Dmitriy_76 Опытный в 1С Команда форума

    Регистрация:
    26 мар 2011
    Сообщения:
    2.175
    Симпатии:
    13
    Баллы:
    29
    ну как то так...
    Код:
    "ВЫБРАТЬ
    |	ЦеныНоменклатурыСрезПоследних.Номенклатура,
    |	ЦеныНоменклатурыСрезПоследних.ТипЦен,
    |	ЦеныНоменклатурыСрезПоследних.Цена,
    |	ЦеныНоменклатурыСрезПоследних1.Цена КАК Цена1
    |ИЗ
    |	РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата) КАК ЦеныНоменклатурыСрезПоследних
    |		ПОЛНОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата) КАК ЦеныНоменклатурыСрезПоследних1
    |		ПО ЦеныНоменклатурыСрезПоследних.Номенклатура = ЦеныНоменклатурыСрезПоследних1.Номенклатура
    |ГДЕ
    |	ЦеныНоменклатурыСрезПоследних.ТипЦен = &ТипЦен1
    |	И ЦеныНоменклатурыСрезПоследних1.ТипЦен = &ТипЦен2"
    
  5. gosn1ck
    Offline

    gosn1ck Опытный в 1С

    Регистрация:
    13 авг 2009
    Сообщения:
    1.329
    Симпатии:
    1
    Баллы:
    26
    берите основную таблицу номенклатуры и делайте левое соединение к ней таблицу ценыноменклатурысрезпоследних столько раз, сколько хотите видеть типов цен у себя. и не забывайте про характеристику, если это УТ
  6. TopicStarter Overlay
    Dimka77
    Offline

    Dimka77 Опытный в 1С

    Регистрация:
    6 июн 2009
    Сообщения:
    279
    Симпатии:
    0
    Баллы:
    26
    О... а так оказывается можно, сенкс :angry:
  7. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Dmitriy_76, зачем там полное соединение? Достаточно будет левого.

    gosn1ck
    +1
  8. has
    Offline

    has Опытный в 1С

    Регистрация:
    18 июн 2009
    Сообщения:
    708
    Симпатии:
    0
    Баллы:
    26
    А параметр ТипЦен в виртуальной таблице не прокатит чтоли? Я про то, что нафиг условие ГДЕ
  9. TopicStarter Overlay
    Dimka77
    Offline

    Dimka77 Опытный в 1С

    Регистрация:
    6 июн 2009
    Сообщения:
    279
    Симпатии:
    0
    Баллы:
    26
    Ам... Дабы дискуссия шла в нужном направлении, уточните, пожалуйста, какой вариант запроса будет быстрее выполнен.
  10. alexburn
    Offline

    alexburn Модераторы Команда форума Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    14.771
    Симпатии:
    509
    Баллы:
    204
    Быстрее будет через отбор в виртуальной таблице.
  11. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    То что сказал gosn1ck + то что сказал has.
  12. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    З.Ы. Только левое соединение делайте к справочнику номенклатура.
  13. TopicStarter Overlay
    Dimka77
    Offline

    Dimka77 Опытный в 1С

    Регистрация:
    6 июн 2009
    Сообщения:
    279
    Симпатии:
    0
    Баллы:
    26
    Что-то не получается:
    Код:
    ВЫБРАТЬ
    ЦеныНоменклатурыСрезПоследних.Цена КАК РозничнаяЦена,
    ЦеныНоменклатурыСрезПоследних1.Цена КАК МелкоОптоваяЦена,
    ЦеныНоменклатурыСрезПоследних2.Цена КАК ОптоваяЦена,
    ЦеныНоменклатурыСрезПоследних3.Цена КАК КрупноОптоваяЦена,
    Номенклатура.Код КАК Код1
    ИЗ
    РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних,
    Справочник.Номенклатура КАК Номенклатура
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних1
    ПО Номенклатура.Код = ЦеныНоменклатурыСрезПоследних1.Номенклатура
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних2
    ПО Номенклатура.Код = ЦеныНоменклатурыСрезПоследних2.Номенклатура
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних3
    ПО Номенклатура.Код = ЦеныНоменклатурыСрезПоследних3.Номенклатура
    ГДЕ
    ЦеныНоменклатурыСрезПоследних.ТипЦен = &РозничнаяЦена
    И ЦеныНоменклатурыСрезПоследних1.ТипЦен = &МелкоОптоваяЦена
    И ЦеныНоменклатурыСрезПоследних2.ТипЦен = &ОптоваяЦена
    И ЦеныНоменклатурыСрезПоследних3.ТипЦен = &КрупноОптоваяЦена
    
    1с-ка пишет:
    Ну а сейчас-то, что не так? :angry:
  14. yzek
    Offline

    yzek Опытный в 1С

    Регистрация:
    13 окт 2010
    Сообщения:
    713
    Симпатии:
    0
    Баллы:
    26
    И правильно пишет. Вы пытаетесь сопоставить код элементу справочника.
    Раз вы в выборку берете Код, тогда попробуйте так:
    Номенклатура.Код=ЦеныНоменклатурыСрезПоследних1.Номенклатура.Код.

    ИМХО. Я бы в выборку взял Номенклатура, реквизит элемента получить не проблема.
  15. TopicStarter Overlay
    Dimka77
    Offline

    Dimka77 Опытный в 1С

    Регистрация:
    6 июн 2009
    Сообщения:
    279
    Симпатии:
    0
    Баллы:
    26
    Не помогает, вот ещё разок:
    Код:
    ВЫБРАТЬ
    ЦеныНоменклатурыСрезПоследних.Номенклатура.Код КАК Код,
    ЦеныНоменклатурыСрезПоследних.Цена КАК РозничнаяЦена,
    ЦеныНоменклатурыСрезПоследних1.Цена КАК МелкоОптоваяЦена,
    ЦеныНоменклатурыСрезПоследних2.Цена КАК ОптоваяЦена,
    ЦеныНоменклатурыСрезПоследних3.Цена КАК КрупноОптоваяЦена,
    Номенклатура.Код КАК Код1
    ИЗ
    Справочник.Номенклатура КАК Номенклатура
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних
    ПО Номенклатура.Код = ЦеныНоменклатурыСрезПоследних.Номенклатура.Код
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних3
    ПО Номенклатура.Код = ЦеныНоменклатурыСрезПоследних3.Номенклатура
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних2
    ПО Номенклатура.Код = ЦеныНоменклатурыСрезПоследних2.Номенклатура
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних1
    ПО Номенклатура.Код = ЦеныНоменклатурыСрезПоследних1.Номенклатура
    ГДЕ
    ЦеныНоменклатурыСрезПоследних.ТипЦен.Код = &РозничнаяЦена
    И ЦеныНоменклатурыСрезПоследних1.ТипЦен.Код = &МелкоОптоваяЦена
    И ЦеныНоменклатурыСрезПоследних2.ТипЦен.Код = &ОптоваяЦена
    И ЦеныНоменклатурыСрезПоследних3.ТипЦен.Код = &КрупноОптоваяЦена
    
    И вот такая ошибка:
    ???
  16. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Код:
    "ВЫБРАТЬ
    спрНоменклатура.Ссылка КАК Ссылка,
    спрНоменклатура.Код
    ПОМЕСТИТЬ спрНоменклатура
    ИЗ
    Справочник.Номенклатура КАК спрНоменклатура
    ГДЕ
    спрНоменклатура.ЭтоГруппа = ЛОЖЬ
    </span>
    ИНДЕКСИРОВАТЬ ПО
    Ссылка;
    
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
    спрНоменклатура.Код,
    ВЫБОР
    КОГДА ЦеныНоменклатурыСрезПоследних.ТипЦен = &РозничнаяЦена
    ТОГДА ЦеныНоменклатурыСрезПоследних.Цена
    ИНАЧЕ 0
    КОНЕЦ КАК РозничнаяЦена,
    ВЫБОР
    КОГДА ЦеныНоменклатурыСрезПоследних.ТипЦен = &МелкоОптоваяЦена
    ТОГДА ЦеныНоменклатурыСрезПоследних.Цена
    ИНАЧЕ 0
    КОНЕЦ КАК МелкоОптоваяЦена,
    ВЫБОР
    КОГДА ЦеныНоменклатурыСрезПоследних.ТипЦен = &ОптоваяЦена
    ТОГДА ЦеныНоменклатурыСрезПоследних.Цена
    ИНАЧЕ 0
    КОНЕЦ КАК ОптоваяЦена,
    ВЫБОР
    КОГДА ЦеныНоменклатурыСрезПоследних.ТипЦен = &КрупноОптоваяЦена
    ТОГДА ЦеныНоменклатурыСрезПоследних.Цена
    ИНАЧЕ 0
    КОНЕЦ КАК КрупноОптоваяЦена
    ИЗ
    спрНоменклатура КАК спрНоменклатура
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ТипЦен В (&Цены)) КАК ЦеныНоменклатурыСрезПоследних
    ПО (ЦеныНоменклатурыСрезПоследних.Номенклатура = спрНоменклатура.Ссылка)"
    </FONT></FONT></pre>
    З.Ы. В параметр &Цены передавайте массив из всех типов цен, участвующих в запросе (в данном случае из 4-х).
  17. TopicStarter Overlay
    Dimka77
    Offline

    Dimka77 Опытный в 1С

    Регистрация:
    6 июн 2009
    Сообщения:
    279
    Симпатии:
    0
    Баллы:
    26
    Я понимаю, что уже достал, но всёж спрошу:
    Приведенные выше примеры не совсем подходят, бывает так, что, какой-нибудь цены (например оптовой) в принципе нет, но зато есть другие, так вот, получается, что результат запроса не содержит строки с номенклатурой у которой не полный набор цен, а мне хотелось бы, что бы отсутствие таковой замещалось 0, и строка номенклатуры все-таки попадала в результат запроса.
  18. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Не понял. Почему не содержат? В результат запроса попадают абсолютно все элементы справочника номенклатура (я сейчас говорю про свой запрос), неважно задана у них цена или нет. (попадут даже если вообще ни одной цены не установлено).
  19. TopicStarter Overlay
    Dimka77
    Offline

    Dimka77 Опытный в 1С

    Регистрация:
    6 июн 2009
    Сообщения:
    279
    Симпатии:
    0
    Баллы:
    26
    Хм...
    Может я накосячил:
    Код:
    ЗапросНаЦеныВПодразделении=Новый Запрос (	"ВЫБРАТЬ
    |	спрНоменклатура.Ссылка КАК Ссылка,
    |	спрНоменклатура.Код
    |ПОМЕСТИТЬ спрНоменклатура
    |ИЗ
    |	Справочник.Номенклатура КАК спрНоменклатура
    |ГДЕ
    |	спрНоменклатура.ЭтоГруппа = ЛОЖЬ
    |
    |ИНДЕКСИРОВАТЬ ПО
    |	Ссылка
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |	спрНоменклатура.Код,
    |	ВЫБОР
    |		КОГДА ЦеныНоменклатурыСрезПоследних.ТипЦен = &РозничнаяЦена
    |			ТОГДА ЦеныНоменклатурыСрезПоследних.Цена
    |		ИНАЧЕ 0
    |	КОНЕЦ КАК РозничнаяЦена,
    |	ВЫБОР
    |		КОГДА ЦеныНоменклатурыСрезПоследних.ТипЦен = &МелкоОптоваяЦена
    |			ТОГДА ЦеныНоменклатурыСрезПоследних.Цена
    |		ИНАЧЕ 0
    |	КОНЕЦ КАК МелкоОптоваяЦена,
    |	ВЫБОР
    |		КОГДА ЦеныНоменклатурыСрезПоследних.ТипЦен = &ОптоваяЦена
    |			ТОГДА ЦеныНоменклатурыСрезПоследних.Цена
    |		ИНАЧЕ 0
    |	КОНЕЦ КАК ОптоваяЦена,
    |	ВЫБОР
    |		КОГДА ЦеныНоменклатурыСрезПоследних.ТипЦен = &КрупноОптоваяЦена
    |			ТОГДА ЦеныНоменклатурыСрезПоследних.Цена
    |		ИНАЧЕ 0
    |	КОНЕЦ КАК КрупноОптоваяЦена
    |ИЗ
    |	спрНоменклатура КАК спрНоменклатура
    |		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ТипЦен.Код В (&Цены)) КАК ЦеныНоменклатурыСрезПоследних
    |		ПО (ЦеныНоменклатурыСрезПоследних.Номенклатура = спрНоменклатура.Ссылка)");
    ЗапросНаЦеныВПодразделении.УстановитьПараметр("РозничнаяЦена", КодРозничнойЦены);	
    ЗапросНаЦеныВПодразделении.УстановитьПараметр("МелкоОптоваяЦена", КодМелкоОптовойЦены);	
    ЗапросНаЦеныВПодразделении.УстановитьПараметр("ОптоваяЦена", КодОптовойЦены);	
    ЗапросНаЦеныВПодразделении.УстановитьПараметр("КрупноОптоваяЦена", КодКрупноОптовойЦены);	
    СозданныйМассив = Новый Массив; 
    СозданныйМассив.Добавить(Справочники.ТипыЦенНоменклатуры.НайтиПоКоду(КодРозничнойЦены));
    СозданныйМассив.Добавить(Справочники.ТипыЦенНоменклатуры.НайтиПоКоду(КодМелкоОптовойЦены));
    СозданныйМассив.Добавить(Справочники.ТипыЦенНоменклатуры.НайтиПоКоду(КодОптовойЦены));
    СозданныйМассив.Добавить(Справочники.ТипыЦенНоменклатуры.НайтиПоКоду(КодКрупноОптовойЦены));
    ЗапросНаЦеныВПодразделении.УстановитьПараметр ("Цены", СозданныйМассив);
    ДействующиеЦеныиТЗ=ЗапросНаЦеныВПодразделении.Выполнить().Выгрузить();
    
    Здесь вроде все правильно?
  20. has
    Offline

    has Опытный в 1С

    Регистрация:
    18 июн 2009
    Сообщения:
    708
    Симпатии:
    0
    Баллы:
    26
    Вот ошибка
    Код:
    |		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ТипЦен.Код В (&Цены)) КАК ЦеныНоменклатурыСрезПоследних
    
    
    надо
    Код:
    |		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ТипЦен В (&Цены)) КАК ЦеныНоменклатурыСрезПоследних
    
    
    Это раз. Во вторых если тип у КодРозничнойЦены и прочих равен строке/числу (там содержится код элемента), тогда код процедуры должен быть такой
    Код:
    ЗапросНаЦеныВПодразделении=Новый Запрос (	"ВЫБРАТЬ
    |	спрНоменклатура.Ссылка КАК Ссылка,
    |	спрНоменклатура.Код
    |ПОМЕСТИТЬ спрНоменклатура
    |ИЗ
    |	Справочник.Номенклатура КАК спрНоменклатура
    |ГДЕ
    |	спрНоменклатура.ЭтоГруппа = ЛОЖЬ
    |
    |ИНДЕКСИРОВАТЬ ПО
    |	Ссылка
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |	спрНоменклатура.Код,
    |	ВЫБОР
    |		КОГДА ЦеныНоменклатурыСрезПоследних.ТипЦен = &РозничнаяЦена
    |			ТОГДА ЦеныНоменклатурыСрезПоследних.Цена
    |		ИНАЧЕ 0
    |	КОНЕЦ КАК РозничнаяЦена,
    |	ВЫБОР
    |		КОГДА ЦеныНоменклатурыСрезПоследних.ТипЦен = &МелкоОптоваяЦена
    |			ТОГДА ЦеныНоменклатурыСрезПоследних.Цена
    |		ИНАЧЕ 0
    |	КОНЕЦ КАК МелкоОптоваяЦена,
    |	ВЫБОР
    |		КОГДА ЦеныНоменклатурыСрезПоследних.ТипЦен = &ОптоваяЦена
    |			ТОГДА ЦеныНоменклатурыСрезПоследних.Цена
    |		ИНАЧЕ 0
    |	КОНЕЦ КАК ОптоваяЦена,
    |	ВЫБОР
    |		КОГДА ЦеныНоменклатурыСрезПоследних.ТипЦен = &КрупноОптоваяЦена
    |			ТОГДА ЦеныНоменклатурыСрезПоследних.Цена
    |		ИНАЧЕ 0
    |	КОНЕЦ КАК КрупноОптоваяЦена
    |ИЗ
    |	спрНоменклатура КАК спрНоменклатура
    |		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ТипЦен В (&Цены)) КАК ЦеныНоменклатурыСрезПоследних
    |		ПО (ЦеныНоменклатурыСрезПоследних.Номенклатура = спрНоменклатура.Ссылка)");
    ЗапросНаЦеныВПодразделении.УстановитьПараметр("РозничнаяЦена", Справочники.ТипыЦенНоменклатуры.НайтиПоКоду(КодРозничнойЦены));	
    ЗапросНаЦеныВПодразделении.УстановитьПараметр("МелкоОптоваяЦена", Справочники.ТипыЦенНоменклатуры.НайтиПоКоду(КодМелкоОптовойЦены));	
    ЗапросНаЦеныВПодразделении.УстановитьПараметр("ОптоваяЦена", Справочники.ТипыЦенНоменклатуры.НайтиПоКоду(КодОптовойЦены));	
    ЗапросНаЦеныВПодразделении.УстановитьПараметр("КрупноОптоваяЦена", Справочники.ТипыЦенНоменклатуры.НайтиПоКоду(КодКрупноОптовойЦены));	
    СозданныйМассив = Новый Массив; 
    СозданныйМассив.Добавить(Справочники.ТипыЦенНоменклатуры.НайтиПоКоду(КодРозничнойЦены));
    СозданныйМассив.Добавить(Справочники.ТипыЦенНоменклатуры.НайтиПоКоду(КодМелкоОптовойЦены));
    СозданныйМассив.Добавить(Справочники.ТипыЦенНоменклатуры.НайтиПоКоду(КодОптовойЦены));
    СозданныйМассив.Добавить(Справочники.ТипыЦенНоменклатуры.НайтиПоКоду(КодКрупноОптовойЦены));
    ЗапросНаЦеныВПодразделении.УстановитьПараметр ("Цены", СозданныйМассив);
    ДействующиеЦеныиТЗ=ЗапросНаЦеныВПодразделении.Выполнить().Выгрузить();
    
    

Поделиться этой страницей