Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Динамический список + сложный запрос
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 8.2 > Программирование управляемых форм 1С 8.2
DartRomanius
Кипение мозга породило:

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

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

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


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

Как-то так.

ЗЫ: Вариант с еще одним регистром сведений понятен, а вот если без него (регистра).
DartRomanius
Хоть бы послали куда... 32000000.gif
Vofka
DartRomanius, посмотрите стандартный механизм "Структура подчинённости".
Fynjy
х
World1С
Fynjy прав (+100), начните с документа который вам нужен, поставте условие
| ГДЕ <Документ>.ДокументОснование.Ссылка = <Документ заказ>
и выбирайте все что нужно.
pablo
Есть вариант построить вложенный запрос вида

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

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

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


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

Цитата(pablo @ 15.03.11, 12:29) необходимо зарегистрироваться для просмотра ссылки
Есть вариант построить вложенный запрос вида

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

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


Внешние параметры возможности использовать нету. К сожалению не подходит.

Цитата(pablo @ 15.03.11, 12:29) необходимо зарегистрироваться для просмотра ссылки
Есть вариант построить вложенный запрос вида

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

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



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


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

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


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


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


если это то.


В динамический список НЕЛЬЗЯ передать параметры!
DartRomanius
*
В запрос динамического списка, нельзя передать параметры
pablo
С регистром сведений будет проще и для написания, и для сервера. Потому как усложнять запрос -> нагружать сервер.
DartRomanius
Цитата(pablo @ 15.03.11, 16:27) необходимо зарегистрироваться для просмотра ссылки
С регистром сведений будет проще и для написания, и для сервера. Потому как усложнять запрос -> нагружать сервер.


От похоже так и придется делать.
World1С
Уберите параметр Дата. В запросе мне пришлось его использовать для того чтобы ограничить выборку.
DartRomanius
Цитата(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С
А группировать по заказу разве нельзя? Сделайте группировку по ЗаказСсылка.
DartRomanius
Цитата(World1С @ 16.03.11, 12:51) необходимо зарегистрироваться для просмотра ссылки
А группировать по заказу разве нельзя? Сделайте группировку по ЗаказСсылка.


И?
World1С
Цитата
И?


Запрос сгруппирует строки по заказу.
DartRomanius
Цитата(World1С @ 17.03.11, 10:05) необходимо зарегистрироваться для просмотра ссылки
Запрос сгруппирует строки по заказу.


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

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

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

Даже если взять 1 (одну) таблицу. Мне нужно сделать приблизительно следующее:
Сгруппировать по полю основание, а поле (поля) которые меняются фактически суммировать.
Но вот значение надо не складывать или еще что там можно сделать, а получать последнее значение при одном значении поля группировки, в моем случае Заказ.Ссылка
pablo
Когда возникла нужда использовать параметр, я таки докопался. laugh.gif
Описываем динамический список произвольным запросом, в тексте которого используем параметры. Затем в коде задаем параметры значением следующим образом:
Список.Параметры.УстановитьЗначениеПараметра("ИмяПараметра",ЗначениеПараметра);
DartRomanius
Цитата(pablo @ 20.04.11, 14:34) необходимо зарегистрироваться для просмотра ссылки
Когда возникла нужда использовать параметр, я таки докопался. laugh.gif
Описываем динамический список произвольным запросом, в тексте которого используем параметры. Затем в коде задаем параметры значением следующим образом:
Список.Параметры.УстановитьЗначениеПараметра("ИмяПараметра",ЗначениеПараметра);


С параметрами не проблема.
Нашел здесь в базе знаний пример как это сделать.
необходимо зарегистрироваться для просмотра ссылки

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