Имя: Пароль:
1C
 
Помогите придумать формулу из запроса
0 Обработка
 
09.12.23
09:35
Есть запрос из бухитогов. В нем 3 временных таблицы - данные за 3 периоды которые стоят один за другим по датам. Необходимо вычислить долги образованные за эти 3 периода и 4й это до первого. Речь идет дебеторка по договорам и по счетам.
Вот часть запроса:
ВЫБРАТЬ
    ВТ1.Счет КАК Счет,
    ВТ1.Договор КАК Договор,
    ВТ3.СНД КАК СНД1,
    ВТ3.ДО КАК ДО1,
    ВТ3.КО КАК КО1,
    ВТ3.СКД КАК СКД1,
    ВТ2.СНД КАК СНД2,
    ВТ2.ДО КАК ДО2,
    ВТ2.КО КАК КО2,
    ВТ2.СКД КАК СКД2,
    ВТ1.СНД КАК СНД3,
    ВТ1.ДО КАК ДО3,
    ВТ1.КО КАК КО3,
    ВТ1.СКД КАК СКД3
ПОМЕСТИТЬ ВТ4
ИЗ
    ВТ1 КАК ВТ1
        ПОЛНОЕ СОЕДИНЕНИЕ ВТ2 КАК ВТ2
        ПО ВТ1.Счет = ВТ2.Счет
            И ВТ1.Договор = ВТ2.Договор
        ПОЛНОЕ СОЕДИНЕНИЕ ВТ3 КАК ВТ3
        ПО ВТ1.Счет = ВТ3.Счет
            И ВТ1.Договор = ВТ3.Договор
1 Обработка
 
09.12.23
09:36
Вот так пытаюсь пока но полка не се верно:

ВЫБРАТЬ
    ВТ4.Счет,
    ВТ4.Договор,
    ВЫБОР
        КОГДА ВТ4.СНД1 = 0
            ТОГДА 0
        ИНАЧЕ ВЫБОР
                КОГДА ВТ4.СНД1 - (ВТ4.ДО1 + ВТ4.ДО2 + ВТ4.ДО3) - (ВТ4.КО1 + ВТ4.КО2 + ВТ4.КО3) > 0
                    ТОГДА ВТ4.СНД1 - (ВТ4.ДО1 + ВТ4.ДО2 + ВТ4.ДО3) - (ВТ4.КО1 + ВТ4.КО2 + ВТ4.КО3)
                ИНАЧЕ 0
            КОНЕЦ
    КОНЕЦ КАК Больше3лет,
    ВЫБОР
        КОГДА ВТ4.СНД2 = 0
            ТОГДА 0
        ИНАЧЕ ВЫБОР
                КОГДА ВТ4.СНД2 - (ВТ4.ДО2 + ВТ4.ДО3) - (ВТ4.КО2 + ВТ4.КО3) > 0
                    ТОГДА ВТ4.СНД2 - (ВТ4.ДО2 + ВТ4.ДО3) - (ВТ4.КО2 + ВТ4.КО3)
                ИНАЧЕ 0
            КОНЕЦ
    КОНЕЦ КАК ОтГодаДо3лет,
    ВЫБОР
        КОГДА ВТ4.СНД3 = 0
            ТОГДА 0
        ИНАЧЕ ВЫБОР
                КОГДА ВТ4.СНД3 -   ВТ4.ДО3 -  ВТ4.КО3 > 0
                    ТОГДА ВТ4.СНД3 - ВТ4.ДО3 -  ВТ4.КО3
                ИНАЧЕ 0
            КОНЕЦ
    КОНЕЦ КАК От3месДо1Года
ИЗ
    ВТ4 КАК ВТ4
2 PLUT
 
09.12.23
09:42
3 Обработка
 
09.12.23
09:47
(2) У меня старая перепаханная БП2 и в нем не включен флаг учета взаиморасчета по документам. Я озвучивал бухам это.
Плюс у нас отборы разные по счетам и по договорам и по категориям договоров. И как назло база вести 1 ТБ и за период 13 лет. (
4 Обработка
 
09.12.23
09:59
Если не осилю формулу внедрю наверно новы регистр накопления и перепроведу только по этому регистру. Или придется ввод остатков сделать.
5 Обработка
 
09.12.23
10:01
Бухи собирают задолженность возникшее:
1. до 3 мес
2. от 3 мес до 1 года
3. От 1 года до 3 лет
4. Более 3 лет

Вроде отчет сделал и сдал еще 3-4 месяца назад но оказалось ошибки есть.
6 Лирик
 
09.12.23
11:20
В свое время делал Отчет по срокам задолженности при отключенных расчетах по документам. Технология следующая:
В первую временную таблицу собираем остатки задолженности клиента в нужных разрезах (Контрагент, Договор)

Контрагент СуммаДолга
ООО РиК    10000
ИП Иванов  20000
  
Во вторую ВТ собираем "увеличения долга" по этим же разрезам + дата возникновения задолженности (ДатаВозникновения).

Контрагент ДатаВозникновения УвеличениеДолга
ООО РиК    01.01.2023        1600
ООО РиК    10.01.2023        6800
ООО РиК    20.01.2023        2500
ООО РиК    25.01.2023        4000
ИП Иванов  03.01.2023        3000
ИП Иванов  18.01.2023        18000
ИП Иванов  30.01.2023        8000

Вторую ВТ соединяем саму с собой по условиям равенства основных разрезов и "ВТ.ДатаВозникновения > ВТ1.ДатаВозникновения" и группируем суммы увеличения долга из первой таблицы по МАКС из второй по СУММА

Контрагент ДатаВозник УвДолга УвДолга1
ООО РиК    01.01.2023 1600    13300
ООО РиК    10.01.2023 6800    6500
ООО РиК    20.01.2023 2500    4000
ООО РиК    25.01.2023 4000    0
ИП Иванов  03.01.2023 3000    26000
ИП Иванов  18.01.2023 18000   8000
ИП Иванов  30.01.2023 8000    0

Соединяем полученный результат с долгом

Контрагент ДатаВозник УвДолга Накоплено Долг
ООО РиК    01.01.2023 1600    13300     10000
ООО РиК    10.01.2023 6800    6500      10000
ООО РиК    20.01.2023 2500    4000      10000
ООО РиК    25.01.2023 4000    0         10000
ИП Иванов  03.01.2023 3000    26000     20000
ИП Иванов  18.01.2023 18000   8000      20000
ИП Иванов  30.01.2023 8000    0         20000

Убираем строки где Накоплено > Долг и вычисляем ДолгНаДату = МИН(УвДолга, Долг-Накоплено)

Контрагент ДатаВозник ДолгНаДату
ООО РиК    10.01.2023 3500    
ООО РиК    20.01.2023 2500    
ООО РиК    25.01.2023 4000    
ИП Иванов  18.01.2023 12000  
ИП Иванов  30.01.2023 8000    

Итого мы получили таблицу с задолженностями по датам. Я из основных разрезов оставил только Контрагента, для экономии места. Собрать из такой таблицы долг по периодам не составляет труда.
7 Обработка
 
09.12.23
11:45
Я вот сейчас изучаю типовой отчет.
Хочу под себя переделать если получится.
Хорошо что там можно поменять периоды.
И счета тоже настроить.
8 Обработка
 
09.12.23
11:46
(6) Идея не плохая тем более похож на типовую.
Но не громоздко ли? Или не будет медленно и долго?
9 Гена
 
09.12.23
12:05
(6) А обратный перебор в прошлое невозможен в 1С?
Ведь гораздо проще получить результат:
ООО РиК    25.01.2023 4000 ... 10000-4000 = 6000
ООО РиК    20.01.2023 2500 ... 6000-2500 = 3500
ООО РиК    10.01.2023 3500 ... 3500 - 6800

Если нет, то нельзя тупо год уменьшить на единицу, а потом вернуть?
ООО РиК    01.01.2023        1600
ООО РиК    10.01.2022        6800
ООО РиК    20.01.2021        2500
ООО РиК    25.01.2020        4000

|

ООО РиК    25.01.2020        4000
ООО РиК    20.01.2021        2500
ООО РиК    10.01.2022        6800
ООО РиК    01.01.2023        1600
10 Гена
 
09.12.23
12:20
Или, если много движений в одном дне, то сначала:
Дата() = 01.01.2030 - Дата()
А после опять:
Дата() = 01.01.2030 - Дата()
11 Лирик
 
09.12.23
12:57
(8) Работает уже несколько лет, быстродействие удовлетворительное. Используется таблица оборотов и остатков.
Данные взяты из регистра Взаиморасчеты, но можно взять откуда угодно, в том числе и из регистра бухгалтерии. Главное правильно сформировать 2 первые ВТ. Остальное техника. Вот пример запроса:
   "ВЫБРАТЬ
   |    ВзаиморасчетыСКонтрагентамиОстатки.Контрагент,
   |    СУММА(ВзаиморасчетыСКонтрагентамиОстатки.СуммаВзаиморасчетовОстаток) КАК СуммаДолга
   |ПОМЕСТИТЬ ДолгиКонтрагентов
   |ИЗ
   |    РегистрНакопления.ВзаиморасчетыСКонтрагентами.Остатки КАК ВзаиморасчетыСКонтрагентамиОстатки
   |
   |СГРУППИРОВАТЬ ПО
   |    ВзаиморасчетыСКонтрагентамиОстатки.Контрагент
   |
   |ИМЕЮЩИЕ
   |    СУММА(ВзаиморасчетыСКонтрагентамиОстатки.СуммаВзаиморасчетовОстаток) > 0
   |;
   |
   |////////////////////////////////////////////////////////////////////////////////
   |ВЫБРАТЬ
   |    ВзаиморасчетыСКонтрагентамиОбороты.Контрагент,
   |    КОНЕЦПЕРИОДА(ВзаиморасчетыСКонтрагентамиОбороты.Период, ДЕНЬ) КАК ДатаВозникновения,
   |    СУММА(ВзаиморасчетыСКонтрагентамиОбороты.СуммаВзаиморасчетовПриход) КАК УвеличениеДолга
   |ПОМЕСТИТЬ УвеличениеДолгов
   |ИЗ
   |    РегистрНакопления.ВзаиморасчетыСКонтрагентами.Обороты(
   |            ,
   |            ,
   |            Регистратор,
   |            Контрагент В
   |                (ВЫБРАТЬ
   |                    ДолгиКонтрагентов.Контрагент
   |                ИЗ
   |                    ДолгиКонтрагентов КАК ДолгиКонтрагентов)) КАК ВзаиморасчетыСКонтрагентамиОбороты
   |
   |СГРУППИРОВАТЬ ПО
   |    ВзаиморасчетыСКонтрагентамиОбороты.Контрагент,
   |    КОНЕЦПЕРИОДА(ВзаиморасчетыСКонтрагентамиОбороты.Период, ДЕНЬ)
   |
   |ИМЕЮЩИЕ
   |    СУММА(ВзаиморасчетыСКонтрагентамиОбороты.СуммаВзаиморасчетовПриход) > 0
   |;
   |
   |////////////////////////////////////////////////////////////////////////////////
   |ВЫБРАТЬ
   |    УвеличениеДолгов.Контрагент,
   |    УвеличениеДолгов.ДатаВозникновения,
   |    МАКСИМУМ(УвеличениеДолгов.УвеличениеДолга) КАК УвеличениеДолга,
   |    СУММА(ЕСТЬNULL(УвеличениеДолгов1.УвеличениеДолга, 0)) КАК НакопленныйДолг
   |ПОМЕСТИТЬ ТаблицаСНакоплением
   |ИЗ
   |    УвеличениеДолгов КАК УвеличениеДолгов
   |        ЛЕВОЕ СОЕДИНЕНИЕ УвеличениеДолгов КАК УвеличениеДолгов1
   |        ПО УвеличениеДолгов.Контрагент = УвеличениеДолгов1.Контрагент
   |            И УвеличениеДолгов.ДатаВозникновения > УвеличениеДолгов1.ДатаВозникновения
   |
   |СГРУППИРОВАТЬ ПО
   |    УвеличениеДолгов.Контрагент,
   |    УвеличениеДолгов.ДатаВозникновения
   |;
   |
   |////////////////////////////////////////////////////////////////////////////////
   |ВЫБРАТЬ
   |    ТаблицаСНакоплением.Контрагент,
   |    ТаблицаСНакоплением.ДатаВозникновения,
   |    ВЫБОР
   |        КОГДА ТаблицаСНакоплением.НакопленныйДолг + ТаблицаСНакоплением.УвеличениеДолга > ДолгиКонтрагентов.СуммаДолга
   |            ТОГДА ДолгиКонтрагентов.СуммаДолга - ТаблицаСНакоплением.НакопленныйДолг
   |        ИНАЧЕ ТаблицаСНакоплением.УвеличениеДолга
   |    КОНЕЦ КАК ДолгНаДату
   |ИЗ
   |    ТаблицаСНакоплением КАК ТаблицаСНакоплением
   |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ДолгиКонтрагентов КАК ДолгиКонтрагентов
   |        ПО ТаблицаСНакоплением.Контрагент = ДолгиКонтрагентов.Контрагент
   |ГДЕ
   |    ДолгиКонтрагентов.СуммаДолга >= ТаблицаСНакоплением.НакопленныйДолг"
12 Лирик
 
09.12.23
13:06
(9) Это не понял
(10) Таблица "Увеличений долга" сворачивается по дате (суммы увеличения долга суммируются).
(8) У меня вообще рассчитывается долг по документам, правда я беру обороты из таблицы продаж по документу продажи (ну задача была такая, показать за какую накладную должны). Попробуйте, основная нагрузка - выбор увеличений долга.
Закон Брукера: Даже маленькая практика стоит большой теории.