Имя: Пароль:
1C
1С v8
Выбрать цены
,
0 Альбатрос
 
17.04.12
05:14
УТ10.3, 8.2.

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

Таким запросом получаю позиции, где указана розничная цена. Но для каждой найденной в этом же регистре надо посмотреть еще и оптовую. Как это сделать в одном запросе? Заранее спасибо
1 Cube
 
17.04.12
05:22
(0) Ну, я вижу два варианта:

1). В параметр &ТипЦен передавать список типов цен, а в запросе сделать поля "ЦенаОптовая" и "ЦенаРозничная". В эти поля данные попадают по условию от типа цены, если условие не выполняется, то подставляется ноль. Потом запрос сгруппировать и цены взять максимальные.

2). Сделать запрос с двумя вложенными запросами. Оба вложенных запроса, как в (0). Первый выбирает розничную цену, второй оптовую. Связать вложенные запросы левым соединением.
2 Cube
 
17.04.12
05:23
+(1) Я бы сделал вариантом 2.
3 Альбатрос
 
17.04.12
05:24
(2)Ок, щас попробую второй вариант
4 DosBot
 
17.04.12
05:35
или вот ещё вариант:

ВЫБРАТЬ
   ЦеныНоменклатурыСрезПоследних.Номенклатура,
   ЦеныНоменклатурыСрезПоследних.Цена КАК РозничнаяЦена,
   0 КАК ОптоваяЦена
ИЗ
   РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, ТипЦен В (&ТипРозничная)) КАК ЦеныНоменклатурыСрезПоследних

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
   ЦеныНоменклатурыСрезПоследних.Номенклатура,
   0,
   ЦеныНоменклатурыСрезПоследних.Цена
ИЗ
   РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, ТипЦен В (&ТипОптовая)) КАК ЦеныНоменклатурыСрезПоследних
5 Cube
 
17.04.12
05:37
(4) В одной строке у тебя не будет и розничной и оптовой. Нужно ещё группировать и в итоге, это получится вариация варианта 1 из поста (1).
6 Cube
 
17.04.12
05:39
(0) Кстати, за строку ГДЕ ЦеныНоменклатурыСрезПоследних.ТипЦен.Ссылка = &ТипЦен" тебя расстреляют без суда и следствия. Используй параметры виртуальной таблицы, это на порядок производительней.
7 DosBot
 
17.04.12
05:39
(5) миль пардон:

ВЫБРАТЬ
   ЦеныНоменклатурыСрезПоследних.Номенклатура,
   ЦеныНоменклатурыСрезПоследних.Цена КАК РозничнаяЦена,
   0 КАК ОптоваяЦена
ПОМЕСТИТЬ Данные
ИЗ
   РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, ТипЦен В (&ТипРозничная)) КАК ЦеныНоменклатурыСрезПоследних

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
   ЦеныНоменклатурыСрезПоследних.Номенклатура,
   0,
   ЦеныНоменклатурыСрезПоследних.Цена
ИЗ
   РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, ТипЦен В (&ТипОптовая)) КАК ЦеныНоменклатурыСрезПоследних
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   Данные.Номенклатура,
   СУММА(Данные.РозничнаяЦена) КАК РозничнаяЦена,
   СУММА(Данные.ОптоваяЦена) КАК ОптоваяЦена
ИЗ
   Данные КАК Данные

СГРУППИРОВАТЬ ПО
   Данные.Номенклатура
8 Cube
 
17.04.12
05:42
(7) Ещё и временные таблицы сюда запихал))) Мде)))
9 Web00001
 
17.04.12
05:50
Не так давно надо было подучить остатки на складе, оптовую и розничную цены, сделал как вышло мб не оптимально и еще какая нить хрень, в общем получилось три вложенных запроса:
ВЫБРАТЬ
   Товары.Ссылка,
   Цены.ЗакупочнаяЦена,
   Цены.РозничнаяЦена,
   Остатки.КоличествоОстаток,
   Товары.Артикул
ИЗ
   Справочник.Номенклатура КАК Товары
       ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
           Товары.Ссылка КАК Ссылка,
           ТоварыОрганизацийОстатки.КоличествоОстаток КАК КоличествоОстаток
       ИЗ
           Справочник.Номенклатура КАК Товары
               ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыОрганизаций.Остатки КАК ТоварыОрганизацийОстатки
               ПО (ТоварыОрганизацийОстатки.Номенклатура = Товары.Ссылка)) КАК Остатки
       ПО Товары.Ссылка = Остатки.Ссылка
       ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
           Закупочная.Номенклатура КАК Товар,
           Закупочная.Цена КАК ЗакупочнаяЦена,
           Розничная.Цена КАК РозничнаяЦена
       ИЗ
           (ВЫБРАТЬ
               ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура,
               ЦеныНоменклатурыСрезПоследних.Цена КАК Цена
           ИЗ
               РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних
           ГДЕ
               ЦеныНоменклатурыСрезПоследних.ТипЦен = &ЦенаРозничная) КАК Розничная
               ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
                   ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура,
                   ЦеныНоменклатурыСрезПоследних.Цена КАК Цена
               ИЗ
                   РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних
               ГДЕ
                   ЦеныНоменклатурыСрезПоследних.ТипЦен = &ЦенаЗакупочная) КАК Закупочная
               ПО Розничная.Номенклатура = Закупочная.Номенклатура) КАК Цены
       ПО Товары.Ссылка = Цены.Товар.Ссылка
10 Web00001
 
17.04.12
05:51
это запрос для отчета из СКД для 8.1
11 Cube
 
17.04.12
06:02
(9) Не позорился бы... За такой запрос нужно расстреливать.

Во-первых, ты не использовал параметры виртуальных таблиц для цен номенклатуры.

Во-вторых, если у какого-либо товара будет установлена только одна цена, например, только оптовая, то такая номенклатура тебе в отчет вообще не попадает.

В-третьих, а если умный бухгалтер переведет дату на компьютере на месяц-другой назад, то у тебя отчет и выдаст данные на дату, установленную на компе, ведь в запросе ты не говоришь, на какую дату получать данные...
12 Web00001
 
17.04.12
06:30
Параметры да не использовал, позор моим седым яйцам... наверное :)
Во вторых попадала, были с пустыми ценами и розница и закупочная
В третьих нет хитрых бухгалтеров, этот отчет формировался для анализа что и в каком количестве переедет в новую базу, то я его формировал. Но как то я считал, что если не указывать дату, то 1С должна указать актуальные остатки а не на дату, разве не?
13 Альбатрос
 
17.04.12
06:59
Наваял вот такое произведение:
ТипРозничная = Справочники.ТипыЦенНоменклатуры.НайтиПоНаименованию("Розничные");
   ТипОптовая = Справочники.ТипыЦенНоменклатуры.НайтиПоНаименованию("Оптовые");
   Запрос = Новый Запрос;
   Запрос.Текст =
   "ВЫБРАТЬ ПЕРВЫЕ 10
   |    ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Ном,
   |    ЦеныНоменклатурыСрезПоследних.Цена КАК РозЦена
   |ИЗ
   |    РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ТипЦен В (&ТипРозничная)) КАК ЦеныНоменклатурыСрезПоследнихРозничные
   |ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
   |   ЦеныНоменклатурыСрезПоследних.Цена КАК ОптЦена
   |ИЗ
   |    РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ТипЦен В (&ТипОптовая)) КАК ЦеныНоменклатурыСрезПоследнихОптовые
   |ПО ЦеныНоменклатурыСрезПоследнихОптовые.Номенклатура = Ном)
   |";
       Рез = Запрос.Выполнить().Выбрать();
   Пока рез.Следующий() цикл
        Сообщить(""+Рез.Номенклатура+" "+Рез.РозЦена+" "+Рез.ОптЦена);
   КонецЦикла;


Ессесно, не работает. Что неправильно?
14 Cube
 
17.04.12
06:59
(12) 2). Да, точно, там NULL у тебя будет, ошибся.
3). Точняк, выводится последняя запись регистра, даже, если её дата больше текущей. Почему-то считал по-другому...

В этих пунктах я опарафинился)) Не ошибается тот, кто ничего не делает)
15 Cube
 
17.04.12
07:11
(13) тебе вообще вложенные запросы делать не нужно. Я просто не обратил внимание, что в условии ГДЕ, ты тип цены указываешь, поэтому сказал, что вложенные запросы делать надо.
Твой запрос должен выглядеть так:

ВЫБРАТЬ
   ЦеныНоменклатурыСрезПоследних_Розничная.Номенклатура,
   ЦеныНоменклатурыСрезПоследних_Розничная.Цена КАК ЦенаРозничная,
   ЕСТЬNULL(ЦеныНоменклатурыСрезПоследних_Оптовая.Цена, 0) КАК ЦенаОптовая
ИЗ
   РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Период, ТипЦен = &ЦенаРозничная) КАК ЦеныНоменклатурыСрезПоследних_Розничная
       ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Период, ТипЦен = &ЦенаОптовая) КАК ЦеныНоменклатурыСрезПоследних_Оптовая
       ПО ЦеныНоменклатурыСрезПоследних_Розничная.Номенклатура = ЦеныНоменклатурыСрезПоследних_Оптовая.Номенклатура
16 Альбатрос
 
17.04.12
07:36
(15) Спасибо, такой вариант работает. Теперь нужно такое условие:
Если закупочная цена не заполнена (нужна закупочная, а не оптовая, я ошибся), тогда нужно выбрать последнюю стоимость по документу прихода. То есть, я так понимаю, из регистра партий. В этом случае уже понадобится вложенный запрос?
17 Cube
 
17.04.12
07:43
(16) Нет, опять вложенный запрос не понадобится :)
Добавляешь нужный регистр, прикручиваешь его левым соединением к нашему регистру "ЦеныНоменклатурыСрезПоследних_Розничная", а потом в строке

ЕСТЬNULL(ЦеныНоменклатурыСрезПоследних_Оптовая.Цена, 0) КАК ЦенаОптовая

пишешь так:

ЕСТЬNULL(ЦеныНоменклатурыСрезПоследних_Оптовая.Цена, ЕСТЬNULL(ТолькоЧтоДобавленныйРегистр.Стоимость, 0)) КАК ЦенаОптовая

То есть этим ты задаешь условие: если есть оптовая цена, то выводится она, если её нет, то выводится стоимость из регистра "ТолькоЧтоДобавленныйРегистр", если и там данных нет, то выводится ноль.
18 Cube
 
17.04.12
07:47
+(17) Хотя... Наверное придется всё же сделать вложенный запрос, для получения последней партии...
19 Альбатрос
 
17.04.12
08:19
(17) Спасибо еще раз, работает:

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

(18) Мне последняя запись и не нужна, потому что если нет закупочной цены, значит, через оприходование товар был занесен. В этом  случае по средней нужна цена. Отсюда еще один вопрос:
Мне из регистра партий нужно значение формулой вытащить, т.е. Стоимость/количество. Как эту формулу можно реалтзовать, чтоб результат подставлялся в "ЦенаОптовая"?
20 Cube
 
17.04.12
09:24
(19) Ну так и пиши: "СтоимостьОстаток / КоличествоОстаток" Только учти, что количество может быть равно нулю и запрос будет вылетать с ошибкой "Деление на ноль". Поэтому используй условие ВЫБОР КОГДА ТОГДА ИНАЧЕ КОНЕЦ.
21 Альбатрос
 
17.04.12
09:33
(20) Огромное Вам спасибо, все получилось, очень помогли!
22 Cube
 
17.04.12
09:46
(21) Покажи, что получилось))
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший