Имеем задачу:
Выбрать движения документа по регистру за период с получением реквизита ТЧ соответствующего движению.
(Регистр с быстрой обработкой движений)
На sql я эффективно напишу так:
select
right(Рег.date_time_iddoc,9) as [Док $Документ.Накладная],
Рег.lineno_ as НомерСтроки,
$Док.Реквизит as Реквизит
from $Регистр.Остатки as Рег (nolock)
inner join $ДокументСтроки.Накладная as Док (nolock) on Док.iddoc = right(Рег.date_time_iddoc,9) and Док.lineno_ = Рег.lineno_
where Рег.date_time_iddoc between :НачДата and :КонДата~
order by Рег.date_time_iddoc, Рег.lineno_, Рег.actno
На dbf я наверно написал бы так:
select
Рег.iddoc as [Док $Документ.Накладная],
str(Рег.lineno_,4) as НомерСтроки,
$Док.Реквизит as Реквизит
from $Регистр.Остатки as Рег (nolock)
inner join $ДокументСтроки.Накладная as Док (nolock) on Док.iddoc = Рег.iddoc and str(Док.lineno_,4) = str(Рег.lineno_,4)
where DTOS(Рег.date)+Рег.time+Рег.iddoc between :НачДата and :КонДата~
order by DTOS(Рег.date)+Рег.time+Рег.iddoc, str(Рег.lineno_,4), str(Рег.actno,6)
Получаем гипотетический универсальный запрос такого вида:
select
Рег.$ИДДокИзПозиции as [Док $Документ.Накладная],
Рег.$НомерСтроки as НомерСтроки,
$Док.Реквизит as Реквизит
from $Регистр.Остатки as Рег ($nolock)
inner join $ДокументСтроки.Накладная as Док (nolock) on Док.iddoc = Рег.$ИДДокИзПозиции and Док.$НомерСтроки = Рег.$НомерСтроки
where Рег.$Позиция between :НачДата and :КонДата~
order by Рег.$Позиция, Рег.$НомерСтроки, Рег.$НомерДвижения
,где
Т.$ИДДокИзПозиции - right(T.date_time_iddoc,9) / T.iddoc
Т.$НомерСтроки - T.lineno_ / str(T.lineno_,4)
Т.$Позиция - T.date_time_iddoc / DTOS(T.date)+T.time+T.iddoc
Т.$НомерДвижения - T.actno / str(T.actno,6)
Не кисло. С учетом того, что Т.$Метаимя нужно преобразовать в Т.Поле1 а то и в f(T.Поле1, T.Поле2 ...)
Можно, например, применить такую запись $Метаимя(Т), но не понадобиться потом и $Метаимя(Т, ...). Да и что будет с читаемостью запроса.
В общем, в очередной раз могу только пожелать удачи