Версия для печати темы (https://pro1c.org.ua/index.php?s=d7ea858d61b3aec51dbcdcf67bd47fd0&showtopic=3160)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование управляемых форм 1С 8.2 _ Динамический список + сложный запрос

Автор: DartRomanius 14.03.11, 11:31

Кипение мозга породило:

Есть форма списка документов (динамический список).
Выводит документ одного типа - скажем документ "Заказ".
Есть несколько регистров сведений.

Вывод данных из регистров получается достаточно простым (рагистры не периодические).

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


У документа есть подчиненный документ. В подчиненном документе есть некий реквизит.
Как бы его вывести (этот реквизит)? Причем надо брать данные из последнего подчиненного документа.

Как-то так.

ЗЫ: Вариант с еще одним регистром сведений понятен, а вот если без него (регистра).

Автор: DartRomanius 15.03.11, 8:51

Хоть бы послали куда... 32000000.gif

Автор: Vofka 15.03.11, 8:53

DartRomanius, посмотрите стандартный механизм "Структура подчинённости".

Автор: Fynjy 15.03.11, 8:56

х

Автор: World1С 15.03.11, 9:07

Fynjy прав (+100), начните с документа который вам нужен, поставте условие

| ГДЕ <Документ>.ДокументОснование.Ссылка = <Документ заказ>
и выбирайте все что нужно.

Автор: pablo 15.03.11, 11:29

Есть вариант построить вложенный запрос вида

Выбрать ПЕРВЫЕ 1 
поля заказа
из Документ.Заказ как Заказ
где Заказ.Владелец=&Владелец
Упорядочить по Дата Убыв

Но это не самый лучший вариант, так как привязан к параметру

Автор: DartRomanius 15.03.11, 11:30

Код.

ВЫБРАТЬ
    ЗаказДокументы.Ссылка,
    ЗаказДокументы.ПометкаУдаления,
    ЗаказДокументы.Номер,
    ЗаказДокументы.Дата,
    ЗаказДокументы.Проведен,
    ЗаказДокументы.Примечание,
    ЗаказДокументы.Автор,
    ЗаказСтатус.Статус,
    ЗаказСтатусФлаг.Выполнен,
    ЗаказПервичка.Контрагент
ИЗ
    РегистрСведений.СтатусыЗаказов КАК ЗаказСтатус
        ЛЕВОЕ СОЕДИНЕНИЕ Документ.Заказ КАК ЗаказДокументы
            ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗаказФлаг КАК ЗаказСтатусФлаг
            ПО (ЗаказСтатусФлаг.Заказ = ЗаказДокументы.Ссылка)
            ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗаказПервичнаяИнформация КАК ЗаказПервичка
            ПО ЗаказДокументы.Ссылка = ЗаказПервичка.Заказ
        ПО ЗаказСтатус.Заказ = ЗаказДокументы.Ссылка


выводит 8 (ВОСЕМЬ) строк вместо одной, так как подчиненных документов 8.
мне нужно взять:
ПОСЛЕДНИЙ

Цитата(pablo @ 15.03.11, 12:29) http://pro1c.org.ua/index.php?act=findpost&pid=20165
Есть вариант построить вложенный запрос вида

Выбрать ПЕРВЫЕ 1 
поля заказа
из Документ.Заказ как Заказ
где Заказ.Владелец=&Владелец
Упорядочить по Дата Убыв

Но это не самый лучший вариант, так как привязан к параметру



Вроде как прошел следующий вариант:
ВЫБРАТЬ
    ЗаказДокументы.Ссылка,
    ЗаказДокументы.ПометкаУдаления,
    ЗаказДокументы.Номер,
    ЗаказДокументы.Дата,
    ЗаказДокументы.Проведен,
    ЗаказДокументы.Примечание,
    ЗаказДокументы.Автор,
    ЗаказСтатус.Статус,
    ЗаказСтатусФлаг.Выполнен
ИЗ
    РегистрСведений.СтатусыЗаказов КАК ЗаказСтатус
        ЛЕВОЕ СОЕДИНЕНИЕ Документ.Заказ КАК ЗаказДокументы
            ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗаказФлаг КАК ЗаказСтатусФлаг
            ПО (ЗаказСтатусФлаг.Заказ = ЗаказДокументы.Ссылка)
            ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ ПЕРВЫЕ 1
                ЗаказПервичка.Заказ КАК Заказ,
                ЗаказПервичка.Контрагент КАК Контрагент,
                ЗаказПервичка.Дата КАК Дата
            ИЗ
                Документ.ЗаказПервичнаяИнформация КАК ЗаказПервичка
            
            УПОРЯДОЧИТЬ ПО
                ЗаказПервичка.Дата УБЫВ) КАК ВложенныйЗапрос
            ПО (ВложенныйЗапрос.Заказ = ЗаказДокументы.Ссылка)
        ПО ЗаказСтатус.Заказ = ЗаказДокументы.Ссылка

Автор: DartRomanius 15.03.11, 11:50

Всем принимавшим участие большое спасибо.
Вроде получилось.

Автор: pablo 15.03.11, 11:57

Без параметра может быть пустое значение поля. Но как от параметра корректно избавиться - ума не приложу

Автор: DartRomanius 15.03.11, 12:03

Цитата(pablo @ 15.03.11, 12:57) *
Без параметра может быть пустое значение поля. Но как от параметра корректно избавиться - ума не приложу


Мдя. Номер к сожалению пока не прошел. Берет то последний но совсем последний... sad.gif

Мне вот любопытно, а как условие внутреннего запроса отослать на поле основного.

Автор: pablo 15.03.11, 12:31

единственная идея, которая в голове крутится: сделать пакетный запрос, подзапрос вынести в отдельный запрос и организовать в нем группировку по владельцу

Автор: DartRomanius 15.03.11, 13:48

Цитата(pablo @ 15.03.11, 13:31) *
единственная идея, которая в голове крутится: сделать пакетный запрос, подзапрос вынести в отдельный запрос и организовать в нем группировку по владельцу


Динамический список не поддерживает объединения

Автор: World1С 15.03.11, 15:12

Вот пример запроса который через документ ПКО получит любой реквезить документа Реализация или ссылку на документ.

ВЫБРАТЬ
    ПриходныйКассовыйОрдерРасшифровкаПлатежа.Ссылка КАК СсылкаПКО,
    РеализацияТоваровУслуг.Ссылка КАК СсылкаРТУ
ИЗ
    Документ.ПриходныйКассовыйОрдер.РасшифровкаПлатежа КАК ПриходныйКассовыйОрдерРасшифровкаПлатежа
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
        ПО ПриходныйКассовыйОрдерРасшифровкаПлатежа.Сделка = РеализацияТоваровУслуг.Ссылка
ГДЕ
    ПриходныйКассовыйОрдерРасшифровкаПлатежа.Ссылка.Дата <= &Дата


если это то.

Автор: DartRomanius 15.03.11, 15:25

Цитата(World1С @ 15.03.11, 16:12) *
Вот пример запроса который через документ ПКО получит любой реквезить документа Реализация или ссылку на документ.
ВЫБРАТЬ
    ПриходныйКассовыйОрдерРасшифровкаПлатежа.Ссылка КАК СсылкаПКО,
    РеализацияТоваровУслуг.Ссылка КАК СсылкаРТУ
ИЗ
    Документ.ПриходныйКассовыйОрдер.РасшифровкаПлатежа КАК ПриходныйКассовыйОрдерРасшифровкаПлатежа
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
        ПО ПриходныйКассовыйОрдерРасшифровкаПлатежа.Сделка = РеализацияТоваровУслуг.Ссылка
ГДЕ
    ПриходныйКассовыйОрдерРасшифровкаПлатежа.Ссылка.Дата <= &Дата


если это то.


В динамический список НЕЛЬЗЯ передать параметры!

Автор: DartRomanius 15.03.11, 15:26

*
В запрос динамического списка, нельзя передать параметры

Автор: pablo 15.03.11, 15:27

С регистром сведений будет проще и для написания, и для сервера. Потому как усложнять запрос -> нагружать сервер.

Автор: DartRomanius 15.03.11, 15:29

Цитата(pablo @ 15.03.11, 16:27) *
С регистром сведений будет проще и для написания, и для сервера. Потому как усложнять запрос -> нагружать сервер.


От похоже так и придется делать.

Автор: World1С 15.03.11, 16:36

Уберите параметр Дата. В запросе мне пришлось его использовать для того чтобы ограничить выборку.

Автор: DartRomanius 16.03.11, 8:33

Цитата(World1С @ 15.03.11, 17:36) *
Уберите параметр Дата. В запросе мне пришлось его использовать для того чтобы ограничить выборку.


Дык, не в дате дело то.

Если я использую только регистры сведений (в которых кстати по 1-й записи, ссылающихся на документ) то все нормально.
А вот если, еще использовать Н-ую таблицу в которой более 1-й ссылки, то выходит "партак".

Так как выборка происходит из 2-х (или более, не важно) таблиц - то и количество строк выборки больше.
На примере:
-Таблица 1
- заказ 1
- заказ 2
- заказ 3
- Таблица 2
- подчиненый документ 1, ссылка на заказ 1
- подчиненый документ 2, ссылка на заказ 1
- подчиненый документ 3, ссылка на заказ 2
- подчиненый документ 4, ссылка на заказ 1
- подчиненый документ 5, ссылка на заказ 3

Имеем выборку из пяти записей
- Выборка
- строка 1, заказ 1, подчиненый документ 1
- строка 2, заказ 1, подчиненый документ 2
- строка 3, заказ 1, подчиненый документ 4
- строка 4, заказ 2, подчиненый документ 3
- строка 5, заказ 3, подчиненый документ 5

А надо получить
- Выборка
- строка 1, заказ 1, подчиненый документ 4
- строка 2, заказ 2, подчиненый документ 3
- строка 3, заказ 3, подчиненый документ 5


Вот так.

ЗЫ: Повторюсь, параметры в запрос динамического списка не передаются. Во всяком случае для формы списка документов.
- Выборк

Автор: World1С 16.03.11, 11:51

А группировать по заказу разве нельзя? Сделайте группировку по ЗаказСсылка.

Автор: DartRomanius 16.03.11, 16:52

Цитата(World1С @ 16.03.11, 12:51) *
А группировать по заказу разве нельзя? Сделайте группировку по ЗаказСсылка.


И?

Автор: World1С 17.03.11, 9:05

Цитата
И?


Запрос сгруппирует строки по заказу.

Автор: DartRomanius 17.03.11, 9:25

Цитата(World1С @ 17.03.11, 10:05) *
Запрос сгруппирует строки по заказу.


А куда мне лишние строки девать? smile.gif

И главное как? 19000000.gif

Короче смысл в следующем.

Даже если взять 1 (одну) таблицу. Мне нужно сделать приблизительно следующее:
Сгруппировать по полю основание, а поле (поля) которые меняются фактически суммировать.
Но вот значение надо не складывать или еще что там можно сделать, а получать последнее значение при одном значении поля группировки, в моем случае Заказ.Ссылка

Автор: pablo 20.04.11, 13:34

Когда возникла нужда использовать параметр, я таки докопался. laugh.gif
Описываем динамический список произвольным запросом, в тексте которого используем параметры. Затем в коде задаем параметры значением следующим образом:

Список.Параметры.УстановитьЗначениеПараметра("ИмяПараметра",ЗначениеПараметра);

Автор: DartRomanius 20.04.11, 13:47

Цитата(pablo @ 20.04.11, 14:34) http://pro1c.org.ua/index.php?act=findpost&pid=22220

Но как описано выше, проблема осталась:
Без использования регистра сведений пока не получается.

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua