Имя: Пароль:
1C
1С v8
Как написать оптимизированный запрос
,
0 Ministr
 
11.07.14
16:12
Добрый день, коллеги!
Надо написать запрос на регистр бухгалтерии.
В Регистре бухгалтерии - 91 регистратор.
В запросе необходимо вытащить реквизит ДоговораКонтаргента - "КураторДоговора".
ДоговорКонтрагента есть у 32 регистраторос(данные по метаданным), у других 59 их нету.

Надо получить что-то типа:
ВЫБРАТЬ
    ХозрасчетныйОстаткиИОбороты.Регистратор.ДоговорКонтрагента.КураторДоговора,
ИЗ
    РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(, , Регистратор, , , , ) КАК ХозрасчетныйОстаткиИОбороты

так вот, так как составной тип данных - "регистратор". Запрос преобразуется в левые соединения ко всем таблицам документов в которых есть данный реквизит и в которых нет данного реквизита.

Есть у меня вариант написать что-то вроде

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


Но по всем регистратором это писать можно и немного подустать...
Есть у кого - нибудь мнения как сделать... оптимизировано)
Всем спасибо.
1 MadHead
 
11.07.14
16:13
Читать метаданные и строить запрос динамически
2 Ministr
 
11.07.14
16:15
Точнее лучше скажите есть более оптимизированный путь ну и более менее читабельный.
Вариант соединения регистраторов левым соединениям а документам не предлагать запросы становятся не гуд , после таких издевательств.
3 Ministr
 
11.07.14
16:18
(1) У меня они все известны в заранее регистраторы возможные их 31 штука. плюс там отбор по счетам и не все документы могут писать, так что остается максимум штук 15 а может и того меньше, хотя они в базе у себя используют 4 вида документа, можно схитрить и написать на 4 вида, только вот если добавиться в учете 5 вид документа, придется переделывать, поэтому надо писать сразу универсально.. Но, чтобы и отчет строился не 10 минут.
(1) Да я к тому же на СКД это все проворачиваю, модуль объекта даже открывать не хочу, для различных костылейю Надо стандартными средствами писать
4 РазДва
 
11.07.14
16:20
(0) соедени по регистратору регистр, в котором есть договор
5 Ministr
 
11.07.14
16:22
(4) идею понял) Спасибо. Попробую протестирую.
6 Ministr
 
11.07.14
16:24
(4) еще вопрос, это даст выигрыш над конструкцией следующего вида:
ВЫРАЗИТЬ(Хорасчетный.Регистратор.ДоговорКонтрагента КАК Справочник.ДоговорыКонтрагентов).КураторДоговора
7 Ненавижу 1С
 
гуру
11.07.14
16:24
(0) Особенно хорошо это будет смотреться в документе "Корректировка долга", где Договор в ТЧ
(4) а толку, если Договор из регистратора берется? все равно тоже самое
8 РазДва
 
11.07.14
16:25
(6) такую конструкцию он уделает как тузик грелку )
9 alle68
 
11.07.14
16:27
А на субконто договора нет?
Что нужно в итоге получить?

P.S. Соединения явно можно и не писать - 1С сама сообразит, где есть договор, сделает 59 соединений... и будет долго-долго думать.
10 Ministr
 
11.07.14
16:27
(7) Да согласен будет весело). Придется отдельно собирать.
11 РазДва
 
11.07.14
16:28
(7) Ау, во втором регистре уже должен быть договор. По регистратору только соединение. Корректировками долга и прочими расшифровками платежа придётся пренебречь )
12 Ministr
 
11.07.14
16:29
(9) Аналитика по субконто - контрагенты, номенклатурные группы. И все. И договор только в регистраторе имеется.
13 Лефмихалыч
 
11.07.14
16:31
(0) вот тут достаточно подробно описано, почему у тебя ни чего не выходит
http://infostart.ru/print/184361/
14 Лефмихалыч
 
11.07.14
16:32
(0) надо как-то иначе задачу решать. Запрос к движениям РБ с отбором только по реквизитам регистраторов (причем туевой хучи регистраторов) нельзя написать так, чтобы он был эффективным
15 Ministr
 
11.07.14
16:33
(7) ВЫБРАТЬ
    ДоговорыКонтрагентов.КураторДоговора,
ИЗ
    РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(, , Регистратор, , , , ) КАК ХозрасчетныйОстаткиИОбороты
        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
        ПО ХозрасчетныйОстаткиИОбороты.Регистратор.ДоговорКонтрагента = ДоговорыКонтрагентов.Ссылка

Я понял ты предлагаешь вот таким образом сделать? Я тебя правильно понял?
16 Ministr
 
11.07.14
16:34
(7) - перепутал
Точнее(4)
17 Лефмихалыч
 
11.07.14
16:36
(15) это будет точно то же самое, что (0) - жопа
18 РазДва
 
11.07.14
16:40
(15)
Нет, я предлагаю типа:

ВЫБРАТЬ
    ДоговорыКонтрагентов.ДоговорКонтрагента.КураторДоговора,
ИЗ
    РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(, , Регистратор, , , , ) КАК ХозрасчетныйОстаткиИОбороты
        ЛЕВОЕ СОЕДИНЕНИЕ регистрнакопления.ВзаиморасчетыКонтрагентов КАК ДоговорыКонтрагентов
        ПО ХозрасчетныйОстаткиИОбороты.Регистратор = ДоговорыКонтрагентов.Регистратор
19 Ministr
 
11.07.14
16:45
(17) Вообщем чтобы было круто надо писать вторым способом как в (0). Только мегаконструкция получиться одного поля... таких полей штук 10, начиная от договора и заканчивая заказом(или сделка - реквизит регистратора)...

(15) Да согласен, азять из измерения другого регистра - это норм, можно сделать. Только регистры должны быть соответсвующие для такого решения.
20 Лефмихалыч
 
11.07.14
16:47
(19) чтобы было круто, надо придумать другое решение, исключающее получение данных из РБ с отобором по полям регистраторов
21 РазДва
 
11.07.14
17:01
(20) Решение с доп.регистром исключает. Например, в УПП подобная схема используется с помощью регистра списанные товары, в него напихали всё и сразу дабы не лезть в регистратор.
А вот кучка соединений к каждому регистратору совсем не круто, даже если они ограничены 31 штуками.