Имя: Пароль:
1C
1С v8
Вопрос по Запросу
, ,
0 SH_tan
 
20.02.14
12:30
В запросе условие не дает сделать групировку, если убираю условие
И Прайс_Лист.СтатусНоменклатуры В(&СписФильтр2)
групирует как надо, то есть сворачивает каждую группу.
Как правильно написать условие подскажите плиз.
1 SH_tan
 
20.02.14
12:31
ВЫБРАТЬ
    Прайс_Лист.Ссылка КАК Ссылка,
    Прайс_Лист.Представление,
    Прайс_Лист.Наименование КАК ТоварНаименование,
    Прайс_Лист.Спецификация КАК ТоварСпецификация,
    Прайс_Лист.Размер КАК ТоварРазмер,
    Прайс_Лист.Код КАК ТоварКод,
    ВЫБОР
        КОГДА ЦеныКомпанииМелк.Цена <> 0
            ТОГДА ЦеныКомпанииМелк.Цена
        ИНАЧЕ ЦеныКомпанииОпт.Цена
    КОНЕЦ КАК ЦенаМ,
    ЦеныКомпанииОпт.Цена КАК ЦенаО,
    ВЫБОР
        КОГДА ЦеныКомпанииРозн.Цена <> 0
            ТОГДА ЦеныКомпанииРозн.Цена
        ИНАЧЕ ВЫБОР
                КОГДА ЦеныКомпанииМелк.Цена <> 0
                    ТОГДА ЦеныКомпанииМелк.Цена
                ИНАЧЕ ЦеныКомпанииОпт.Цена
            КОНЕЦ
    КОНЕЦ КАК ЦенаР,
    ЦеныКомпанииРозн.Цена,
    ЦеныКомпанииОпт.Цена КАК Цена1,
    ЦеныКомпанииМелк.Цена КАК Цена2,
    ВЫБОР
        КОГДА Прайс_Лист.Родитель = &ПустойПрайс
            ТОГДА Прайс_Лист.Ссылка
        ИНАЧЕ ВЫБОР
                КОГДА Прайс_Лист.Родитель.Родитель = &ПустойПрайс
                    ТОГДА Прайс_Лист.Родитель
                ИНАЧЕ Прайс_Лист.Родитель.Родитель
            КОНЕЦ
    КОНЕЦ КАК Гр,
    ВЫБОР
        КОГДА Прайс_Лист.Родитель = &ПустойПрайс
            ТОГДА Прайс_Лист.Ссылка
        ИНАЧЕ ВЫБОР
                КОГДА Прайс_Лист.Родитель.Родитель = &ПустойПрайс
                    ТОГДА Прайс_Лист.Ссылка
                ИНАЧЕ Прайс_Лист.Родитель
            КОНЕЦ
    КОНЕЦ КАК Подгр,
    ОстаткиТоваровОстатки.ОстатокТовараОстаток КАК Остатки,
    Прайс_Лист.СтатусНоменклатуры КАК Статус
ИЗ
    Справочник.Номенклатура КАК Прайс_Лист
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныКомпании.СрезПоследних(&Дата, ТипЦен = &Розн) КАК ЦеныКомпанииРозн
        ПО Прайс_Лист.Ссылка = ЦеныКомпанииРозн.Номенклатура
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныКомпании.СрезПоследних(&Дата, ТипЦен = &Опт) КАК ЦеныКомпанииОпт
        ПО Прайс_Лист.Ссылка = ЦеныКомпанииОпт.Номенклатура
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныКомпании.СрезПоследних(&Дата, ТипЦен = &Мелкоопт) КАК ЦеныКомпанииМелк
        ПО Прайс_Лист.Ссылка = ЦеныКомпанииМелк.Номенклатура
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТоваров.Остатки КАК ОстаткиТоваровОстатки
        ПО Прайс_Лист.Ссылка = ОстаткиТоваровОстатки.Товар
ГДЕ
    НЕ Прайс_Лист.Ссылка В (&СписокНеПечатать)
    И Прайс_Лист.Ссылка В ИЕРАРХИИ(&СписФильтр)
    И Прайс_Лист.СтатусНоменклатуры В(&СписФильтр2)

УПОРЯДОЧИТЬ ПО
    Прайс_Лист.КодПорядка ИЕРАРХИЯ
2 vicof
 
20.02.14
12:33
(0) Результат запроса - плоска ятаблица, какие сворачивания? ты о чем?
3 SH_tan
 
20.02.14
12:35
Потом я групирую
ТабДок.НачатьАвтогруппировкуСтрок();
    ВыборкаДетали = Результат.Выбрать();
    инд=1;
    Пока ВыборкаДетали.Следующий() Цикл
        Ур=0;
        ОбластьДетальныхЗаписей.Параметры.Заполнить(ВыборкаДетали);
        Если ВыборкаДетали.ссылка.СтатусНоменклатуры=перечисления.СтатусНоменклатуры.ПодЗаказ Тогда
            ОбластьДетальныхзаписей.Параметры.ЦенаО="под заказ";
        КонецЕсли;
        
        Ур=ВыборкаДетали.Уровень();
        Если ВыборкаДетали.Уровень()=1 Тогда
            Если НЕ ВыборкаДетали.Ссылка.ЭтоГруппа Тогда
                Ур=2;
            КонецЕсли;
        КонецЕсли;
        Если ПечататьОглавление Тогда
        ТабДок.Вывести(ОбластьДетальныхЗаписей, ВыборкаДетали.Уровень(),,Истина);
    Иначе
        ТабДок.Вывести(ОбластьДетальныхЗаписей, ВыборкаДетали.Уровень(),,Ложь);
        КонецЕсли;
        Если Ур=0 Тогда
            Эл=Спис0.Добавить(инд);
        ИначеЕсли Ур=1 Тогда
            Спис1.Добавить(инд);
        КонецЕсли;
        инд=инд+1;
    КонецЦикла;
    
    ТабДок.ЗакончитьАвтогруппировкуСтрок();
4 Рэйв
 
20.02.14
12:38
(3)У тебя нечего автогруппировать
5 SH_tan
 
20.02.14
12:38
Мне кажется в запросе
ГДЕ ....И Прайс_Лист.СтатусНоменклатуры В(&СписФильтр2)
он убирает группы
СписФильтр2 - это список значений Перечисления
6 SH_tan
 
20.02.14
12:41
(4) но без этого
И Прайс_Лист.СтатусНоменклатуры В(&СписФильтр2)
группирует (сворачивает в крестик элементы)
7 vicof
 
20.02.14
12:41
(5)  И ВЫБОР КОГДА ЕстьРодитель ТОГДА Прайс_Лист.СтатусНоменклатуры В(&СписФильтр2) ИНАЧЕ ИСТИНА КОНЕЦ
8 SH_tan
 
20.02.14
12:44
вот полностью код
Спис0=Новый СписокЗначений;
     Спис1=Новый СписокЗначений;
     СписФильтр=Новый СписокЗначений;
     Для Сч=0 По СписокГрупп.Количество()-1 Цикл
         Эл=списокГрупп.Получить(Сч);
         Если Эл.Пометка Тогда
             СписФильтр.Добавить(Эл.Значение);
         КонецЕсли;
     КонецЦикла;
    
    ДляОтчета1 = Ложь;
    ДляОтчета2 = Ложь;
    
    Знч = Перечисления.СтатусНоменклатуры;
    СписФильтр2 = Новый СписокЗначений;
    Для Сч=0 По списокГрупп2.Количество()-1 Цикл
        Эл=списокГрупп2.Получить(Сч);
         СписФильтр2.Добавить(Эл.Значение);
        Если Эл.Значение = Знч.ВПродаже ИЛИ Эл.Значение = Знч.ПодЗаказ ИЛИ Эл.Значение = Знч.Спецпредложение Тогда
        ДляОтчета2 = Истина;
        ИначеЕсли  Эл.Значение = Знч.Уценка ИЛИ Эл.Значение = Знч.Распродажа ИЛИ Эл.Значение = Знч.СнятСПродажи Тогда
            ДляОтчета1 = Истина;
        ИначеЕсли Эл.Значение = Знч.ПодготовкаКПродаже Тогда
            Текст = "ru =  ""По Статусу Подготовка к продаже отчет не формируется! Измените Фильтр!""; en = ""Select a document!""";
            Предупреждение(НСтр(Текст), 10);
        Возврат;
      КонецЕсли;

        КонецЦикла;

      
    Если ДляОтчета1 И ДляОтчета2 Тогда    
        Макет = ВнешняяОбработкаОбъект.ПолучитьМакет("Отчет2");
    ИначеЕсли ДляОтчета1 Тогда
        Макет = ВнешняяОбработкаОбъект.ПолучитьМакет("Отчет1");
    ИначеЕсли ДляОтчета2 Тогда
        Макет = ВнешняяОбработкаОбъект.ПолучитьМакет("Отчет2");
    КонецЕсли;
    
    
    
    Запрос = Новый Запрос;
    Запрос.Текст =
    
        "ВЫБРАТЬ
        |    Прайс_Лист.Ссылка КАК Ссылка,
        |    Прайс_Лист.Представление,
        |    Прайс_Лист.Наименование КАК ТоварНаименование,
        |    Прайс_Лист.Спецификация КАК ТоварСпецификация,
        |    Прайс_Лист.Размер КАК ТоварРазмер,
        |    Прайс_Лист.Код КАК ТоварКод,
        |    ВЫБОР
        |        КОГДА ЦеныКомпанииМелк.Цена <> 0
        |            ТОГДА ЦеныКомпанииМелк.Цена
        |        ИНАЧЕ ЦеныКомпанииОпт.Цена
        |    КОНЕЦ КАК ЦенаМ,
        |    ЦеныКомпанииОпт.Цена КАК ЦенаО,
        |    ВЫБОР
        |        КОГДА ЦеныКомпанииРозн.Цена <> 0
        |            ТОГДА ЦеныКомпанииРозн.Цена
        |        ИНАЧЕ ВЫБОР
        |                КОГДА ЦеныКомпанииМелк.Цена <> 0
        |                    ТОГДА ЦеныКомпанииМелк.Цена
        |                ИНАЧЕ ЦеныКомпанииОпт.Цена
        |            КОНЕЦ
        |    КОНЕЦ КАК ЦенаР,
        |    ЦеныКомпанииРозн.Цена,
        |    ЦеныКомпанииОпт.Цена КАК Цена1,
        |    ЦеныКомпанииМелк.Цена КАК Цена2,
        |    ВЫБОР
        |        КОГДА Прайс_Лист.Родитель = &ПустойПрайс
        |            ТОГДА Прайс_Лист.Ссылка
        |        ИНАЧЕ ВЫБОР
        |                КОГДА Прайс_Лист.Родитель.Родитель = &ПустойПрайс
        |                    ТОГДА Прайс_Лист.Родитель
        |                ИНАЧЕ Прайс_Лист.Родитель.Родитель
        |            КОНЕЦ
        |    КОНЕЦ КАК Гр,
        |    ВЫБОР
        |        КОГДА Прайс_Лист.Родитель = &ПустойПрайс
        |            ТОГДА Прайс_Лист.Ссылка
        |        ИНАЧЕ ВЫБОР
        |                КОГДА Прайс_Лист.Родитель.Родитель = &ПустойПрайс
        |                    ТОГДА Прайс_Лист.Ссылка
        |                ИНАЧЕ Прайс_Лист.Родитель
        |            КОНЕЦ
        |    КОНЕЦ КАК Подгр,
        |    ОстаткиТоваровОстатки.ОстатокТовараОстаток КАК Остатки,
        |    Прайс_Лист.СтатусНоменклатуры КАК Статус
        |ИЗ
        |    Справочник.Номенклатура КАК Прайс_Лист
        |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныКомпании.СрезПоследних(&Дата, ТипЦен = &Розн) КАК ЦеныКомпанииРозн
        |        ПО Прайс_Лист.Ссылка = ЦеныКомпанииРозн.Номенклатура
        |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныКомпании.СрезПоследних(&Дата, ТипЦен = &Опт) КАК ЦеныКомпанииОпт
        |        ПО Прайс_Лист.Ссылка = ЦеныКомпанииОпт.Номенклатура
        |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныКомпании.СрезПоследних(&Дата, ТипЦен = &Мелкоопт) КАК ЦеныКомпанииМелк
        |        ПО Прайс_Лист.Ссылка = ЦеныКомпанииМелк.Номенклатура
        |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТоваров.Остатки КАК ОстаткиТоваровОстатки
        |        ПО Прайс_Лист.Ссылка = ОстаткиТоваровОстатки.Товар
        |ГДЕ
        |    НЕ Прайс_Лист.Ссылка В (&СписокНеПечатать)
        |    И Прайс_Лист.Ссылка В ИЕРАРХИИ(&СписФильтр)
        //|    И Прайс_Лист.СтатусНоменклатуры В(&СписФильтр2)
        |
        |УПОРЯДОЧИТЬ ПО
        |    Прайс_Лист.КодПорядка ИЕРАРХИЯ";
        
        ЦО=Константы.ОптоваяЦенаКомпании.Получить();
        ЦР=ЦО;
        ЦМ=ЦО;
        ВЫборка=Справочники.ТипыЦен.Выбрать();
    Пока Выборка.Следующий() Цикл
        Если Лев(ВРЕГ(ВЫборка.Ссылка.Наименование),8)="МЕЛКООПТ" Тогда
            ЦМ=Выборка.Ссылка;
            ИначеЕсли Лев(ВРЕГ(ВЫборка.Ссылка.Наименование),7)="РОЗНИЧН" Тогда
            ЦР=Выборка.Ссылка;
        КонецЕсли;
    КонецЦикла;
    Запрос.УстановитьПараметр("Дата", ТекущаяДата());
    Запрос.УстановитьПараметр("СписФильтр", СписФильтр.ВыгрузитьЗначения());
    Запрос.УстановитьПараметр("СписФильтр2",СписФильтр2.ВыгрузитьЗначения());
    Запрос.УстановитьПараметр("Мелкоопт", ЦМ);
    Запрос.УстановитьПараметр("Опт", ЦО);
    Запрос.УстановитьПараметр("Розн", ЦР);
    Запрос.УстановитьПараметр("СписокНеПечатать", СписокНеПечатать);
    Запрос.УстановитьПараметр("ПустойПрайс", Справочники.Номенклатура.ПустаяСсылка());
    Результат = Запрос.Выполнить();
    ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");
    ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");
    ОбластьШапкаТаблицы = Макет.ПолучитьОбласть("Шапка");
    ОбластьПодвалТаблицы = Макет.ПолучитьОбласть("ПодвалТаблицы");
    ОбластьДетальныхЗаписей = Макет.ПолучитьОбласть("Детали");
    ТабДок.Очистить();
    ОбластьЗаголовок.параметры.ДатаПрайса=ТекущаяДата();
    ТабДок.Вывести(ОбластьЗаголовок);
    ТабДок.Вывести(ОбластьШапкаТаблицы);
    ТабДок.НачатьАвтогруппировкуСтрок();
    ВыборкаДетали = Результат.Выбрать();
    инд=1;
    Пока ВыборкаДетали.Следующий() Цикл
        Ур=0;
        ОбластьДетальныхЗаписей.Параметры.Заполнить(ВыборкаДетали);
        Если ВыборкаДетали.ссылка.СтатусНоменклатуры=перечисления.СтатусНоменклатуры.ПодЗаказ Тогда
            ОбластьДетальныхзаписей.Параметры.ЦенаО="под заказ";
        КонецЕсли;
        
        Ур=ВыборкаДетали.Уровень();
        Если ВыборкаДетали.Уровень()=1 Тогда
            Если НЕ ВыборкаДетали.Ссылка.ЭтоГруппа Тогда
                Ур=2;
            КонецЕсли;
        КонецЕсли;
        Если ПечататьОглавление Тогда
        ТабДок.Вывести(ОбластьДетальныхЗаписей, ВыборкаДетали.Уровень(),,Истина);
    Иначе
        ТабДок.Вывести(ОбластьДетальныхЗаписей, ВыборкаДетали.Уровень(),,Ложь);
        КонецЕсли;
        Если Ур=0 Тогда
            Эл=Спис0.Добавить(инд);
        ИначеЕсли Ур=1 Тогда
            Спис1.Добавить(инд);
        КонецЕсли;
        инд=инд+1;
    КонецЦикла;
    
    ТабДок.ЗакончитьАвтогруппировкуСтрок();
    ТабДок.Вывести(ОбластьПодвалТаблицы);
    ТабДок.Вывести(ОбластьПодвал);
    Сообщить(Спис0.Количество());
    Для Сч=0 По Спис0.Количество()-1 Цикл
        Эл=Спис0.Получить(Сч);
        Ном=Эл.Значение;
        Обл=ТабДок.Область(Ном+7,2,Ном+7,8);
        Обл.ЦветФона=WebЦвета.БледноЗолотистый;
        Обл.Шрифт=Новый Шрифт(,,Истина);
    КонецЦикла;
    Для Сч=0 По Спис1.Количество()-1 Цикл
        Эл=Спис1.Получить(Сч);
        Ном=Эл.Значение;
        Обл=ТабДок.Область(Ном+7,2,Ном+7,6);
        Обл.ЦветФона=WebЦвета.БледноЗеленый;
        Обл.Шрифт=Новый Шрифт(,,Истина);
    КонецЦикла;
    Если ПечататьОглавление Тогда
    ТЗ=Результат.Выгрузить();
    ТЗ.Колонки.Добавить("НомерСтр");
    ТЗ.колонки.Добавить("ВысСтроки");
    ТабДок.ПоказатьУровеньГруппировокСтрок(1);
    ТабДок.ПоказатьУровеньГруппировокСтрок(2);
    
    КонецЕсли;

ТабДок.ПолеСнизу=15;
ТабДок.полеСверху=15;
ТабДок.НижнийКолонтитул.ТекстСлева="Страница [&НомерСтраницы] из [&PagesTotal]";
ТабДок.НижнийКолонтитул.ТекстСправа="[&Дата]";
ТабДок.НижнийКолонтитул.Выводить=Истина;
ТабДок.Автомасштаб=Истина;
ТабДок.ПовторятьПриПечатиСтроки=ТабДок.Область("Шапка");
9 vicof
 
20.02.14
12:45
(8) лень читать, (7) уже делал?
10 SH_tan
 
20.02.14
12:46
(9) Сорь счас попробую
11 SH_tan
 
20.02.14
13:02
(9) не отрабатывает, берет по всем статусам
ВЫБОР
    КОГДА Прайс_Лист.Родитель
        ТОГДА Прайс_Лист.СтатусНоменклатуры В (&СписФильтр2)
    ИНАЧЕ ИСТИНА
КОНЕЦ

или я что то не правильно делаю....
12 SH_tan
 
20.02.14
13:21
даже не знаю как ее победить(
13 vicof
 
20.02.14
13:56
НЕ Прайс_Лист.Родитель = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
14 SH_tan
 
20.02.14
14:04
(13)
не выходит каменный цветок(

|ГДЕ
        |    НЕ Прайс_Лист.Ссылка В (&СписокНеПечатать)
        |    И Прайс_Лист.Ссылка В ИЕРАРХИИ(&СписФильтр)
        |    И НЕ Прайс_Лист.Родитель = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
        |    И ВЫБОР
        |            КОГДА Прайс_Лист.Родитель
        |                ТОГДА Прайс_Лист.СтатусНоменклатуры В (&СписФильтр2)
        |            ИНАЧЕ ИСТИНА
        |        КОНЕЦ
        |
        |УПОРЯДОЧИТЬ ПО
        |    Прайс_Лист.КодПорядка ИЕРАРХИЯ";
15 vicof
 
20.02.14
14:04
(14) Не тупи
ВЫБОР
    КОГДА НЕ Прайс_Лист.Родитель = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
        ТОГДА Прайс_Лист.СтатусНоменклатуры В (&СписФильтр2)
    ИНАЧЕ ИСТИНА
КОНЕЦ
16 SH_tan
 
20.02.14
14:13
(15) он правильно отбирает, но подгруппы он не выдает, в конце выкидывает верхнего родителя, а надо блин чтобы он в крестик все сворачивал...и открывал по группам
17 Franchiser
 
гуру
20.02.14
14:14
(16) лень читать, думаю, тебе надо все кинуть во вложенный запрос и группировать там. Т.К. вложенные запросы в условие (лично встречал) "где", возможно и условие "В" способствуют появлению неявных связей таблиц, преобразованию исходного текста запроса и такому результату.
18 SH_tan
 
20.02.14
14:14
(15) вот тут может неправильно что?
19 SH_tan
 
20.02.14
14:14
инд=1;
    Пока ВыборкаДетали.Следующий() Цикл
        Ур=0;
        ОбластьДетальныхЗаписей.Параметры.Заполнить(ВыборкаДетали);
        Если ВыборкаДетали.ссылка.СтатусНоменклатуры=перечисления.СтатусНоменклатуры.ПодЗаказ Тогда
            ОбластьДетальныхзаписей.Параметры.ЦенаО="под заказ";
        КонецЕсли;
        
        Ур=ВыборкаДетали.Уровень();
        Если ВыборкаДетали.Уровень()=1 Тогда
            Если НЕ ВыборкаДетали.Ссылка.ЭтоГруппа Тогда
                Ур=2;
            КонецЕсли;
        КонецЕсли;
        Если ПечататьОглавление Тогда
        ТабДок.Вывести(ОбластьДетальныхЗаписей, ВыборкаДетали.Уровень(),,Истина);
    Иначе
        ТабДок.Вывести(ОбластьДетальныхЗаписей, ВыборкаДетали.Уровень(),,Ложь);
        КонецЕсли;
        Если Ур=0 Тогда
            Эл=Спис0.Добавить(инд);
        ИначеЕсли Ур=1 Тогда
            Спис1.Добавить(инд);
        КонецЕсли;
        инд=инд+1;
    КонецЦикла;
    
    ТабДок.ЗакончитьАвтогруппировкуСтрок();
20 SH_tan
 
20.02.14
14:31
(17) попробую переделать спс
21 Franchiser
 
гуру
20.02.14
14:35
(20) попробуй может порядок в условии ГДЕ еще поменять Прайс_Лист.Ссылка В ИЕРАРХИИ(&СписФильтр) поставить на первое место, не уверен, но может поможет.
22 Franchiser
 
гуру
20.02.14
14:38
возможно проблема в том что в уловие где одновременно встречается для ССЫЛКИ и "В" и "В ИЕРАРХИИ" поэтому интерпретируется по-первому, но это предположение...