Имя: Пароль:
1C
1С v8
v8: Как реализовать отчет "Взаиморасчеты с контрагентами" одним запросом?
,
0 sergeobj
 
22.05.13
16:03
Приветствую!

Может кто подскажет, как реализовать отчет "Взаиморасчеты с контрагентами" одним запросом?

Конфигурация на платформе 1С8.2 содержит следующие объекты:

Справочник.Контрагенты
Документ.Реализация
   Реквизиты шапки:
       Контрагент
       ДатаОплаты
       Сумма
Документ.ПриходДенег
   Реквизиты шапки:
       Контрагент
       Сумма
РегистрНакопления.Взаиморасчеты
   Измерения:
       Контрагент
   Ресурс:
       Сумма

Документ "Реализация" делает движение по регистру Взаиморасчеты по измерению Контрагент со знаком "+" на сумму документа.
Документ "Приход денег" делает движение по регистру Взаиморасчеты по измерению Контрагент со знаком "-" на сумму документа.


Необходимо написать запрос с одним параметром - "Дата отчета". Остатки по взаиморасчетам с контрагентами должны браться на эту дату. При выполнении запроса в консоли отчетов должна получаться таблица, содержащая шесть колонок:

Контрагент
Документ реализации
Сумма документа
Сумма задолженности по документу
Сумма просроченной задолженности
Количество дней просрочки (ДатаОтчета - ДатаОплаты).

Документы реализации "закрываются" документами оплаты (ПриходДенег) в хронологической последовательности по методу FIFO.
1 kiabs
 
22.05.13
16:11
Нужно использовать левое соединение.... Или готовый текст запроса ждешь?
2 s_ustinov
 
22.05.13
16:12
(0) а что, возвратов нет?
3 sergeobj
 
22.05.13
16:12
Вот не знаю, как сделать ... Если несложно, запросом бы ... Очень выручил бы
4 s_ustinov
 
22.05.13
16:14
(1) там одного левого соединения не хватит, запрос не самый простой - ведь бывают и предоплаты. и он весьма неслабо будет напрягать систему.
5 sergeobj
 
22.05.13
16:14
Нет, возвратов нет
6 sergeobj
 
22.05.13
16:15
Да, могут быть и предоплаты и переплаты. Документы реализации и прихода денег не связаны
7 kabanoff
 
22.05.13
16:16
1. Берешь остатки на дату.
2. Берешь остатки и обороты с периодичностью по регистратору и вид границы "Движения", получаешь по ним остатки, когда начальный остаток был равен 0, либо начальный остаток был меньше 0, а конечный остаток стал больше или наоборот.
3. Соединяешь две таблицы по измерениям, которые тебе нужны в отчете.
Все.
8 sergeobj
 
22.05.13
16:32
А как на счет разных движений "Приход" и "Расход", переплат? Только по остаткам этого не определишь ...
9 eklmn
 
гуру
22.05.13
16:33
что есть расход переплаты?
10 sergeobj
 
22.05.13
16:35
Да, есть переплаты
11 kabanoff
 
22.05.13
16:39
(8) А нахрена тут приход и расход? Тебе нужны остатки взаиморасчетов на дату + даты просрочки с документами, образовавшими долг, или что-то другое?
12 sergeobj
 
22.05.13
16:40
Вот ссылка на начальные данные:
http://files.mail.ru/1BB33402F10448809DBD0B1177EED78F
13 sergeobj
 
22.05.13
16:41
Нужен отчет одним запросом, в котором будет рассчитываться долг и просрочка
14 kabanoff
 
22.05.13
16:43
(13) Чукча писатель? Ответь на (11).
15 sergeobj
 
22.05.13
16:50
Остатки взаиморасчетов есть в регистре, нужно закрытие долга по FIFO. Т.е., если по документу Реализация переплата, то она относится на следующий документ
16 s_ustinov
 
22.05.13
17:00
(13) зачем?
17 sergeobj
 
22.05.13
17:08
Для того, чтобы не перебирать в таблице значений, т.к. остатки по взаиморасчетам не относятся к конкретному документу. Переплаты висят, хотя должны закрывать следующие документы
18 sergeobj
 
22.05.13
17:17
Должен быть следующий результат:

Регистратор                            Долг
Реализация 1 от 01.03.2012 12:00:00    0,00
Реализация 2 от 19.09.2012 12:00:00    45,00
Реализация 3 от 20.10.2012 12:00:00    100,00
19 s_ustinov
 
22.05.13
17:21
(17) подумай, почему для тех же целей в других системах делают отдельную табличку, в которой указывается, какой документ к какому относится и в какой сумме.
запрос сделать можно, но он тебе не сильно поможет
20 Ненавижу 1С
 
гуру
22.05.13
17:23
21 sergeobj
 
22.05.13
17:25
К сожалению так реализовали до меня ... Сам бы сделал связку ... На эти данные завязана история за 2 года, поэтому и задал вопрос
22 sergeobj
 
22.05.13
17:42
(20) Примерно похоже, но у меня оплаты в этом же регистре
23 sergeobj
 
22.05.13
17:45
(11) Остатки взаиморасчетов есть в регистре, нужно закрытие долга по FIFO. Т.е., если по документу Реализация переплата, то она относится на следующий документ
24 sergeobj
 
22.05.13
17:48
(19) К сожалению так реализовали до меня ... Сам бы сделал связку ... На эти данные завязана история за 2 года, поэтому и задал вопрос
25 zak555
 
22.05.13
18:00
у РН не измерения докВзаиморасчёта ?
26 zak555
 
22.05.13
18:10
(24) добавь док
27 azernot
 
22.05.13
18:23
Задача показалась интересной чисто для теоретического изыскания.. И вроде бы получилось:


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

СГРУППИРОВАТЬ ПО
   Задолженность.Контрагент,
   Задолженность.Фирма,
   Задолженность.Договор,
   Задолженность.ПоДокументу,
   Задолженность.ПоДокументу.МоментВремени

ИНДЕКСИРОВАТЬ ПО
   ПоДокументу,
   Договор,
   Контрагент,
   Фирма
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   Оплата.Фирма КАК Фирма,
   Оплата.Контрагент КАК Контрагент,
   Оплата.Договор КАК Договор,
   Оплата.ПоДокументу КАК ПоДокументу,
   Оплата.ПоДокументу.МоментВремени КАК Период,
   СУММА(Оплата.СуммаСНДС) КАК СуммаСНДС
ПОМЕСТИТЬ Оплата
ИЗ
   РегистрНакопления.Оплата КАК Оплата
ГДЕ
   Оплата.Период <= &Период

СГРУППИРОВАТЬ ПО
   Оплата.Договор,
   Оплата.Контрагент,
   Оплата.ПоДокументу,
   Оплата.Фирма,
   Оплата.ПоДокументу.МоментВремени

ИНДЕКСИРОВАТЬ ПО
   ПоДокументу,
   Договор,
   Контрагент,
   Фирма
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ОбщаяЗадолженность.Фирма КАК Фирма,
   ОбщаяЗадолженность.Контрагент КАК Контрагент,
   ОбщаяЗадолженность.Договор КАК Договор,
   СУММА(ОбщаяЗадолженность.СуммаСНДС) КАК СуммаСНДС
ПОМЕСТИТЬ ОбщаяЗадолженность
ИЗ
   (ВЫБРАТЬ
       Задолженность.Фирма КАК Фирма,
       Задолженность.Контрагент КАК Контрагент,
       Задолженность.Договор КАК Договор,
       Задолженность.СуммаСНДС КАК СуммаСНДС
   ИЗ
       Задолженность КАК Задолженность
   
   ОБЪЕДИНИТЬ ВСЕ
   
   ВЫБРАТЬ
       Оплата.Фирма,
       Оплата.Контрагент,
       Оплата.Договор,
       -Оплата.СуммаСНДС
   ИЗ
       Оплата КАК Оплата) КАК ОбщаяЗадолженность

СГРУППИРОВАТЬ ПО
   ОбщаяЗадолженность.Фирма,
   ОбщаяЗадолженность.Контрагент,
   ОбщаяЗадолженность.Договор

ИНДЕКСИРОВАТЬ ПО
   Договор,
   Контрагент,
   Фирма
;

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

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

УПОРЯДОЧИТЬ ПО
   ДокументыСНакопленнойСуммой.Период
ИТОГИ
   СУММА(ЗадолженностьПоДокументу)
ПО
   Фирма,
   Контрагент,
   Договор
28 s_ustinov
 
22.05.13
18:46
(27) это не называется "одним запросом" :)))
там ничего супер сложного, но я сейчас не хочу вспоминать язык запросов 1с, а стандартный sql не уверен что ТС сможет правильно переделать
29 sergeobj
 
22.05.13
20:15
(27)(26)(28) Нет, документа по взаиморасчетам там нет. Вот база с данными, чтобы было понятно (консоль запросов в обработках):
http://files.mail.ru/6B57494011F0499F91A16AA49D167939
30 azernot
 
22.05.13
21:41
(29) А я твою задачу и не решал, я решал свою, более расширенную. Но мой запрос из (27) легко перекладывается на твою задачу, надо только избавиться от фирмы и договора, а в качестве документа взаиморасчетов использовать регистратор по регистру "Взаиморасчеты".  Сумму просроченной задолженности также легко получить сравнив дату отчёта и дату оплаты.
31 azernot
 
22.05.13
22:10
(29) Вот запрос для выложенной БД

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

СГРУППИРОВАТЬ ПО
   Задолженность.Контрагент,
   Задолженность.Регистратор,
   Задолженность.Регистратор.МоментВремени

ИНДЕКСИРОВАТЬ ПО
   ПоДокументу,
   Контрагент
;

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

СГРУППИРОВАТЬ ПО
   Оплата.Контрагент,
   Оплата.Регистратор,
   Оплата.Регистратор.МоментВремени

ИНДЕКСИРОВАТЬ ПО
   ПоДокументу,
   Контрагент
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ОбщаяЗадолженность.Контрагент КАК Контрагент,
   СУММА(ОбщаяЗадолженность.Сумма) КАК Сумма
ПОМЕСТИТЬ ОбщаяЗадолженность
ИЗ
   (ВЫБРАТЬ
       Задолженность.Контрагент КАК Контрагент,
       Задолженность.Сумма КАК Сумма
   ИЗ
       Задолженность КАК Задолженность
   
   ОБЪЕДИНИТЬ ВСЕ
   
   ВЫБРАТЬ
       Оплата.Контрагент,
       -Оплата.Сумма
   ИЗ
       Оплата КАК Оплата) КАК ОбщаяЗадолженность

СГРУППИРОВАТЬ ПО
   ОбщаяЗадолженность.Контрагент

ИНДЕКСИРОВАТЬ ПО
   Контрагент
;

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

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

УПОРЯДОЧИТЬ ПО
   ДокументыСНакопленнойСуммой.Период
ИТОГИ
   СУММА(ЗадолженностьПоДокументу)
ПО
   Контрагент



Результат на 31.01.2012:

Контрагент    Документ    СуммаПоДокументу    ЗадолженностьПоДокументу    ПросроченнаяЗадолженность    ДнейПросрочки
Иванов И.И.            145        
Иванов И.И.    Реализация 2 от 19.09.2012 12:00:00    100    45    45    122
Иванов И.И.    Реализация 3 от 20.10.2012 12:00:00    100    100    100    82
32 sergeobj
 
22.05.13
23:22
(30) Спасибо огромное, а то сам как-то никак не мог сообразить
33 Krendel
 
22.05.13
23:35
Полный интерфейс, отчеты, продажи, взаиморасчеты с контрагентами- вызывается одним запросом ;=)
34 France
 
22.05.13
23:45
Интересно, сколько часов автор потратил на то, чтобы самостоятельно попытался найти решение?
Ошибка? Это не ошибка, это системная функция.