Имя: Пароль:
1C
1С v8
Расчет остатков в СКД - как сделать правильно?
,
0 xaozai
 
28.11.13
14:22
Запрос:
ВЫБРАТЬ
    ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.ДоговорКонтрагента КАК ДоговорКонтрагента,
    ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.Период КАК Период,
    ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.СуммаВзаиморасчетовНачальныйОстаток КАК СуммаВзаиморасчетовНачальныйОстаток,
    ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.СуммаВзаиморасчетовПриход КАК СуммаВзаиморасчетовПриход,
    ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.СуммаВзаиморасчетовРасход КАК СуммаВзаиморасчетовРасход,
    ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.СуммаВзаиморасчетовКонечныйОстаток КАК СуммаВзаиморасчетовКонечныйОстаток
{ВЫБРАТЬ
    ДоговорКонтрагента.*,
    Период,
    СуммаВзаиморасчетовНачальныйОстаток,
    СуммаВзаиморасчетовПриход,
    СуммаВзаиморасчетовРасход,
    СуммаВзаиморасчетовКонечныйОстаток}
ИЗ
    РегистрНакопления.ВзаиморасчетыСКонтрагентами.ОстаткиИОбороты(, , Месяц, , ДоговорКонтрагента.Код = "000083578") КАК ВзаиморасчетыСКонтрагентамиОстаткиИОбороты

Настройки: http://s019.radikal.ru/i636/1311/a1/7f2b6701c5a4.png
Результат: http://s020.radikal.ru/i713/1311/99/a9271c1a29e3.png

Запрос 2:
ВЫБРАТЬ
    ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.ДоговорКонтрагента КАК ДоговорКонтрагента,
    ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.Период КАК Период,
    ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.СуммаВзаиморасчетовНачальныйОстаток КАК СуммаВзаиморасчетовНачальныйОстаток,
    ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.СуммаВзаиморасчетовПриход КАК СуммаВзаиморасчетовПриход,
    ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.СуммаВзаиморасчетовРасход КАК СуммаВзаиморасчетовРасход,
    ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.СуммаВзаиморасчетовКонечныйОстаток КАК СуммаВзаиморасчетовКонечныйОстаток
{ВЫБРАТЬ
    ДоговорКонтрагента.*,
    Период,
    СуммаВзаиморасчетовНачальныйОстаток,
    СуммаВзаиморасчетовПриход,
    СуммаВзаиморасчетовРасход,
    СуммаВзаиморасчетовКонечныйОстаток}
ИЗ
    РегистрНакопления.ВзаиморасчетыСКонтрагентами.ОстаткиИОбороты(, , Месяц, , ДоговорКонтрагента.Код = "000083578") КАК ВзаиморасчетыСКонтрагентамиОстаткиИОбороты

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ДоговорыКонтрагентов.Ссылка,
    ДАТАВРЕМЯ(2013, 12, 1),
    0,
    0,
    0,
    0
ИЗ
    Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
ГДЕ
    ДоговорыКонтрагентов.Код = "000083578"

Настройки такие же.
Результат: http://i031.radikal.ru/1311/00/80d25114350a.png

Вопрос: как сделать, чтобы во втором случае остатки вывелись правильно?
1 xaozai
 
28.11.13
14:39
up
2 xaozai
 
28.11.13
15:07
В реальности запрос примерно такой:
ВЫБРАТЬ
   ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.ДоговорКонтрагента КАК ДоговорКонтрагента,
   ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.Период КАК Период,
   ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.СуммаВзаиморасчетовНачальныйОстаток КАК СуммаВзаиморасчетовНачальныйОстаток,
   ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.СуммаВзаиморасчетовПриход КАК СуммаВзаиморасчетовПриход,
   ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.СуммаВзаиморасчетовРасход КАК СуммаВзаиморасчетовРасход,
   ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.СуммаВзаиморасчетовКонечныйОстаток КАК СуммаВзаиморасчетовКонечныйОстаток,
   0 КАК ДанныеИзДокументов
{ВЫБРАТЬ
   ДоговорКонтрагента.*,
   Период,
   СуммаВзаиморасчетовНачальныйОстаток,
   СуммаВзаиморасчетовПриход,
   СуммаВзаиморасчетовРасход,
   СуммаВзаиморасчетовКонечныйОстаток,
   ДанныеИзДокументов}
ИЗ
   РегистрНакопления.ВзаиморасчетыСКонтрагентами.ОстаткиИОбороты(, , Месяц, , ДоговорКонтрагента.Код = "000083578") КАК ВзаиморасчетыСКонтрагентамиОстаткиИОбороты

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
   Доки.ДоговорКонтрагента,
   НачалоПериода(Доки.Период, Месяц),
   0,
   0,
   0,
   0,
   Доки.Сумма
ИЗ
   Документы.МойДокумент.МояТЧ КАК Доки
ГДЕ
   Доки.ДоговорКонтрагента.Код = "000083578"


Т.е., в отчете собираются данные из регистра и некоторых документов, которые не пишут в этот регистр.
3 Veliar_s
 
28.11.13
15:08
А в ресурсах прописать не пробовал.
4 xaozai
 
28.11.13
15:09
В ресурсах есть все суммы: приход, расход, остатки...
5 Veliar_s
 
28.11.13
15:16
Суммы есть а "Расчитывать по.." - "Общий итог" везде стоит?
6 xaozai
 
28.11.13
15:20
(5) "Рассчитывать по" вообще нигде не стоит. По-умолчанию оно должно для всего рассчитывать.
Попробовал поставить только что все галочки для всех сумм  - тот же результат. Остаток по группировке "Договор контрагента" и итоговый не считаются.
7 grayshadow
 
28.11.13
15:24
СКД, ОстаткиИОбороты и Объединить - хреново совместимы, лучше левым соединением попробовать
по месяцу должно быть легко
8 xaozai
 
28.11.13
15:32
(7) Левое соединение к чему? Очевидно, что во второй таблице есть период, которого нет в первой и следовательно при левом соединении данные, которых нет в первой таблице не попадут вообще.

Всё, сделал. Во втором подзапросе вместо выбора нулей выбрал значения из дописанного левого соединения с тем же регистром по договору и периоду.

ВЫБРАТЬ
    ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.ДоговорКонтрагента КАК ДоговорКонтрагента,
    ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.Период КАК Период,
    ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.СуммаВзаиморасчетовНачальныйОстаток КАК СуммаВзаиморасчетовНачальныйОстаток,
    ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.СуммаВзаиморасчетовПриход КАК СуммаВзаиморасчетовПриход,
    ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.СуммаВзаиморасчетовРасход КАК СуммаВзаиморасчетовРасход,
    ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.СуммаВзаиморасчетовКонечныйОстаток КАК СуммаВзаиморасчетовКонечныйОстаток
{ВЫБРАТЬ
    ДоговорКонтрагента.*,
    Период,
    СуммаВзаиморасчетовНачальныйОстаток,
    СуммаВзаиморасчетовПриход,
    СуммаВзаиморасчетовРасход,
    СуммаВзаиморасчетовКонечныйОстаток}
ИЗ
    РегистрНакопления.ВзаиморасчетыСКонтрагентами.ОстаткиИОбороты(, , Месяц, , ДоговорКонтрагента.Код = "000083578") КАК ВзаиморасчетыСКонтрагентамиОстаткиИОбороты

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ДоговорыКонтрагентов.Ссылка,
    ДАТАВРЕМЯ(2013, 12, 1),
    ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.СуммаВзаиморасчетовНачальныйОстаток,
    ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.СуммаВзаиморасчетовПриход,
    ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.СуммаВзаиморасчетовРасход,
    ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.СуммаВзаиморасчетовКонечныйОстаток
ИЗ
    РегистрНакопления.ВзаиморасчетыСКонтрагентами.ОстаткиИОбороты(, , Месяц, ,ДоговорКонтрагента.Код = "000083578" ) КАК ВзаиморасчетыСКонтрагентамиОстаткиИОбороты
        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
        ПО ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.ДоговорКонтрагента = ДоговорыКонтрагентов.Ссылка
            И (ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.Период = ДАТАВРЕМЯ(2013, 12, 1))
ГДЕ
    ДоговорыКонтрагентов.Код = "000083578"
9 xaozai
 
28.11.13
15:35
(8) Хотя, не, не прокатило - та же фигня.
10 grayshadow
 
28.11.13
15:42
я прально поняла, что из 2й таблицы надо только сумма?
11 xaozai
 
28.11.13
16:21
(10) Да, из второй таблицы только сумма берется.

В общем, сделал так:
Получил остатки на каждый, так, как описано здесь: http://kb.mista.ru/article.php?id=579&;
Только там берется на каждый день, я сделал на начало каждого месяца.
Объединил со второй таблицей, и еще одно объединение с оборотами, т.к., метод получения остатков на каждый день не позволяет сразу получить и обороты.
12 grayshadow
 
28.11.13
16:27
нафига по дням, если периодичность РН - месяц?
ВЫБРАТЬ
всё
из РегистрНакопления.ВзаиморасчетыСКонтрагентами.ОстаткиИОбороты(, , Месяц,)
левое соединение (выбрать все доки МойДокумент, сгруппировать по договору и началу месяца) как ВложенныйЗапрос
ПО ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.ДоговорКонтрагента = ВложенныйЗапрос.ДоговорКонтрагента
            И ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.Период = ВложенныйЗапрос.Период
13 xaozai
 
28.11.13
16:45
(12) см. (11) (я сделал остатки на начало каждого мес.) и (7)
В твоём запросе не будет декабрьских данных, т.к., в регистре нет оборотов за декабрь.
14 grayshadow
 
28.11.13
16:51
тогда сделать таблицу "начал месяцев" из календаря и к ней левым соединением присобачить остальные
15 grayshadow
 
28.11.13
17:03
или совсем красиво - НачалаМесяцевИзРН объединить НачалМесяцевИзДокументов и к ней присобачить
16 xaozai
 
28.11.13
17:09
(15) Предлагаю попробовать. В первых сообщениях запросы простые и легко подифицируются под конкретную базу.
17 xaozai
 
28.11.13
17:23
P.S.: Сам офигеваю от того, каким в результате запрос получился )
18 grayshadow
 
28.11.13
18:41
ВЫБРАТЬ РАЗЛИЧНЫЕ
    ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.Период
ПОМЕСТИТЬ ВТДаты
ИЗ
    РегистрНакопления.ВзаиморасчетыСКонтрагентами.ОстаткиИОбороты(, , Месяц, Движения, ) КАК ВзаиморасчетыСКонтрагентамиОстаткиИОбороты

ОБЪЕДИНИТЬ

ВЫБРАТЬ РАЗЛИЧНЫЕ
    НАЧАЛОПЕРИОДА(РеализацияТоваровУслуг.Дата, МЕСЯЦ)
ИЗ
    Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
    НАЧАЛОПЕРИОДА(РеализацияТоваровУслуг.Дата, МЕСЯЦ) КАК РТУДата,
    РеализацияТоваровУслуг.ДоговорКонтрагента,
    СУММА(РеализацияТоваровУслуг.СуммаДокумента) КАК СуммаДокумента
ПОМЕСТИТЬ ВТДоки
ИЗ
    Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг

СГРУППИРОВАТЬ ПО
    НАЧАЛОПЕРИОДА(РеализацияТоваровУслуг.Дата, МЕСЯЦ),
    РеализацияТоваровУслуг.ДоговорКонтрагента
;

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

УПОРЯДОЧИТЬ ПО
    ДоговорКонтрагентаВладелец,
    ДоговорКонтрагента,
    Период
19 grayshadow
 
28.11.13
18:42
потрачено не час, а 10 минут:)
20 xaozai
 
29.11.13
10:17
(18) И что даст внутреннее соединение регистра с документами по периоду, когда в регистре нет такого периода, как в документах?
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.