Имя: Пароль:
1C
1С v8
Помогите с запросом
0 Новичок_1С
 
06.04.21
08:07
Добрый день.
Подскажите пожалуйста как сделать запрос. Есть две таблицы, первая это заявки контрагентов, вторая акты исполнения заявок. Упрощу структуру таблицы, для наглядности. В обоих таблицах два поля: Контрагент и дата. На выходе запроса необходимо иметь три колонки: Контрагент, дата заявка, дата акта. Причем Дата акта должна быть старше даты заявки, но не старше следующей даты заявки.
Пример:
Заявки
а   01.01.20
а   03.02.20
б   05.02.20

акты
а   01.01.20
а   02.01.20
а   04.01.20
б   03.02.20
б   06.02.20

Запрос
а   01.01.20   02.01.20
а   03.02.20   04.01.20
б   05.02.20   06.02.20

Пробовал вложенный запрос с условием где заявка.Дата > ВложенныйЗапрос.акты.дата   Так не получается, выводятся все даты актов.
1 Новичок_1С
 
06.04.21
08:41
Уточню. Запрос для СКД, может быть можно средствами СКД сделать что-то ?
2 Vadim_37
 
06.04.21
08:45
а   03.02.20   04.01.20 - что-то по условию задачи не сходится
3 Vadim_37
 
06.04.21
08:46
а акт от 02.01 от какой заявки?
4 JeHer
 
06.04.21
08:56
Не проще связать Акт с Заявкой?
5 kobzon2
 
06.04.21
09:02
Реально, лучше поменять систему и создавать акты на основании заявки, чем городить вот это вот всё.
6 Новичок_1С
 
06.04.21
09:15
(2) (3) (4) Дело в том, что не всегда акт делается на основании заявки. Акт может быть создан по другим причинам.
7 Dmitrii
 
гуру
06.04.21
09:15
Сильно подозреваю, что речь идёт о выполнении тестового задания.
Для реально работающей системы подобная постановка задачи - бред и ахинея. Слишком много неоднозначностей появляется как только между двумя заявками вдруг встретится несколько актов или наоборот - несколько заявок подряд и только один акт после них (дата акта > даты всех заявок).
8 Dmitrii
 
гуру
06.04.21
09:18
(6) >> Акт может быть создан по другим причинам.

И что? Либо этот акт относится к какой-либо из заявок, либо нет.
Если это неизвестно в момент создания акта, то кто-то должен указать эту связь тогда, когда информация станет известной.
В противном случае вы получите кашу из данных, где сопоставление актов заявкам основано на ложных предпосылках - см (7).
9 arsik
 
гуру
06.04.21
09:18
Тебе просто таблицу
а   01.01.20
а   03.02.20
б   05.02.20
Нужно превратить в
а   01.01.20 - 02.02.20
а   03.02.20 - 01.01.99
б   05.02.20 - 01.01.99
10 Dmitrii
 
гуру
06.04.21
09:24
(6) >> Акт может быть создан по другим причинам.

Кстати если в системе есть акты, вообще не относящиеся к заявкам, то отчет тем более превращается в ахинею, т.к. он не знает - какие акты надо полностью исключить, как выполненные вне заявок.
11 d4rkmesa
 
06.04.21
09:30
(9) а   03.02.20 - 01.01.99
б   05.02.20 - 01.01.99

А почему правая граница именно 01.01.99?
12 fisher
 
06.04.21
09:30
Что-то типа такого:
ВЫБРАТЬ
    ПериодыЗаявок.Контрагент,
    ПериодыЗаявок.ДатаЗаявки,
    ЕСТЬNULL(Акты.Дата, ДАТАВРЕМЯ(1,1,1)) КАК ДатаАкта
ИЗ
    (ВЫБРАТЬ
        З1.Контрагент,
        З1.Дата КАК ДатаЗаявки,
        МИНИМУМ(З2.Дата) КАК ДатаСледующейЗаявки
    ИЗ
        Заявки КАК З1
        ЛЕВОЕ СОЕДИНЕНИЕ Заявки КАК З2
        ПО З1.Контрагент = З2.Контрагент И З1.Дата < З2.Дата
    СГРУППИРОВАТЬ ПО
        З1.Контрагент, З1.Дата) КАК ПериодыЗаявок
    ЛЕВОЕ СОЕДИНЕНИЕ Акты
    ПО ПериодыЗаявок.Контрагент = Акты.Контрагент И Акты.Дата >= ПериодыЗаявок.ДатаЗаявки И Акты.Дата < ПериодыЗаявок.ДатаСледующейЗаявки
13 fisher
 
06.04.21
09:38
(12) + Нужно еще поправить для случая последней заявки. Будет домашним заданием.
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс