Имя: Пароль:
1C
 
Условие в запросе
0 kalisto
 
09.09.15
02:14
Доброго времени суток.
Мне надо переделать отчет по Валовой прибыли. Суть проблемы в том, что мне надо данные для этого отчета брать из своего регистра при определенных условиях. Вот кусок запроса из отчета, в котором мне нужно прописать условие:
РегистрНакопления.Продажи.Обороты(&ДатаНач, &ДатаКон, Регистратор, {(Организация).* КАК Организация, (Проект).* КАК Проект, (Подразделение).* КАК Подразделение, (Контрагент).* КАК Покупатель, (ДоговорКонтрагента).* КАК ДоговорПокупателя, (Номенклатура).* КАК Номенклатура, (ХарактеристикаНоменклатуры).* КАК ХарактеристикаНоменклатуры, (ЗаказПокупателя).* КАК ЗаказПокупателя}) КАК ПродажиОбороты
    |                ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
    |                    ПартииТоваровНаСкладах.Номенклатура КАК Номенклатура,
    |                    ПартииТоваровНаСкладах.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
    |                    ВЫБОР
    |                        КОГДА ПартииТоваровНаСкладах.ДокументДвижения <> НЕОПРЕДЕЛЕНО
    |                            ТОГДА ПартииТоваровНаСкладах.ДокументДвижения
    |                        ИНАЧЕ ПартииТоваровНаСкладах.Регистратор
    |                    КОНЕЦ КАК Регистратор,
    |                    СУММА(ВЫБОР
    |                            КОГДА ПартииТоваровНаСкладах.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
    |                                ТОГДА ПартииТоваровНаСкладах.Стоимость * -1
    |                            ИНАЧЕ ПартииТоваровНаСкладах.Стоимость
    |                        КОНЕЦ) КАК СтоимостьОборот
    |                ИЗ
    |                    РегистрНакопления.ПартииТоваровНаСкладах КАК ПартииТоваровНаСкладах                    
    |                ГДЕ
    |                    ПартииТоваровНаСкладах.Период МЕЖДУ &ДатаНачала И &ДатаКонца
    |                {ГДЕ
    |                    ПартииТоваровНаСкладах.Номенклатура.* КАК Номенклатура,
    |                    ПартииТоваровНаСкладах.ХарактеристикаНоменклатуры.* КАК ХарактеристикаНоменклатуры}
    |                
    |                СГРУППИРОВАТЬ ПО
    |                    ПартииТоваровНаСкладах.Номенклатура,
    |                    ПартииТоваровНаСкладах.ХарактеристикаНоменклатуры,
    |                    ВЫБОР
    |                        КОГДА ПартииТоваровНаСкладах.ДокументДвижения <> НЕОПРЕДЕЛЕНО
    |                            ТОГДА ПартииТоваровНаСкладах.ДокументДвижения
    |                        ИНАЧЕ ПартииТоваровНаСкладах.Регистратор
    |                    КОНЕЦ) КАК ТаблицаРегистраПродажиСебестоимость


Мне нужно здесь встроить условие, что если документ оприходования в регистре ПартииТоваровНаСкладах это документ ОприходованиеТоваров, тогда обратиться нужно к другому регистру (собственный регистр, например Уценка), и оттуда выудить Стоимость и записать в СтоимостьОборот.
1 kalisto
 
09.09.15
02:14
Подскажите пожалуйста, как это можно сделать.
2 rphosts
 
09.09.15
03:18
можно так:
Запрос.текст = СтрЗаменить(Запрос.текст, "ИсходныйРегистр", "ДругойРегистр")

а можно так:

Выбрать бла-бла-бла Из ИсходныйРегистр Где &ВыбиратьИзИсходногоРегистра
Объединить ВСЕ
Выбрать бла-бла-бла Из ДругойРегистр Где НЕ &ВыбиратьИзИсходногоРегистра
3 kalisto
 
09.09.15
09:17
Спасибо. Попробую.
4 kalisto
 
10.09.15
00:51
То что подсказал  rphosts не совсем подходит. Могу ли я использовать такую конструкцию (встроить ее в кусок кода, показанный выше):
СУММА( ВЫБОР
    |                                КОГДА ПартииТоваровНаСкладах.ДокументОприходования ССЫЛКА Документ.ОприходованиеТоваров
    |                                    ТОГДА
    |                                   (ВЫБРАТЬ
    |                                       ПартииТоваровУценка.Номенклатура КАК НоменклатураУценка
    |                                    ИЗ
    |                                       РегистрНакопления.ПартииТоваровНаСкладахУценка КАК ПартииТоваровУценка
    |                                    ГДЕ
    |                                       ПартииТоваровУценка.Период МЕЖДУ &ДатаНачала И &ДатаКонца )
    |                                    
    |
    |
    |                                ИНАЧЕ
    |                                    ВЫБОР
    |                                        КОГДА ПартииТоваровНаСкладах.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)    
    |                                            ТОГДА ПартииТоваровНаСкладах.Стоимость * -1
    |                                        ИНАЧЕ ПартииТоваровНаСкладах.Стоимость
    |                                    КОНЕЦ
    |                                КОНЕЦ
    |                            )  КАК СтоимостьОборот

Сейчас программа ругается на такой код:
Синтаксическая ошибка "ВЫБРАТЬ"
(<<?>>ВЫБРАТЬ
Подскажите, как правильно написать такое условие. Очень надо.
5 kalisto
 
10.09.15
00:53
Правда, первое условие не дописано. Потом дополню его, как положено. Главное сейчас понять возможен такой вариант кода или нет.
6 Franchiser
 
гуру
10.09.15
01:00
В полях запроса 1с нельзя использовать другой запрос.
7 kalisto
 
10.09.15
01:04
Как же быть... Именно в этом месте нужно брать данные из регистра Уценка при условии, что документ оприходования - Оприходование товаров.
8 palsergeich
 
10.09.15
01:06
А если написать запрос, отладить, и разорвать строковой переменной, которая будет определятся до запроса? Типо какого
Исходный
     "ВЫБРАТЬ
     |    Контакт.Ссылка
     |ИЗ
     |    Документ.Контакт КАК Контакт"
Преобразуем
Если ЧешетсяПравоеУхо Тогда ИмяНужногоДокумента = "ПоступлениеТоваровИУслуг"
Иначе ИмяНужногоДокумента = "ЗаказыПокупателей"    
КонецЕсли;
"ВЫБРАТЬ
     |    ДанныеИзРегистра.Ссылка
     |ИЗ
     |    Документ."+ИмяНужногоДокумента+"КАК ДанныеИзРегистра";
так поступают в типовых
9 Franchiser
 
гуру
10.09.15
01:07
Можешь попробовать такого рода конструкцию:
и  ПартииТоваровНаСкладах.Номенклатура В (ВЫБРАТЬ
                                          ПартииТоваровУценка.Номенклатура КАК НоменклатураУценка
                                       ИЗ
                                           РегистрНакопления.ПартииТоваровНаСкладахУценка КАК ПартииТоваровУценка
                                       ГДЕ
                                         ПартииТоваровУценка.Период МЕЖДУ &ДатаНачала И &ДатаКонца )
10 Franchiser
 
гуру
10.09.15
01:08
(8) да, поступают
11 Franchiser
 
гуру
10.09.15
01:11
(8) только так ты дважды запрос собираешься запускать?
12 Franchiser
 
гуру
10.09.15
01:12
В типовых так делают для генерации текста запроса при обходе метаданных
13 kalisto
 
10.09.15
01:13
(9) вот эта конструкция больше подходит. Спасибо, сейчас попробую.
14 palsergeich
 
10.09.15
01:14
по постановки задачи скорее всего не подойдет
Запрос в текущем виде плохо читается(
Нужно ставить тогда условие Выбор Когда Регистратор ССЫЛКА Документ.ОприходованиеТоваров Тогда Запрос1
Когда Регистратор ССЫЛКА Документ.Уценка тогда ВторойЗапрос
Конец
Но это ппц как не оптимально. Я бы переписал запрос....
15 palsergeich
 
10.09.15
01:19
Сделал бы объединение 2х запрсов где разделил бы записи по условию типа регистратора, Внутри этих запросов соединил бы с нужными реистрами. И все было бы Тип Топ.
16 kalisto
 
10.09.15
01:24
Мне-то фактически нужна не номенклатура, а стоимость. Это я решила попробовать сначала хоть что-нибудь выудить из Уценки. А Уценка - это регистр, из которого нужно выуживать  стоимость (вместо ПартииТоваровНаСкладах.Стоимость), если в регистре ПартииТоваровНаСкладах партией является док Оприходование.
17 kalisto
 
10.09.15
01:29
Если бы там не было функции Сумма, было бы легче. Получается, что себестоимость сразу собирается из всех документов движения. И в итоге не разобрать, какая туда попала партия. Это почти стандартный отчет по Валовой прибыли, поэтому переделывать его много мороки.
18 palsergeich
 
10.09.15
01:35
а в чем сложность после объединения сгруппировать и просуммировать ресурс?
Наоборот будет проще - 1 ый запрос - Изначальный запрос остается без изменений, только условие по типу регистратора и без группировок, 2ой - Условие по типу регистратора и соединение с другим регистром.
Поместить во Временную или во вложенный запрос и сгруппировать.
А так получится ведро костылей, да еще и дико не оптимальное,которое тормозить все будет, и времени в 10 раз больше в итоге потратите, и поддерживать сложнее.
19 patria0muerte
 
10.09.15
03:56
Я бы примерно так попробовал сделать

ВЫБРАТЬ
     ВЫБОР КОГДА ПартииТоваровНаСкладах.ДокументОприходования ССЫЛКА Документ.ОприходованиеТоваров ТОГДА
          ЕСТЬNULL(ПартииТоваровУценка.Стоимость,0) = 0
     ИНАЧЕ
          ПартииТоваровНаСкладах.Стоимость
     КОНЕЦ КАК Стоимость
ИЗ РегистрНакопления.ПартииТоваровНаСкладах КАК ПартииТоваровНаСкладах
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваровНаСкладахУценка КАК ПартииТоваровУценка
ПО ПартииТоваровНаСкладах.ДокументОприходования = ПартииТоваровУценка.ДокументОприходования
20 patria0muerte
 
10.09.15
03:59
Т.е. изначально джойнишь нужный регистр, а при выборе проверяешь тип ссылки и уже берешь нужную стоимость.
21 kalisto
 
10.09.15
23:04
(20) Спасибо, так и сделала.