Имя: Пароль:
1C
1С v8
Вложенный запрос
,
0 AnisaL
 
20.09.13
12:39
Добрый день!
Помогите разобраться где ошибка во вложенном запросе, точнее я не очень понимаю как правильно его написать. Вот кусок запроса, и он выдает ошибку "Синтаксическая ошибка "ВЫБРАТЬ"
        // Цена
                   ВЫБОР
                       КОГДА ТЧ.Работы.Наименование ПОДОБНО &РабСмена
                       Тогда         ВЫБОР     
                                   КОГДА ТЧ.ЦенаВнутренная = 1
                                   ТОГДА
                                   (ВЫБРАТЬ
                                     РаботникиОрганизацийСрезПоследних.Стоимость1часа
                                 ИЗ
                                     РегистрСведений.РаботникиОрганизаций.СрезПоследних(&Конец, ФизЛицо = &ФизЛицо) КАК РаботникиОрганизацийСрезПоследних
                                 ГДЕ
                                     РаботникиОрганизацийСрезПоследних.Организация = &Организация
                                 АВТОУПОРЯДОЧИВАНИЕ) КАК ВложенныйЗапросРаботникиОрганизаций                       
                                     ИНАЧЕ ТЧ.ЦенаВнутренная
                             КОНЕЦ
                            
                    ИНАЧЕ 0
                   КОНЕЦ КАК ЦенаРабочаяСмена,
1 ДенисЧ
 
20.09.13
12:40
Не прокатит так.
2 AnisaL
 
20.09.13
12:41
+(0) ошибку выдает на 6 строку (как здесь)
3 AnisaL
 
20.09.13
12:43
(1) ага, не прокатывает, наверно нужно чтобы было предложение с "ИЗ"
4 ДенисЧ
 
20.09.13
12:45
(3) Нужно для начала читать документацию. И осознавать, что запросы 1с - это не запросы SQL
5 kanalex
 
20.09.13
12:46
(0)
а скобку закрыть не пробовали?
6 Ёпрст
 
20.09.13
12:47
(0) в снеговике это не реализовано.. пока
7 kanalex
 
20.09.13
12:47
(4) хотя, конечно, в выражении ВЫБОР так нельзя, видимо
8 AnisaL
 
20.09.13
12:47
(3) смысл этого выбора в том заключается, что сначала идет условие на то что является ли эта номенклатура "Рабочей сменой", если да то опять условие: если Цена(стоимость 1 часа) этой рабочей смены = 1 (такое у нас бывает на внутренние работы), то нужно эту стоимость брать из вложенного подзапроса из период. РС РаботникиОрганизаций, иначе если не равно 1, то из ТЧ - табличной части документа
9 Ёпрст
 
20.09.13
12:48
нет там реализации подзапроса в кейсе
10 AnisaL
 
20.09.13
12:49
(5) в какой строке?
11 George Wheels
 
20.09.13
12:52
В качестве цены у тебя получается результат запроса.

Выбери ВложенныйЗапросРаботникиОрганизаций.Стоимость1часа
12 AnisaL
 
20.09.13
12:52
(4) а какую документацию почитать?
13 AnisaL
 
20.09.13
12:52
(11) да
14 AnisaL
 
20.09.13
12:55
(11) а как это написать ?
15 AnisaL
 
20.09.13
13:00
Написала так:
    // Цена
                   ВЫБОР
                       КОГДА ТЧ.Работы.Наименование ПОДОБНО &РабСмена
                       Тогда         ВЫБОР     
                                   КОГДА ТЧ.ЦенаВнутренная = 1
                                   ТОГДА
                                   ВЫБРАТЬ ВложенныйЗапросРаботникиОрганизаций.Стоимость1часа ИЗ
                                   (ВЫБРАТЬ
                                     РаботникиОрганизацийСрезПоследних.Стоимость1часа
                                 ИЗ
                                     РегистрСведений.РаботникиОрганизаций.СрезПоследних(&Конец, ФизЛицо = &ФизЛицо) КАК РаботникиОрганизацийСрезПоследних
                                 ГДЕ
                                     РаботникиОрганизацийСрезПоследних.Организация = &Организация
                                 АВТОУПОРЯДОЧИВАНИЕ) КАК ВложенныйЗапросРаботникиОрганизаций                       
                                     ИНАЧЕ ТЧ.ЦенаВнутренная
                             КОНЕЦ
                            
                    ИНАЧЕ 0
                   КОНЕЦ КАК ЦенаРабочаяСмена,
16 AnisaL
 
20.09.13
13:01
(15) + но все равно ошибка
17 catena
 
20.09.13
13:04
(15)Было же сказано, что не работает так. Можно соединить.
18 AnisaL
 
20.09.13
13:06
(17) а как тогда сделать по-другому?
19 manti
 
20.09.13
13:07
(15) приведи полный текст запроса
20 AnisaL
 
20.09.13
13:08
(19)         
ВЫБРАТЬ
    ДатаСоздания,
    Клиент,
    Сумма(СуммаРабочаяСмена) КАК СуммаРабСмена,
    Сумма(КоличествоРабочаяСмена) КАК КоличествоРабочаяСмена,
    Сумма(ЦенаРабочаяСмена) КАК ЦенаРабочаяСмена,
    Сумма(СуммаДопРаботы) КАК СуммаДопРаботы,
    Сумма(СуммаПитание) КАК СуммаПитание,
    Сумма(СуммаТранспорт) КАК СуммаТранспорт
    ИЗ            
                    
            (ВЫБРАТЬ
            
                 Ссылка.ДатаСоздания,
                 Ссылка.Клиент,
                   // Количество
                   ВЫБОР
                       КОГДА ТЧ.Работы.Наименование ПОДОБНО &РабСмена
                       Тогда ТЧ.Количество
                ИНАЧЕ 0
                   КОНЕЦ КАК КоличествоРабочаяСмена,  
                 ВЫБОР
                       КОГДА ТЧ.Работы.Наименование НЕ ПОДОБНО &РабСмена           
                       Тогда ТЧ.Количество
                    ИНАЧЕ 0
                       Конец КАК КоличествоДопРаботы,
                   0 КАК КоличествоПитание,
                   0 КАК КоличествоТранспорт,
                   
                // Цена
                   ВЫБОР
                       КОГДА ТЧ.Работы.Наименование ПОДОБНО &РабСмена
                       Тогда         ВЫБОР     
                                   КОГДА ТЧ.ЦенаВнутренная = 1
                                   ТОГДА
                                   ВЫБРАТЬ ВложенныйЗапросРаботникиОрганизаций.Стоимость1часа ИЗ
                                   (ВЫБРАТЬ
                                     РаботникиОрганизацийСрезПоследних.Стоимость1часа
                                 ИЗ
                                     РегистрСведений.РаботникиОрганизаций.СрезПоследних(&Конец, ФизЛицо = &ФизЛицо) КАК РаботникиОрганизацийСрезПоследних
                                 ГДЕ
                                     РаботникиОрганизацийСрезПоследних.Организация = &Организация
                                 АВТОУПОРЯДОЧИВАНИЕ) КАК ВложенныйЗапросРаботникиОрганизаций                       
                                     ИНАЧЕ ТЧ.ЦенаВнутренная
                             КОНЕЦ
                            
                    ИНАЧЕ 0
                   КОНЕЦ КАК ЦенаРабочаяСмена,  
                 ВЫБОР
                       КОГДА ТЧ.Работы.Наименование НЕ ПОДОБНО &РабСмена           
                       Тогда ТЧ.ЦенаВнутренная
                    ИНАЧЕ 0
                       Конец КАК ЦенаДопРаботы,
                   0 КАК ЦенаПитание,
                   0 КАК ЦенаТранспорт,
    
                   // Сумма
                   ВЫБОР
                       КОГДА ТЧ.Работы.Наименование ПОДОБНО &РабСмена
                       Тогда ТЧ.Количество*ТЧ.ЦенаВнутренная
                ИНАЧЕ 0
                   КОНЕЦ КАК СуммаРабочаяСмена,  
                 ВЫБОР
                       КОГДА ТЧ.Работы.Наименование НЕ ПОДОБНО &РабСмена           
                       Тогда ТЧ.Количество*ТЧ.ЦенаВнутренная
                    ИНАЧЕ 0
                       Конец КАК СуммаДопРаботы,
                   0 КАК СуммаПитание,
                   0 КАК СуммаТранспорт
                      
               ИЗ
                   Документ.ЗаявкаНаряд.Работы КАК ТЧ
               ГДЕ
                   Ссылка.Работы.Исполнитель = &Исполнитель
                   И
                   Ссылка.ДатаСоздания Между &Начало и &Конец
                               
            ОБЪЕДИНИТЬ
              ВЫБРАТЬ
                 Ссылка.ДатаСоздания,
                 Ссылка.Клиент,
                 // Количество
                0 КАК  КоличествоРабочаяСмена,
                   0 КАК  КоличествоДопРаботы,
                      (ВЫБОР
                       Когда ТЧ.Работы.Наименование ПОДОБНО &Питание
                       Тогда
                       ТЧ.Количество
                       КОНЕЦ) КАК КоличествоПитание,
                          (ВЫБОР
                          Когда ТЧ.Работы.Наименование ПОДОБНО &Транспорт
                          Тогда
                       ТЧ.Количество
                       Конец) КАК КоличествоТранспорт,
                   // Цена
                   0 КАК  ЦенаРабочаяСмена,
                   0 КАК  ЦенаДопРаботы,
                      (ВЫБОР
                       Когда ТЧ.Работы.Наименование ПОДОБНО &Питание
                       Тогда
                       ТЧ.ЦенаВнутренная
                       КОНЕЦ) КАК ЦенаПитание,
                          (ВЫБОР
                          Когда ТЧ.Работы.Наименование ПОДОБНО &Транспорт
                          Тогда
                       ТЧ.ЦенаВнутренная
                       Конец) КАК ЦенаТранспорт,
                // Сумма
                   0 КАК  СуммаРабочаяСмена,
                   0 КАК  СуммаДопРаботы,
                      (ВЫБОР
                       Когда ТЧ.Работы.Наименование ПОДОБНО &Питание
                       Тогда
                       ТЧ.Количество*ТЧ.ЦенаВнутренная
                       КОНЕЦ) КАК СуммаПитание,
                          (ВЫБОР
                          Когда ТЧ.Работы.Наименование ПОДОБНО &Транспорт
                          Тогда
                       ТЧ.Количество*ТЧ.ЦенаВнутренная
                       Конец) КАК СуммаТранспорт
                   
                                                   
               ИЗ
                   Документ.ЗаявкаНаряд.НакладныеРасходы КАК ТЧ
               ГДЕ
                   Ссылка.Работы.Исполнитель = &Исполнитель
                   И
                   Ссылка.ДатаСоздания Между &Начало и &Конец ) КАК ВложенныйЗапрос
      
    СГРУППИРОВАТЬ ПО ДатаСоздания, Клиент              
    УПОРЯДОЧИТЬ ПО
             ДатаСоздания, Клиент
    ИТОГИ ПО ОБЩИЕ
21 Ёпрст
 
20.09.13
13:08
(18) см. (9).
22 AnisaL
 
20.09.13
13:10
(21) уже посмотрела, тогда как иначе сделать?
23 George Wheels
 
20.09.13
13:14
Всё-таки лучше через соединение.
24 AnisaL
 
20.09.13
13:15
(22) + понятно что цену можно оставить такой какая есть и уже потом ее вытащить, после выполнения запроса, но хочется чтоб в запросе все считалось
25 AnisaL
 
20.09.13
13:15
(23) а что с чем соединять?
26 George Wheels
 
20.09.13
13:17
ФизЛицо, которое во вложенном запросе есть в документе?
27 AnisaL
 
20.09.13
13:19
(26) оно есть в табличной части, из которой берутся цифры
28 Dmitry1c
 
20.09.13
13:20
Брутально
29 George Wheels
 
20.09.13
13:21
Или соединить документ с регистром по реквизиту Организация (думаю в документе он должен быть). И оставить то же условие по ФизЛицу.
30 AnisaL
 
20.09.13
13:21
(26) в документе есть реквизит "Исполнитель", но бывают случаи когда в ТЧ помимо исполнителя еще другой сотрудник выбран, поэтому физлицо берется из ТЧ документа
31 AnisaL
 
20.09.13
13:22
(29) проблема в том что в документе нету реквизита Организация(
32 George Wheels
 
20.09.13
13:25
(30) Ну так соединяй по ФизЛицу из ТЧ.
33 AnisaL
 
20.09.13
13:26
(31) у нас несколько организаций, но только в одной возможны такие случаи когда стоимость 1 часа = 1, и именно по ней идет отбор в подзапросе
34 George Wheels
 
20.09.13
13:32
Всё, что в ВЫБОР оставляешь.
Вложенный запрос убираешь. Вместо него - РаботникиОрганизацийСрезПоследних.Стоимость1часа

ну и в конце

ИЗ
    Документ.ЗаявкаНаряд.Работы КАК ТЧ
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.РаботникиОрганизаций.СрезПоследних(&Конец) КАК РаботникиОрганизацийСрезПоследних
    ПО ТЧ.Сотрудник = РаботникиОрганизацийСрезПоследних.ФизЛицо
ГДЕ
    ...
35 AnisaL
 
20.09.13
13:52
(34) спасибо большое! единственное что получилось так, что когда в регистре РаботникиОрганизаций 1 запись по сотруднику, то запрос правильно выдает, а когда записей в регистре несколько по этому сотрдунику но от разных дат, то Цена 1 часа суммируется
36 AnisaL
 
20.09.13
13:54
(35) + как сделать чтобы выбиралась только последняя запись?
37 George Wheels
 
20.09.13
14:00
(35) СрезПоследних выдаёт несколько записей? Тогда смотри какие ещё измерения у регистра.
38 AnisaL
 
20.09.13
14:02
(37) у регистра 3 измерения: ФизЛицо, Организация, Подразделение
39 catena
 
20.09.13
14:10
(38)Это клево. Какой смысл?

Тогда так

Выбрать РабОрг.Стоимость1часа из (Выбрать физлицо, максимум(период) как Период из РегистрСведений.РаботникиОрганизаций как РаботникиОрганизаций где Организация=&Организация) как ВложеныйЗапрос
Левое соединение РегистрСведений.РаботникиОрганизаций как РабОрг
по РабОрг.Физлицо = ВложеныйЗапрос.Физлицо
и РабОрг.Период = ВложеныйЗапрос.Период
40 AnisaL
 
20.09.13
14:18
(39) этот запрос написать вместо этого ?
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.РаботникиОрганизаций.СрезПоследних(&Конец) КАК РаботникиОрганизацийСрезПоследних
                ПО ТЧ.Исполнитель = РаботникиОрганизацийСрезПоследних.ФизЛицо
41 catena
 
20.09.13
14:23
(40)Вместо РегистрСведений.РаботникиОрганизаций.СрезПоследних(&Конец)
42 AnisaL
 
20.09.13
14:26
(41) ошибку выдает:
Поле не входит в группу "Физлицо"
Выбрать Физлицо
43 catena
 
20.09.13
14:26
Вот так вернее для ваших целей.

Выбрать РабОрг.Стоимость1часа, РабОрг.Физлицо
из (Выбрать физлицо, максимум(период) как Период из РегистрСведений.РаботникиОрганизаций как РаботникиОрганизаций где Организация=&Организация и Период <=&Конец
Сгруппировать по физлицо
) как ВложеныйЗапрос
Левое соединение РегистрСведений.РаботникиОрганизаций как РабОрг
по РабОрг.Физлицо = ВложеныйЗапрос.Физлицо
и РабОрг.Период = ВложеныйЗапрос.Период
44 catena
 
20.09.13
14:27
(42)Да, группировку забыла, смотри (43)
45 AnisaL
 
20.09.13
14:40
(44) спасибо) только запрос выдает стоимости1часа без отбора по организации
46 AnisaL
 
20.09.13
14:50
(45) разобралась, в конце надо было еще одну строчку добавить
где РабОрг.организация = &Организация (43) чтоб отбор был по организации у второй таблицы
47 AnisaL
 
20.09.13
14:54
(44) запрос вставила вместо РегистрСведений.РаботникиОрганизаций.СрезПоследних(&Конец) выдает ошибку:
Ожидается имя таблицы
<<?>>Выбрать РабОрг.физлицо
48 catena
 
20.09.13
15:02
(47)А скобочки есть?

ЛЕВОЕ СОЕДИНЕНИЕ (ТУТ_ТЕКСТ_ЗАПРОСА)  КАК РаботникиОрганизацийСрезПоследних
                ПО ТЧ.Исполнитель = РаботникиОрганизацийСрезПоследних.ФизЛицо
49 AnisaL
 
23.09.13
07:42
(48) ага спасибо )
50 AnisaL
 
23.09.13
09:58
У меня не считает итог по строке - такое возможно осуществить в запросе?
"ВЫБРАТЬ
|    ДатаСоздания,
|    Клиент,
|    Проведен,
|     Сумма(СуммаРабочаяСмена) КАК СуммаРабочаяСмена,
|     Сумма(КоличествоРабочаяСмена) КАК КоличествоРабочаяСмена,
|     Сумма(ЦенаРабочаяСмена) КАК ЦенаРабочаяСмена,
|     Сумма(СуммаДопРаботы) КАК СуммаДопРаботы,
|     Сумма(СуммаПитание) КАК СуммаПитание,
|     Сумма(СуммаТранспорт) КАК СуммаТранспорт,
|   Сумма(СуммаРабочаяСмена+СуммаДопРаботы+СуммаПитание+СуммаТранспорт) КАК СуммаИтог
51 AnisaL
 
23.09.13
10:00
(50) + т.е. в последней строчке почему-то считает "Суммаитог" как СуммаРабочаяСмена а остальные суммы не прибавляет
52 AnisaL
 
23.09.13
10:35
(51) а если в ИТогах написать, то получится?