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

Сложный запрос

Автор Nargal777, 09 ноя 2024, 18:34

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

Nargal777

Всем привет. Народ помогите разобраться с запросом... Я на знаю сложный он или нет, но для меня на данный момент, если в запросе есть соединения и объединения, очень сложный...

Вообще мне в БГУ 2.0 необходимо в запросе получить данные с 3 разны источников (Справочник "ФизическиеЛица", регистр "ДокументыФизическихЛиц" и "ФИОФизическихЛиц".

Сам запрос:

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

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

СГРУППИРОВАТЬ ПО
Компенсация.ФизЛицо.ДатаРождения,
Компенсация.Ребенок,
ДокументыФизическихЛицСрезПоследних.Номер,
ФИОФизическихЛицСрезПоследних.Отчество,
ФИОФизическихЛицСрезПоследних.Имя,
Компенсация.ФизЛицо.Пол,
ДокументыФизическихЛицСрезПоследних.ВидДокумента,
ФИОФизическихЛицСрезПоследних.Фамилия,
ДокументыФизическихЛицСрезПоследних.ДатаВыдачи,
ДокументыФизическихЛицСрезПоследних.КемВыдан,
ДокументыФизическихЛицСрезПоследних.Серия,
Компенсация.Родитель,
Компенсация.ФизЛицо.СтраховойНомерПФР

УПОРЯДОЧИТЬ ПО
Родитель
АВТОУПОРЯДОЧИВАНИЕ

Сперва получаю Родитель, ребенка и сумму, потом помещаю эти данные во временную таблицу. После этого я получаю все необходимы данные по Родитель. На этом этапе все работает прекрасно. Запрос выполняется быстро и все необходимые данные получаются и добавляются в табличную часть.

Каким образом получить данные по ребёнку (ФИО, пол, дата рождения, Документ (Свидетельство или паспорт), серия, номер, дата выдачи и кем выдан).

Если так же поместить полученные данные в ВТ и таким же образом получить данные ребенка у меня получается 99999 строк и программа зависает...

Может я изначально не так данные получаю

Максим75

Nargal777, группируйте прямо сразу временную таблицу, вот в ней и сворачивайте по родителю и ребенку сумму оплаты за период.
а так, запрос как запрос, ничего сложного.
а где соединение с таблицей Ребенка, пока не видно, что там и как.

Nargal

Вот по ребенку я и мне могу понять как получить, я пытался опять все поместить во временную таблицу, и повторить так же как с родителем) но у меня заполняются 99999 строк и вылетает ошибка... я не допонимаю как ещё данные ребенка получить.

Максим75

Nargal, ну покажите, как Вы по ребенку хотите получить.
мы же не знаем, где что по ребенку хранится.

Nargal

Максим75 здравствуйте! Данные по ребенку получаются точно так же, как и по родителю. У справочника "Дети" есть ссылка на справочник "Контрагенты", а дальше все точно так же как и по родителю. Кажется, я разобрался, я в последнем этапе не указывал связи между временными таблицами и в результате у меня получалось кучу строк. Как я уже сказал для мне пока что достаточно сложная тема со связями если их больше 2...

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

СГРУППИРОВАТЬ ПО
ЖурналУчетаКРП.Плательщик,
ЖурналУчетаКРП.Ребенок,
ВЫРАЗИТЬ(ЖурналУчетаКРП.Плательщик.ЮридическоеФизическоеЛицо КАК Справочник.ФизическиеЛица),
ВЫРАЗИТЬ(ЖурналУчетаКРП.Ребенок.Контрагент.ЮридическоеФизическоеЛицо КАК Справочник.ФизическиеЛица)
;

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

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

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

УПОРЯДОЧИТЬ ПО
Родитель,
Ребенок
АВТОУПОРЯДОЧИВАНИЕ

Видимо проблема была в этом куске кода, я не делал связи на последнем этапе
ИЗ
Компенсация КАК Компенсация
ЛЕВОЕ СОЕДИНЕНИЕ ДанныеРодителей КАК ДанныеРодителей
ПО Компенсация.ФизЛицоРодитель = ДанныеРодителей.ФизическоеЛицо
ЛЕВОЕ СОЕДИНЕНИЕ ДанныеРебенок КАК ДанныеРебенок
ПО Компенсация.ФизЛицоРебенок = ДанныеРебенок.ФизическоеЛицо

Afinogen

 B) вам в принципе тут не нужны были эти временные таблицы,  можно было все в одном запросе сделать,  я ж так понимаю суть задачи состояла в том что бы найти все связки компенсаций и затем к ним найти актуальные фио родителей и детей?

Nargal

Afinogen, Именно.

1) Нужно за указанный период получить все начисления (по родителю и ребенку).
2) ПОтом получить их данные. ФИО, пол, дату рождения, снилс, Документ (серия, номер, дата выдачи) и все это в табличную часть запихнуть. С ТЧ я умею работать. Беда с большими запросами...

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

Afinogen

да тут простой запрос же
в первом пакете добавьте два левых соединения с регистром и все

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


ГДЕ
    ЖурналУчетаКРП.НачалоПериода >= &НачалоПериода
    И ЖурналУчетаКРП.КонецПериода <= &КонецПериода

СГРУППИРОВАТЬ ПО
    ЖурналУчетаКРП.Плательщик,
    ЖурналУчетаКРП.Ребенок,
    ВЫРАЗИТЬ(ЖурналУчетаКРП.Плательщик.ЮридическоеФизическоеЛицо КАК Справочник.ФизическиеЛица),
    ВЫРАЗИТЬ(ЖурналУчетаКРП.Ребенок.Контрагент.ЮридическоеФизическоеЛицо КАК Справочник.ФизическиеЛица)
;


Afinogen

ну если хотите оставьте первый пакет где вы компесацию  делаете и потом два левых


Afinogen

 B) вообще если на то  пошло и вас смущает быстродействие то проработайте суть вопроса, меня лично  смущает условие в первом пакете, насколько я понимаю Родитель будет всегда и всегда у него будет запись в регистре сведений ФИО физ лиц?

если я прав то я бы для начала делал выборку родителей из фио и затем по ним делал отбор компенсации

Теги: Запрос БГУ 

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

Рейтинг@Mail.ru

Поиск