Форум программистов, компьютерный форум, киберфорум
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/9: Рейтинг темы: голосов - 9, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 08.04.2013
Сообщений: 38
1

Отчет по простроченным долгам

24.10.2013, 22:24. Показов 1776. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Платформа 8.2.
Конфигурация своя.
Режим - неуправляемый.

Мною был создан отчет по простроченным долгам на СКД. Запрос работает и выдает правильный результат, но он получился крайне странным и запутанным. Прошу помочь мне идеями по оптимизации и упрощению данного запроса. Буду очень благодарна за помощь.

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

1. (Дата ЗаказПокупателя < Текущая Дата - &КолДней) и (в базе нет Документа ОплатаПокупателя, ссылающегося на этот ЗаказПокупателя) и (в базе нет Документа ВозвратТовараОтПокупателя, ссылающегося на этот ЗаказПокупателя)

или

2. (Дата ЗаказПокупателя < Текущая Дата - &КолДней) и (в базе есть Документ ОплатаПокупателя, ссылающегося на этот ЗаказПокупателя, но сумма ОплатыПокупателя < суммы ЗаказаПокупателя) и (в базе нет Документа ВозвратТовараОтПокупателя, ссылающегося на этот ЗаказПокупателя)

или

3. (Дата ЗаказПокупателя < Текущая Дата - &КолДней) и (в базе нет Документа ОплатаПокупателя, ссылающегося на этот ЗаказПокупателя) и (в базе есть Документ ВозвратТовараОтПокупателя, ссылающийся на этот ЗаказПокупателя, но сумма ВозвратаТовараОтПокупателя < суммы ЗаказаПокупателя)

или

4. (Дата ЗаказПокупателя < Текущая Дата - &КолДней) и (в базе есть Документ ОплатаПокупателя, ссылающегося на этот ЗаказПокупателя, но сумма ОплатыПокупателя < суммы ЗаказаПокупателя) и (в базе есть Документ ВозвратТовараОтПокупателя, ссылающийся на этот ЗаказПокупателя, но сумма ВозвратаТовараОтПокупателя < суммы ЗаказаПокупателя) и (сумма ОплатыПокупателя + сумма ВозвратаТовараОтПокупателя < суммы ЗаказаПокупателя)

Вот сам текст запроса.

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
ВЫБРАТЬ
    ВсеЗаказы.Контрагент,
    СУММА(ВсеЗаказы.СуммаЗаказа) КАК СуммаЗаказа
ИЗ
    (ВЫБРАТЬ
        ЗаказПокупателя.Контрагент КАК Контрагент,
        ЗаказПокупателя.Дата КАК Дата,
        СУММА(ЗаказПокупателяТовары.Сумма) КАК СуммаЗаказа,
        ОплатаПокупателя.ОплачиваемыйЗаказ КАК ОплачиваемыйЗаказ,
        ВозвратТовараОтПокупателя.НаОсновании КАК НаОсновании
    ИЗ
        Документ.ЗаказПокупателя.Товары КАК ЗаказПокупателяТовары
            ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗаказПокупателя КАК ЗаказПокупателя
                ЛЕВОЕ СОЕДИНЕНИЕ Документ.ОплатаПокупателя КАК ОплатаПокупателя
                ПО ЗаказПокупателя.Ссылка = ОплатаПокупателя.ОплачиваемыйЗаказ
                ЛЕВОЕ СОЕДИНЕНИЕ Документ.ВозвратТовараОтПокупателя КАК ВозвратТовараОтПокупателя
                ПО ЗаказПокупателя.Ссылка = ВозвратТовараОтПокупателя.НаОсновании
            ПО ЗаказПокупателяТовары.Ссылка = ЗаказПокупателя.Ссылка
    ГДЕ
        ЗаказПокупателя.Дата < ДОБАВИТЬКДАТЕ(&Период, ДЕНЬ, -&КолДней)
    
    СГРУППИРОВАТЬ ПО
        ЗаказПокупателя.Контрагент,
        ЗаказПокупателя.Дата,
        ОплатаПокупателя.ОплачиваемыйЗаказ,
        ВозвратТовараОтПокупателя.НаОсновании) КАК ВсеЗаказы
ГДЕ
    ВсеЗаказы.ОплачиваемыйЗаказ ЕСТЬ NULL 
    И ВсеЗаказы.НаОсновании ЕСТЬ NULL 
 
СГРУППИРОВАТЬ ПО
    ВсеЗаказы.Контрагент,
    ВсеЗаказы.ОплачиваемыйЗаказ,
    ВсеЗаказы.Дата
 
ОБЪЕДИНИТЬ ВСЕ
 
ВЫБРАТЬ
    СуммаПоОплатамИВозвратам.Контрагент,
    ЕСТЬNULL(СуммаПоОплатамИВозвратам.СуммаЗака - СуммаПоОплатамИВозвратам.СуммаПроплаты, 0)
ИЗ
    (ВЫБРАТЬ
        ОбщаяНедоплата.Контрагент КАК Контрагент,
        ОбщаяНедоплата.Ссылка КАК Ссылка,
        ОбщаяНедоплата.СуммаЗака КАК СуммаЗака,
        СУММА(ОбщаяНедоплата.СуммаПроплаты) КАК СуммаПроплаты
    ИЗ
        (ВЫБРАТЬ
            ВсеОплаченныеЗаказы.Контрагент КАК Контрагент,
            ВсеОплаченныеЗаказы.СуммаЗака КАК СуммаЗака,
            ВсеОплаченныеЗаказы.СуммаВозврата КАК СуммаПроплаты,
            ВсеОплаченныеЗаказы.Ссылка КАК Ссылка
        ИЗ
            (ВЫБРАТЬ
                ЗаказПокупателя.Контрагент КАК Контрагент,
                ЗаказПокупателя.Дата КАК Дата,
                ЗаказПокупателяТовары.Сумма КАК СуммаЗака,
                СУММА(ВозвратТовараОтПокупателяТовары.Сумма) КАК СуммаВозврата,
                ЗаказПокупателя.Ссылка КАК Ссылка
            ИЗ
                Документ.ЗаказПокупателя.Товары КАК ЗаказПокупателяТовары
                    ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗаказПокупателя КАК ЗаказПокупателя
                        ЛЕВОЕ СОЕДИНЕНИЕ Документ.ВозвратТовараОтПокупателя.Товары КАК ВозвратТовараОтПокупателяТовары
                        ПО ЗаказПокупателя.Ссылка = ВозвратТовараОтПокупателяТовары.Ссылка.НаОсновании
                    ПО ЗаказПокупателяТовары.Ссылка = ЗаказПокупателя.Ссылка
            ГДЕ
                ВозвратТовараОтПокупателяТовары.Ссылка.НаОсновании <> ЗНАЧЕНИЕ(Документ.ЗаказПокупателя.ПустаяСсылка)
                И ЗаказПокупателя.Дата < ДОБАВИТЬКДАТЕ(&Период, ДЕНЬ, -&КолДней)
            
            СГРУППИРОВАТЬ ПО
                ЗаказПокупателя.Контрагент,
                ЗаказПокупателя.Дата,
                ЗаказПокупателяТовары.Сумма,
                ЗаказПокупателя.Ссылка) КАК ВсеОплаченныеЗаказы
        ГДЕ
            ВсеОплаченныеЗаказы.СуммаЗака <> ВсеОплаченныеЗаказы.СуммаВозврата
        
        СГРУППИРОВАТЬ ПО
            ВсеОплаченныеЗаказы.Контрагент,
            ВсеОплаченныеЗаказы.СуммаЗака,
            ВсеОплаченныеЗаказы.СуммаВозврата,
            ВсеОплаченныеЗаказы.Ссылка
        
        ОБЪЕДИНИТЬ ВСЕ
        
        ВЫБРАТЬ
            ВсеОплаченныеЗаказы.Контрагент,
            ВсеОплаченныеЗаказы.СуммаЗака,
            ВсеОплаченныеЗаказы.СуммаОплаты,
            ВсеОплаченныеЗаказы.Ссылка
        ИЗ
            (ВЫБРАТЬ
                ЗаказПокупателя.Контрагент КАК Контрагент,
                ЗаказПокупателя.Дата КАК Дата,
                ЗаказПокупателяТовары.Сумма КАК СуммаЗака,
                СУММА(ОплатаПокупателя.Сумма) КАК СуммаОплаты,
                ЗаказПокупателя.Ссылка КАК Ссылка
            ИЗ
                Документ.ЗаказПокупателя.Товары КАК ЗаказПокупателяТовары
                    ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗаказПокупателя КАК ЗаказПокупателя
                        ЛЕВОЕ СОЕДИНЕНИЕ Документ.ОплатаПокупателя КАК ОплатаПокупателя
                        ПО ЗаказПокупателя.Ссылка = ОплатаПокупателя.ОплачиваемыйЗаказ
                    ПО ЗаказПокупателяТовары.Ссылка = ЗаказПокупателя.Ссылка
            ГДЕ
                ОплатаПокупателя.ОплачиваемыйЗаказ <> ЗНАЧЕНИЕ(Документ.ЗаказПокупателя.ПустаяСсылка)
                И ЗаказПокупателя.Дата < ДОБАВИТЬКДАТЕ(&Период, ДЕНЬ, -&КолДней)
            
            СГРУППИРОВАТЬ ПО
                ЗаказПокупателя.Контрагент,
                ЗаказПокупателя.Дата,
                ЗаказПокупателяТовары.Сумма,
                ЗаказПокупателя.Ссылка) КАК ВсеОплаченныеЗаказы
        ГДЕ
            ВсеОплаченныеЗаказы.СуммаЗака <> ВсеОплаченныеЗаказы.СуммаОплаты
        
        СГРУППИРОВАТЬ ПО
            ВсеОплаченныеЗаказы.Контрагент,
            ВсеОплаченныеЗаказы.СуммаЗака,
            ВсеОплаченныеЗаказы.СуммаОплаты,
            ВсеОплаченныеЗаказы.Ссылка) КАК ОбщаяНедоплата
    
    СГРУППИРОВАТЬ ПО
        ОбщаяНедоплата.Контрагент,
        ОбщаяНедоплата.Ссылка,
        ОбщаяНедоплата.СуммаЗака) КАК СуммаПоОплатамИВозвратам
ГДЕ
    СуммаПоОплатамИВозвратам.СуммаЗака <> СуммаПоОплатамИВозвратам.СуммаПроплаты
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.10.2013, 22:24
Ответы с готовыми решениями:

Отфильтровать базу пользователей по оплаченным долгам
есть база которую нужно отфильтровать. нужно показать всех пользователей за год и отфильтровать в...

Отчет СКД. Вывод нескольких таблиц в отчет из разных запросов.
Привет, коллеги! Возникла необходимость в одном отчете видеть 2 таблички: одну по продажам, другую...

Отчет РАУЗ переделать в отчет с партионным учетом
Возможно ли типовой отчет построенный на РАУЗ переделать так, чтобы он работал в партионном учете?...

Отчет в C#
Доборого времени суток. Есть Таблица Диагностика в ACCES . в Win FORM надо сделать отчет по этой...

11
900 / 877 / 8
Регистрация: 15.03.2012
Сообщений: 2,680
25.10.2013, 09:08 2
Цитата Сообщение от zironka Посмотреть сообщение
Платформа 8.2.
Конфигурация своя.
Режим - неуправляемый.
Собирать данные по документам не правильно. Что регистров для учета взаиморасчетов в вашей конфигурации не предусмотрено?
0
0 / 0 / 0
Регистрация: 08.04.2013
Сообщений: 38
25.10.2013, 12:14  [ТС] 3
Данные брала из документов, а не из регистров, так как мне была необходима дата каждого заказ.
Также читала в интернете, что в 8.2 разница в корости выполнения запросов по регистам и по документам небольшая. Поэтому решила не создавать лишний громоздкий регистр куда писалась бы три разных по стуктуре документа. Тем более что ни общие Обороты ни Остатки меня по ним не интересуют.
0
286 / 186 / 18
Регистрация: 20.02.2012
Сообщений: 925
25.10.2013, 12:18 4
Цитата Сообщение от zironka Посмотреть сообщение
Данные брала из документов, а не из регистров, так как мне была необходима дата каждого заказ.
Также читала в интернете, что в 8.2 разница в корости выполнения запросов по регистам и по документам небольшая. Поэтому решила не создавать лишний громоздкий регистр куда писалась бы три разных по стуктуре документа. Тем более что ни общие Обороты ни Остатки меня по ним не интересуют.
а зря
0
900 / 877 / 8
Регистрация: 15.03.2012
Сообщений: 2,680
25.10.2013, 12:20 5
Цитата Сообщение от zironka Посмотреть сообщение
Данные брала из документов, а не из регистров, так как мне была необходима дата каждого заказ.
Также читала в интернете, что в 8.2 разница в корости выполнения запросов по регистам и по документам небольшая, поэтому решила не создавать лишний громоздкий регистр куда писалась бы и дата создания документа Заказ и ссылки на заказ из оплат и возвратов.
Для решения вашей задачи достаточно регистра остатков с одним измерением Заказ.

Цитата Сообщение от zironka Посмотреть сообщение
Также читала в интернете, что в 8.2 разница в корости выполнения запросов по регистам и по документам небольшая
А можно ссылку на эту несусветную чушь?
Подумайте сами например у Вас в системе 1000000 заказов и из них 5 неоплаченных. Ваш запрос будет перебирать весь миллион записей, а запрос к таблице остатков просто получит 5 записей и все.

В вашем случае - это ошибка проектирования. Делайте регистр.
1
0 / 0 / 0
Регистрация: 08.04.2013
Сообщений: 38
25.10.2013, 12:26  [ТС] 6
Регистр взаиморасчетов существует, но из него получаю общие Остатки и Обороты по взаиморассчетам с контрагентами.

SonicQ и Fenomen, подскажите, пожалуйста, как из регистра взаиморассчетов (измерение - контрагент, ресурс - сумма), в котором три регистратора (ЗаказПокупателя, ОплатаПокупателя и ВозвратТовараОтПокупателя) получить простроченный долг а не весь, если учесть, что оплата производиться по факту и может иметь отстрочку во времени?
0
900 / 877 / 8
Регистрация: 15.03.2012
Сообщений: 2,680
25.10.2013, 12:36 7
Цитата Сообщение от zironka Посмотреть сообщение
как из регистра взаиморассчетов (измерение - контрагент, ресурс - сумма),
Для оптимальности нужно измерение Заказ.

Выбираете все неоплаченные заказы, и накладываете свое условие
Дата ЗаказПокупателя < Текущая Дата - &КолДней
1
286 / 186 / 18
Регистрация: 20.02.2012
Сообщений: 925
25.10.2013, 12:47 8
Цитата Сообщение от zironka Посмотреть сообщение
получить простроченный долг а не весь, если учесть, что оплата производиться по факту и может иметь отстрочку во времени?
решение данного вопрос на прямую зависит от построенной логики ведения учета. Например у меня, чтобы получить задолженность используется такой запрос

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
ВЫБРАТЬ
    ХозрасчетныйОборотыДтКт.СчетДт,
    ХозрасчетныйОборотыДтКт.СчетКт,
    ХозрасчетныйОборотыДтКт.СубконтоДт1 КАК Статья,
    ВЫБОР
        КОГДА ХозрасчетныйОборотыДтКт.СубконтоКт2 ССЫЛКА Справочник.ДоговорыКонтрагентов
            ТОГДА ВЫРАЗИТЬ(ХозрасчетныйОборотыДтКт.СубконтоКт2 КАК Справочник.ДоговорыКонтрагентов).Договор
    КОНЕЦ КАК Договор,
    ХозрасчетныйОборотыДтКт.СубконтоКт1 КАК Контрагент,
    ХозрасчетныйОборотыДтКт.Организация,
    ЕСТЬNULL(ХозрасчетныйОборотыДтКт.СуммаОборот, 0) КАК СуммаОборот
ПОМЕСТИТЬ Выборка
ИЗ
    РегистрБухгалтерии.Хозрасчетный.ОборотыДтКт(
            &ДатаНач,
            &ДатаКон,
            Период,
            СчетДт В (&СчетДт),
            ,
            СчетКт В (&СчетКт),
            ,
            СубконтоКт2 В
                (ВЫБРАТЬ
                    ХозрасчетныйОборотыДтКт.СубконтоДт2
                ИЗ
                    РегистрБухгалтерии.Хозрасчетный.ОборотыДтКт(&ДатаНач, &ДатаКон, , СчетДт В (&СчетДтблабла), , СчетКт В (&СчетКтблблабл), ) КАК ХозрасчетныйОборотыДтКт
                ГДЕ
                    ХозрасчетныйОборотыДтКт.СуммаОборот > 0)) КАК ХозрасчетныйОборотыДтКт
заметьте, при количестве документов более 1 млн запрос выполняется секунды.
1
0 / 0 / 0
Регистрация: 08.04.2013
Сообщений: 38
25.10.2013, 13:09  [ТС] 9
Fenomen, Скажите, пожалуйста, как выбрать из регистра оплаченный заказ, если оплат по одному заказу может быть несколько (частичная оплата), а также может быть возврат (частичный)?

Миллион заказов - это не в нашем случае
0
900 / 877 / 8
Регистрация: 15.03.2012
Сообщений: 2,680
25.10.2013, 13:20 10
Цитата Сообщение от zironka Посмотреть сообщение
Скажите, пожалуйста, как выбрать из регистра оплаченный заказ
По оплаченному заказу не будет остатка.

zironka, Вы пишите:
Цитата Сообщение от zironka Посмотреть сообщение
Отчет должен отображать все неоплаченные долги клиентов,
Я Вам и предлагаю выбирать не оплаченные заказы, по ним в регистре будет остаток. Если Вы хотите получить информацию по всем просроченным оплатам, а не только по тем которые еще не оплачены, то такая задача также решается с помощью регистра довольно просто.

Вы делаете запрос к таблице оборотов с периодичность до регистратора. Для документов формирующих движения по оплате, получаете их дату. Группируете по заказу, для даты оплаты используете функцию Максимум. Накладываете условие по колву дней просрочки.
Таким образом у Вас идет обращение к одной таблице и один раз.

Добавлено через 2 минуты
Цитата Сообщение от zironka Посмотреть сообщение
Миллион заказов - это не в нашем случае
Ну так время идет заказы накапливаются! Да и кто не стремится увеличить их количество. Хорошо созданная система, не должна быть чувствительна к объемам данных. Это не всегда возможно, но к этому нужно стремится.
1
0 / 0 / 0
Регистрация: 08.04.2013
Сообщений: 38
25.10.2013, 13:24  [ТС] 11
Цитата Сообщение от Fenomen Посмотреть сообщение
Ну так время идет заказы накапливаются! Да и кто не стремится увеличить их количество. Хорошо созданная система, не должна быть чувствительно к объемам данных. Это не всегда возможно, но к этому нужно стремится.
Я с вами согласна, поэтому и создала эту тему. Остальные отчеты в конфигурации дела по регистрам, а этот у меня иначе не получался.

Добавлено через 1 минуту
Цитата Сообщение от Fenomen Посмотреть сообщение
Я Вам и предлагаю выбирать не оплаченные заказы, по ним в регистре будет остаток. Если Вы хотите получить информацию по всем просроченным оплатам, а не только по тем которые еще не оплачены, то такая задача также решается с помощью регистра довольно просто.
Вы делаете запрос к таблице оборотов с периодичность до регистратора. Для документов формирующих движения по оплате, получаете их дату. Группируете по заказу, для даты оплаты используете функцию Максимум. Накладываете условие по колву дней просрочки.
Таким образом у Вас идет обращение к одной таблице и один раз.
За совет большое спасибо. Сегодня попробую переделать. Надеюсь, получиться.

О результате отпишусь.
0
0 / 0 / 0
Регистрация: 08.04.2013
Сообщений: 38
05.11.2013, 11:18  [ТС] 12
Цитата Сообщение от zironka Посмотреть сообщение
Fenomen
Большое спасибо за совет.

В результате в регистр ВзаиморасчетыСПокупателями добавила измерение НомерЗаказа (Тип Документ-Ссылка на ЗаказПокупателя).

Запрос для отчета по простроченным долгам получился очень кратким.

1C
1
2
3
4
5
6
7
8
9
10
ВЫБРАТЬ
    СУММА(ВзаиморасчетыСПокупателямиОстатки.СуммаВзаиморасчетовОстаток) КАК СуммаВзаиморасчетовОстаток,
    ВзаиморасчетыСПокупателямиОстатки.Контрагент КАК Контрагент
ИЗ
    РегистрНакопления.ВзаиморасчетыСПокупателями.Остатки КАК ВзаиморасчетыСПокупателямиОстатки
ГДЕ
    ВзаиморасчетыСПокупателямиОстатки.НомерЗаказа.Дата < ДОБАВИТЬКДАТЕ(&Период, ДЕНЬ, -&КолДней)
 
СГРУППИРОВАТЬ ПО
    ВзаиморасчетыСПокупателямиОстатки.Контрагент
0
05.11.2013, 11:18
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.11.2013, 11:18
Помогаю со студенческими работами здесь

Отчет в БД
надо сделать отчет, как квитанция, что б показывало, кто купил билеты, какой рейс, и цену

Отчет
Есть таблица , в ней список клиентов. При формировании отчета выводится весь список, возможно ли...

Отчет
Привет8-) Очень долго ищу инфу о выводе отчета. Видела как люди выводили таблицу как отчет, а мне...

Отчет
Здравствуйте!Помогите пожалуйста с отчетом!Мне необходимо, чтобы в отчете подсчитывалось количество...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru