Имя: Пароль:
1C
1С v8
Как сделать запросом такой фокус?
0 ТеньД
 
21.10.13
13:00
Рисуя отчет для бухгалтерии получил таблицу:
Контрагент, Дата (дата последней операции), Сумма (конечный остаток). И все было бы хорошо, но некоторые контрагенты размножились. Причина оказалась в том, что на одну дату/время бухгалтера вбили несколько операций. Как с этим бороться в запросе пока не понял. Есть мысли?
1 PR
 
21.10.13
13:01
Регистратор
2 Maxus43
 
21.10.13
13:09
а что надо получить? только одну строку из них, или общую сумму на этот день/время?
3 Dmitry1c
 
21.10.13
13:11
(0) группировать
4 Ненавижу 1С
 
гуру
21.10.13
13:13
(1) -1
(3) +1
5 MKZM
 
21.10.13
13:16
(0) (3)
6 MKZM
 
21.10.13
13:18
(2) общую, иначе чушь
7 samozvanec
 
21.10.13
13:18
(0) (5)
(6) последней же именно хотят
8 Maxus43
 
21.10.13
13:19
(6) >>дата последней операции
вот хрен знает чушь или нет. Общая не отражает данной хотелки
9 ТеньД
 
21.10.13
13:41
Надо получить последнюю операцию и конечный остаток на этот момент. По чем группировать непонятно: контрагент и дата одинаковы. Пример:
- Вася Пупкин 10.10.2013 0:00:00 100
- Вася Пупкин 10.10.2013 0:00:00 200

На выходе должно остаться только:
- Вася Пупкин 10.10.2013 0:00:00 200
10 Maxus43
 
21.10.13
13:44
(9) почему 200 - последняя, а не 100?
11 NcSteel
 
21.10.13
13:45
(9) Скажи критерий выбора, сможешь написать запрос.
12 PR
 
21.10.13
13:46
(9) Читай (1), не забудь еще номер строки.
13 Maxus43
 
21.10.13
13:48
(12) хоть немного развёртывай ответ, а то набор букв без смысла.

По моменту времени надо сортировать докменты, какой нахрен номер строки у документа? Если в разных доках записи?
14 Ненавижу 1С
 
гуру
21.10.13
13:48
(9) зачем вам последняя операция? что это вам реально даст?
15 exwill
 
21.10.13
13:49
(9) Это называется "срез последних".
Решается через соединение таблицы с самой собой.
16 Salimbek
 
21.10.13
13:56
(9) Если одинаковы и надо вывести какую-то одну из них, то
Select Pupkin, Time, Max(Sum) FROM ...
GROUP BY Pupkin, Time
17 ТеньД
 
21.10.13
13:59
(10) Потому что эта операция позже первой. Дата одинаковая, момент времени разный.
(11) Критерий выбора понятен: сгруппировать МАКСИМУМ(Регистратор.МоментВремени). Засада в том, что с моментом времени такие операции не работают.
(12) Нет номера строки. Все уже заранее свернуто по регистратору.
(14) Смысл отчета: конечный остаток по контрагенту + дата последней операции.
(16) Это конечный остаток. Аггрегирование не имеет смысла. Надо получить именно последнее число.
18 NcSteel
 
21.10.13
14:00
(17) Работают по Максимум (Регистратор), регистратор это момент времени + ссылка.
19 PR
 
21.10.13
14:06
(13) Что непонятного-то?
Есть регистр, в нем позиция определяется регистратором и номером строки.
20 PR
 
21.10.13
14:08
(17) Ну так тогда добавь номер строки или удали лишние записи.
21 1Cv8_accepted
 
21.10.13
14:08
(0) АВТОУПОРЯДОЧИВАНИЕ
22 Defender aka LINN
 
21.10.13
14:08
(18) "регистратор это момент времени + ссылка." О_о
Момент времени - это дата+ссылка
23 Schwonder
 
21.10.13
14:16
(0) Выбрать последние даты по контрам, собрать документы и остатки по регистраторам по этим датам, соединиться по контрам и суммам с остатками на КонецПериода, сгруппировать.. и усё! Делов то.
24 hhhh
 
21.10.13
14:19
(17) надо свернуть не по регистратору, а по дате. Зачем вы регистратор сюда приделали?
25 wms
 
21.10.13
14:20
максимум
26 ТеньД
 
21.10.13
14:26
(18) К моему удивлению операции МАКСИМУМ и МИНИМУМ для регистраторов отрабатывают без ошибок. Только результат дают какой-то странный. МАКСИМУМ выцепил первый документ из выборки. МИНИМУМ вынул откуда-то из середины. Не вышел каменный цветок.
27 CaMoJleT
 
21.10.13
14:33
Если делать через одно место, то можно записывать в регистр еще и текущую дату и по ней уже подбирать "последнюю из двух одинаковых дат" :)
28 Ненавижу 1С
 
гуру
21.10.13
14:35
(17) исходя из
>>конечный остаток по контрагенту + дата последней операции

ВЫБРАТЬ СУММА(КонечныйОстаток), МАКСИМУМ(Период)
...
СГРУППИРОВАТЬ ПО Контрагент
29 ТеньД
 
21.10.13
14:36
(28) Результат неверный. Для того же примера:
- Вася Пупкин 10.10.2013 0:00:00 100
- Вася Пупкин 10.10.2013 0:00:00 200

Запрос даст:
- Вася Пупкин 10.10.2013 0:00:00 300
30 wms
 
21.10.13
14:38
не баламуть народ какой регистратор?
тебе надо  из (9)
Вася Пупкин 10.10.2013 0:00:00 100
- Вася Пупкин 10.10.2013 0:00:00 200

На выходе должно остаться только:
- Вася Пупкин 10.10.2013 0:00:00 200
вот по периоду и группируй
31 ТеньД
 
21.10.13
14:50
Для ясности мой запрос:
ВЫБРАТЬ
    ХозрасчетныйОстаткиИОбороты.Субконто1 КАК Контрагент,
    ХозрасчетныйОстаткиИОбороты.Регистратор.Дата КАК РегистраторДата,
    ХозрасчетныйОстаткиИОбороты.СуммаКонечныйОстаток КАК СуммаКонечныйОстаток
ПОМЕСТИТЬ ВТ
ИЗ
    РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(&НачПериода, &КонПериода, Регистратор, , Счет В ИЕРАРХИИ (&Счет), , ) КАК ХозрасчетныйОстаткиИОбороты
ГДЕ
    (ХозрасчетныйОстаткиИОбороты.СуммаОборотДт <> 0
            ИЛИ ХозрасчетныйОстаткиИОбороты.СуммаОборотКт <> 0)
    И ХозрасчетныйОстаткиИОбороты.СуммаКонечныйОстаток <> 0
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ.Контрагент КАК Контрагент,
    МАКСИМУМ(ВТ.РегистраторДата) КАК РегистраторДата
ПОМЕСТИТЬ ВТ1
ИЗ
    ВТ КАК ВТ

СГРУППИРОВАТЬ ПО
    ВТ.Контрагент
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ1.Контрагент КАК Контрагент,
    ВТ1.РегистраторДата,
    ВТ.СуммаКонечныйОстаток
ИЗ
    ВТ1 КАК ВТ1
        ЛЕВОЕ СОЕДИНЕНИЕ ВТ КАК ВТ
        ПО ВТ1.Контрагент = ВТ.Контрагент
            И ВТ1.РегистраторДата = ВТ.РегистраторДата

УПОРЯДОЧИТЬ ПО
    Контрагент
32 Schwonder
 
21.10.13
14:53
...
;

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

СГРУППИРОВАТЬ ПО
    ВТ_ТвояТаблица.Контрагент
33 ТеньД
 
21.10.13
15:05
(32) Великолепно! Работает.
34 Salimbek
 
21.10.13
15:16
(33) Угу, а если последний документ Уменьшит остаток - что выдаст запрос?
35 Schwonder
 
21.10.13
15:20
(34) После последнего документа остатки будут равны тем, что вернет таблица "Хозрасчетный.Остатки". Группировка там по большому счету и не нужна, но вписал на всякий идиотский случай..
36 Ненавижу 1С
 
гуру
21.10.13
15:41
(29) Периодичность день поставь
37 ТеньД
 
21.10.13
15:59
(36) Нельзя. Последнюю операцию не получишь.
38 hhhh
 
21.10.13
16:02
(37) но вообще-то остаток 300 должен быть. 100+200.
39 ТеньД
 
21.10.13
16:11
(38) Ты бух. отчеты когда-нибудь видел? Это не суммы операций, а конечное сальдо.
40 Tateossian
 
21.10.13
16:19
(9) Твои заказчики сами не знают, что хотят.
41 pavelul73
 
21.10.13
16:35
МоментВремени() не пробовали использовать?
42 ТеньД
 
21.10.13
17:11
(41) В запросе?
43 pavelul73
 
21.10.13
17:26
ну да, срез на моментвремени(), если я правильно понял суть вашего вопроса
44 ТеньД
 
21.10.13
17:42
(43) Агрегатные функции не любят МоментВремени. Приходиться делать как показал Schwonder.