Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
19 мая 2024, 07:31

Помогите с построением запроса

Автор Игорь_M, 15 фев 2015, 00:11

0 Пользователей и 1 гость просматривают эту тему.

uanr81

ВЫБРАТЬ
ПоставщикиДоговора.Ссылка.Наименование
ИЗ
Справочник.Поставщики.Договора КАК ПоставщикиДоговора
ГДЕ
(ПоставщикиДоговора.Содержание <= &ВремяН
ИЛИ ПоставщикиДоговора.Ссылка.Представление <= &ВремяН)

Попробуй так, здесь основная таблица эта твоя табличная часть справочника (Здесь Договора), а к реквизиту элемента добираешься через ссылку(Здесь ПоставщикиДоговора.Ссылка.Представление)

temrmal

Ясно)))))

Выбрать СпрПолуфабрикатыДочернПФ.Ссылка КАК ОСНОВНОЙПФ,
        МИНИМУМ(ВЫБОР КОГДА СпрПолуфабрикатыДочернПФ.ПФДоч.МоментОкончания <= &ВремяН Тогда
        ИСТИНА
        ИНАЧЕ ЛОЖЬ
        КОНЕЦ) КАК Подходит

ИЗ Справочник.Полуфабрикаты.ДочернПФ КАК СпрПолуфабрикатыДочернПФ
ГРУППИРОВКА ПО СпрПолуфабрикатыДочернПФ.Ссылка
ИМЕЮЩИЕ МИНИМУМ(ВЫБОР КОГДА СпрПолуфабрикатыДочернПФ.ПФДоч.МоментОкончания <= &ВремяН Тогда
        ИСТИНА
        ИНАЧЕ ЛОЖЬ
        КОНЕЦ) = ИСТИНА


2 вариант (не уверен на счет "имеющие")

Выбрать СпрПолуфабрикатыДочернПФ.Ссылка КАК ОСНОВНОЙПФ,
        МИНИМУМ(ВЫБОР КОГДА СпрПолуфабрикатыДочернПФ.ПФДоч.МоментОкончания <= &ВремяН Тогда
        ИСТИНА
        ИНАЧЕ ЛОЖЬ
        КОНЕЦ) КАК Подходит
Поместить ТабПодготовки
ИЗ Справочник.Полуфабрикаты.ДочернПФ КАК СпрПолуфабрикатыДочернПФ
ГРУППИРОВКА ПО СпрПолуфабрикатыДочернПФ.Ссылка
;
Выбрать ТабПодготовки.ОСНОВНОЙПФ
ИЗ ТабПодготовки КАК ТабПодготовки
ГДЕ ТабПодготовки.Подходит = ИСтина

т.е. 2 пакета запроса

Игорь_M

 поэлементно это будет выглядеть таким образом:
Запрос.Текст = "Выбрать Полуфабрикаты.РабочийЦентр,
|        Полуфабрикаты.МоментНачала,
|        Полуфабрикаты.Ссылка,
|        Полуфабрикаты.МоментОкончания,                        
|        Полуфабрикаты.ФлагРаспределения,
|        Полуфабрикаты.Наименование,
|        Полуфабрикаты.Ссылка,
|        Полуфабрикаты.ПроцентВыполнения,
|        Полуфабрикаты.ФлагОбъединения
|ИЗ     
|        Справочник.Полуфабрикаты  КАК Полуфабрикаты
|ГДЕ
|        Полуфабрикаты.ФлагРаспределения=Ложь и Полуфабрикаты.МоментОкончания<&ВремяН
|        и Полуфабрикаты.РабочийЦентр = &ПараметрРЦ";

Запрос.УстановитьПараметр("ПараметрРЦ", СправРЦ.Ссылка);
Запрос.УстановитьПараметр("ВремяН", ВремяН);
Выборка = Запрос.Выполнить().Выбрать(); 
Пока Выборка.Следующий() Цикл
Для Каждого стр Из Выборка.Ссылка.ДочернПФ
Можно = Истина;
Если стр.ПФДоч.МоментОкончания > ВремяН Тогда
Можно = Ложь;
КонецЕсли;

Если Можно Тогда
   .......


temrmal

ну выше написал,

По каждой ссылке смотришь минимальное значение по "Подходит"
Если Все подходят, то вернет ИСТИНА, в противном случае ложь, во втором пакете отбор по истине
Добавлено: 16 фев 2015, 23:56


ААААА, и третий пакет))) забыл, у
же фильтр по момент изменения по самой ссылке

Игорь_M

... пока перевариваю )) .. идея понятна , спасибо, сейчас буду пробовать

TreeDogNight

Lexak и uanr81 правильно тебе подсказали! Используй запрос, который ты написал в шапке, но вместе И ипользуй ИЛИ.

"ВЫБРАТЬ
        |    Полуфабрикаты.ДочернПФ.(
        |        ПФДоч.ФлагРаспределения,
        |        ПФДоч.МоментОкончания
        |    ),
        |    Полуфабрикаты.РабочийЦентр,
        |    Полуфабрикаты.Наименование,
        |    Полуфабрикаты.МоментОкончания,
        |    Полуфабрикаты.ФлагРаспределения
        |ИЗ
        |    Справочник.Полуфабрикаты КАК Полуфабрикаты
        |ГДЕ
        |    Полуфабрикаты.ФлагРаспределения = Истина
        |    И Полуфабрикаты.МоментОкончания <= &ВремяН
        |    ИЛИ Полуфабрикаты.ДочернПФ.ПФДоч.МоментОкончания <= &ВремяН
        |    И Полуфабрикаты.ДочернПФ.ПФДоч.ФлагРаспределения = Истина ";
Cегодня не все могут провести завтрашним числом. Вернее, не только лишь все - мало кто может это сделать.

temrmal

Цитата: TreeDogNight от 17 фев 2015, 05:58
Lexak и uanr81 правильно тебе подсказали! Используй запрос, который ты написал в шапке, но вместе И ипользуй ИЛИ.

"ВЫБРАТЬ
        |    Полуфабрикаты.ДочернПФ.(
        |        ПФДоч.ФлагРаспределения,
        |        ПФДоч.МоментОкончания
        |    ),
        |    Полуфабрикаты.РабочийЦентр,
        |    Полуфабрикаты.Наименование,
        |    Полуфабрикаты.МоментОкончания,
        |    Полуфабрикаты.ФлагРаспределения
        |ИЗ
        |    Справочник.Полуфабрикаты КАК Полуфабрикаты
        |ГДЕ
        |    Полуфабрикаты.ФлагРаспределения = Истина
        |    И Полуфабрикаты.МоментОкончания <= &ВремяН
        |    ИЛИ Полуфабрикаты.ДочернПФ.ПФДоч.МоментОкончания <= &ВремяН
        |    И Полуфабрикаты.ДочернПФ.ПФДоч.ФлагРаспределения = Истина ";


и что запрос делает?
тс написал, что если в тч есть хоть один пф, где условие не выполняется, то его не выводить. Условие на <= &ВремяН должно выполняться по каждой строке.

Игорь_M

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


Запрос.УстановитьПараметр("ВремяН", ДатаН);
Результат = Запрос.Выполнить();   
ВыборкаДетальныеЗаписи = Результат.Выбрать();

вот так все работает
еще раз огромное спасибо
Добавлено: 17 фев 2015, 15:39


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


Запрос.УстановитьПараметр("ВремяН", ДатаН);
Результат = Запрос.Выполнить();   
ВыборкаДетальныеЗаписи = Результат.Выбрать();


Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Подходит = Истина;
ТЧОбъединен = ВыборкаДетальныеЗаписи.Полуфабрикат.ОбъединенСПФ;
Для Каждого стр Из ТЧОбъединен Цикл
ТЧДочерн = стр.ОбъединенПФ.ДочернПФ;
Для Каждого строка Из ТЧДочерн Цикл
Если строка.ПФДоч.МоментОкончания > ВремяН Тогда
Подходит = Ложь;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Если Подходит Тогда
// записать ВыборкаДетальныеЗаписи.Полуфабрикат в конечный список
КонецЕсли;
КонецЦикла;

можно ли это засунуть в общий запрос. Попробовал по аналогии сделать - для меня проблемой вылезло как получить ссылку на Полуфабрикат когда выбираем ТЧ , ссылка которой уже не Полуфабрикат.Ссылка. Получается такая цепочка: Полуфабрикат - ТЧ ОъединенСПФ () - другой Полуфабрикат - ТЧ другого Полуфабриката ДочернПФ - третий Полуфабрикат и его реквизит МоментОкончания . Как связать "ТЧ другого Полуфабриката ДочернПФ" и "Полуфабрикат" ?

temrmal

Ну по аналогии.
Поместить Последний запрос во временную таблицу. Получились только те ПФ, которые нам нужны. Следующими пакетами добирайтесь до третий Полуфабрикат. Если вы делаете обращение к табличной части, то через .Ссылка добираетесь до ссылки этой табличной части.

Кстати, вот это лишнее, она сама удалится после выполнения запроса
"    |;
    |УНИЧТОЖИТЬ ТабПодготовки"

Игорь_M

Спасибо за отклик. Так ссылка той ТЧ уже на совсем другой ПФ? То есть ДочернПФ.ссылка - это ссылка на текущий ПФ,  а (грубо говоря) ОбъединенПФ.ПФ2.ДочернПФ. ПФ3.ссылка - ссылка на совсем другой ПФ?
Добавлено: 18 фев 2015, 20:33


--- выше написанное конечно глупость ---
дальше осознания этого факта дело не идет( не надо кидаться тапками - свое место в 1с я вполне осознаю

гуру прошу вашей помощи !!!
как реализовать в запросе цикл в цикле?
Подходит = Истина;
        ТЧОбъединен = ВыборкаДетальныеЗаписи.Полуфабрикат.ОбъединенСПФ;
        Для Каждого стр Из ТЧОбъединен Цикл
            ТЧДочерн = стр.ОбъединенПФ.ДочернПФ;
            Для Каждого строка Из ТЧДочерн Цикл
                Если строка.ПФДоч.МоментОкончания > ВремяН Тогда
                    Подходит = Ложь;
                КонецЕсли;
            КонецЦикла;
        КонецЦикла;
        Если Подходит Тогда
            // записать ВыборкаДетальныеЗаписи.Полуфабрикат в конечный список
        КонецЕсли;

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск