Имя: Пароль:
1C
 
Последнее движение по контрагентам по Хозрасчётный. Как?
,
0 bolobol
 
21.03.18
09:55
Добрый день!

Как получить последнее движение по контрагентам в РегистреБухгалтерии Хозрасчётный?

Спасибо!
1 Buster007
 
21.03.18
10:00
взять максимальный период по контрагентам и соединиться по периоду и контрагенту
2 Mankubus
 
21.03.18
10:00
(0) получить все движения, сгруппировать по максимальному периоду, выбрать движение с максимальным периодом
3 bolobol
 
21.03.18
10:17
Откуда "взять" и с чем "соединить", чтобы выбрать, коллеги?
4 bolobol
 
21.03.18
10:20
"В тупую" заюзали виртуальную таблицу оборотов - результат, ожидаемо, появился, но как-то... не быстро... долго, даже... со вчера ждали. Всего-то 100000 строк.
5 VS-1976
 
21.03.18
10:21
(0) Берёшь физическую таблицу Субконто. И там фильтруешь по типу и контрагенту(там). Берёшь максимум дату. Ну и второе соединение с Субконто по дате и по Контрагенту находишь регистратор. Далее можешь соединить с Движением. Ну и субконтов подкинешь остальные
6 zak555
 
21.03.18
10:21
Выбрать первые 1
Из хз

Сортировка убыв
7 Малыш Джон
 
21.03.18
10:22
(6) не всего одну запись, а по каждому контрагенту одну
8 VS-1976
 
21.03.18
10:22
(5) Можешь список найденных Регистраторов использовать в Оборотах, что проще. Если контрагентов не так много
9 piter3
 
21.03.18
10:22
регистратор нафига нужен?
10 VS-1976
 
21.03.18
10:23
(9) Ну как зачем? Вытащить последние движения
11 RomanYS
 
21.03.18
10:24
(4) у вас 100000 контрагентов?
Озвучь задачу целиком.
12 VS-1976
 
21.03.18
10:24
(10) Я как понимаю нужны проводки. Если только список документов, то достаточно (5)
13 Малыш Джон
 
21.03.18
10:27
(3) получи таблицу вида Период, Контрагент, НужныеТебеДанные - это первая вт
из первой вт - Контрагент(по нему группировка), Период(его - в максимум) - это вторая вт
Соединяй первую вт со второй по Контрагенту и Периоду и вытаскивай НужныеТебеДанные
14 piter3
 
21.03.18
10:27
(10) мда
15 VS-1976
 
21.03.18
10:28
(14) Не мда, а что сказать хотел?
16 bolobol
 
21.03.18
10:31
(11) Задача целиком озвучена, кроме слов "БЫСТРО!", ну и, желательно "правильно")
И, да - близко к 100000.

Последнее движение - дата, регистратор.

(5) На курсах говорили, что с таблицей Субконто как-то... нежелательно ею пользоваться, ибо она какие-то кривые данные даёт. Кто что слышал/ощутил?
17 VS-1976
 
21.03.18
10:32
(16) Юмористы они. Для тысячи сейчас набросаю
18 piter3
 
21.03.18
10:32
(15) За регистратор и твой способ-расстрел
19 lodger
 
21.03.18
10:35
(16) а что там может быть кривого если в запросе явно типизировать поля?
20 RomanYS
 
21.03.18
10:41
(16) Субконто это физическая таблица, там нет ничего кривого, если ты понимаешь, как она устроена.
Жутко тормозная виртульная таблица - ДвиженияССубконто. Остальные ВТ при правильной установке параметров более чем юзабельны.
21 bolobol
 
21.03.18
10:48
То есть, просто таблицу ХЗ взять где ВЫРАЗИТЬ(как Контрагент) не null  все три субконто и взять максимум - не вариант никак?
22 bolobol
 
21.03.18
10:48
*любое из трёх субконто
23 VS-1976
 
21.03.18
11:07
Попробуй примерно так сделать. Вид сам посмотри какой у тебя.

//ВЫБРАТЬ
//    Контрагент
//    
//ПОМЕСТИТЬ втКонтрагенты

//ИЗ
//    &СписокКонтрагенток КАК тзКонтрагенты

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

ВЫБРАТЬ
    Ссылка КАК Контрагент
    
ПОМЕСТИТЬ втКонтрагенты

ИЗ
    Справочник.Контрагенты
ГДЕ
    Ссылка В ( &СписокКонтрагенток )

ИНДЕКСИРОВАТЬ ПО
    Ссылка
;

ВЫБРАТЬ РАЗЛИЧНЫЕ
    тзСубконто.Значение КАК Контрагент,
    тзСубконто.Период,
    тзСубконто.Регистратор
ИЗ
    втКонтрагенты

    ЛЕВОЕ СОЕДИНЕНИЕ ( ВЫБРАТЬ
        втКонтрагенты.Контрагент,
        МАКСИМУМ( тзСубконто.Период ) КАК Период
    ИЗ
        втКонтрагенты

        СОЕДИНЕНИЕ РегистрБухгалтерии.Управленческий.Субконто КАК тзСубконто
            ПО тзСубконто.Вид = ЗНАЧЕНИЕ( ПланВидовХарактеристик.ВидыСубконтоУправленческие.Контрагенты )
             И тзСубконто.Значение = втКонтрагенты.Контрагент

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

    ) КАК тзПериод
        ПО втКонтрагенты.Контрагент = тзПериод.Контрагент

    ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Управленческий.Субконто КАК тзСубконто
        ПО тзСубконто.Период = тзПериод.Период
         И тзСубконто.Значение = втКонтрагенты.Контрагент
24 Малыш Джон
 
21.03.18
11:11
(23) вот так делать не надо:

...
ИЗ
    втКонтрагенты

    ЛЕВОЕ СОЕДИНЕНИЕ ( ВЫБРАТЬ
        втКонтрагенты.Контрагент,
        МАКСИМУМ( тзСубконто.Период ) КАК Период
    ИЗ
        втКонтрагенты...


https://its.1c.ru/db/metod8dev#content:5842:hdoc:subquery_join
25 Вафель
 
21.03.18
11:12
Это задача: Срез последних
Такую задачу каждый 1сник должен уметь решать, даже если его посреди ночи разбудить
26 VS-1976
 
21.03.18
11:15
(24) Выкинь методичку, она для глупых составленна
27 VS-1976
 
21.03.18
11:16
(24) Скажем так что бы начинающие не делали то, что потом подвесит сервер
28 RomanYS
 
21.03.18
11:28
(21) Что такое ХЗ?
Или ты берешь живую таблицу Субконто с явным отбором по виду субконто, или используешь таблицу Обороты с обязательным  указанием параметра ВидСубконто. Нигде никаких 3-х субконто не  возникает.
29 Малыш Джон
 
21.03.18
11:33
(26) аххаа)))

>>Выкинь методичку, она для глупых составленна

"... спроси лучше у меня, я знаю как надо" ?
30 bolobol
 
21.03.18
11:36
(28) РегБух.Хозрасчётный, под ХЗ имел в виду.
Точно, в живой таблице РегБух нет субконтов... чёт я попутался.

Спасибо всем! Рискнём с вирт.таблицей Субконто
31 RomanYS
 
21.03.18
11:38
(30) Как!? ..таблица Субконто не виртуальная!
32 bolobol
 
21.03.18
11:39
(31) Не поспоришь тут... )))
33 VS-1976
 
21.03.18
11:46
(29) Ну да. Что такое ПОМЕСТИТЬ?
ПОМЕСТИТЬ это создание временной таблицы и на каждую запись по INSERT. А соединение с подзапросом это соединение в памяти. Если у тебя много пользователей постоянно использующее tembdb то увлечение виртуальными таблицами так же есть шанс не кисло провалиться по производительности. Если у тебя мало памяти физической, то ПОМЕСТИТЬ можно ещё оправдать
34 RomanYS
 
21.03.18
12:13
(33) у временных таблиц есть огромный плюс - они добавляют читаемости запросу. И если нет явного затыка в производительности то рекомендация (вендора в том числе) - использовать. А если проблемы со скоростью есть - тестировать, возможно даже в одной и той же задаче будут выигрывать разные варианты (временные против вложенных) на конкретном железе и данных.

Кстати в решении (0) будет ещё одна проблема - несколько регистраторов по контрагенту в одну секунду. (33) будешь еще раз читать субконто из базы и ещё раз соединять?
35 Вафель
 
21.03.18
12:18
sql же не сразу на диск пишет. Сначала в памяти, а потом сбрасывает, асинхронно
36 VS-1976
 
21.03.18
12:41
(34) Там несколько вариантов и выскочат для одного контрагента, если будет в одну и ту же секунду несколько различных регистраторов. Это уже философский вопрос что показывать, так как после соединений данные выдаются не в той последовательности в которой вносились
37 VS-1976
 
21.03.18
12:43
(36) Обычно вопрос ставят последнее движение для реализации к примеру, что бы понять когда была последняя отгрузка. А так давайте узнаем последний документ... Это может быть как отгрузка, так и оплата, так и списание ( гарантия )
38 Малыш Джон
 
21.03.18
12:58
(33) >>ПОМЕСТИТЬ это создание временной таблицы и на каждую запись по INSERT. А соединение с подзапросом это соединение в памяти. Если у тебя много пользователей постоянно использующее tembdb то увлечение виртуальными таблицами так же есть шанс не кисло провалиться по производительности. Если у тебя мало памяти физической, то ПОМЕСТИТЬ можно ещё оправдать

существует несколько способов соединения и они зависят в том числе от размера таблиц. в случае с выборкой размер таблицы непонятен, соответственно велик шанс что будет задействован неоптимальный алгоритм.
39 VS-1976
 
21.03.18
13:22
(38) Я стараюсь писать запрос так, что бы оптимизатору не было нужды напрягаться. Когда я пишу запрос, я представлю себе что должен проделать ms sql для получения результата
40 Малыш Джон
 
21.03.18
13:24
(39) а что, если при написании запроса представлять нужный способ, оптимизатор потом выберет именно его? ))
хмммм... никогда так не делал,  нужно попробовать
41 VS-1976
 
21.03.18
13:30
(40) Попробуй, тебе понравится. Способов то не так уж и много. Если написать правильно запрос, то оптимизатор не будет его перестраивать по другому
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший