Имя: Пароль:
1C
1C 7.7
v7: Прямой запрос 1С 7.7 SQL
0 Radeoff
 
16.06.20
14:10
Всем - здравствовать

Перевел базу 7.7 под SQL и черные запросы стали ощутимо тормозить.
Не мог бы кто помочь советом?
Нужно систему понять
Например, получаю оперативные остатки на дату по регистру ОстаткиТоваров.
(База - пысанная от нуля)
Проблема в том, что мне нужно сделать фильтр по общему реквизиту - Фирма (тип Справочник), который не является измерением Регистра.

Измерением является поле "Документ" (тип Документ неопр.вида)
Раньше в "черном запросе" писал определение:


Фирма = Регистр.ОстаткиТоваров.Документ.Фирма;
           //или даже так:
РаздУчет = Регистр.ОстаткиТоваров.Документ.Фирма.РаздельныйУчет;            
           //(где РаздУчет - 0 или 1)
           // потом писал условие:
Условие(РаздУчет=ВыбФирма.РаздельныйУчет)


и достаточно быстро это работало. А как в прямых запросах?
Сделал простое:


    рс = СоздатьОбъект("ODBCRecordset");
    ТекстЗапроса = "-- qryMaker:ОстаткиПоСкладу.2020.06.06.12.19.37
        |SELECT ОстаткиТоваровОстатки.Товар [Товар $Справочник.Номенклатура]
        |    , Sum(ОстаткиТоваровОстатки.КоличествоОстаток) AS Ост
        |FROM $РегистрОстатки.ОстаткиТоваров(,,
        |        (Товар IN (SELECT Val FROM #Товары))
        |        AND (Склад = :вСклад),
        |        Товар,
        |        Количество) AS ОстаткиТоваровОстатки
        |GROUP BY ОстаткиТоваровОстатки.Товар
        |";
    рс.УложитьСписокОбъектов(СпТовара, "#Товары");
    рс.УстановитьТекстовыйПараметр("вСклад", вСклад);


а как наложить фильтр по Фирма.РаздельныйУчет ?
Неужели запросом получать список Документов, имеющих нужное значение общего реквизита Фирма.РаздельныйУчет, а потом
этот список использовать в фильтре указанного Запроса?
1 ДенисЧ
 
16.06.20
14:14
Если это общий реквизит с установленным отбором - то в _1sjourn по iddoc лезть.
Иначе тупо список левых джойнов.
2 Ёпрст
 
16.06.20
14:17
(0) Измерение документ ?
И он еще поди = документ движения, угадал ?
3 Radeoff
 
16.06.20
14:41
(2) Да, измерение "Документ", тут обсдалася, давно писал, потом в ДБФ косяков из-за этого не встречал, поэтому не переписывал...
Флаг отбора движений не установлен, если Вы об этом
4 Ёпрст
 
16.06.20
14:44
(3) нет не об этом, если в это измерение пишется докумнт движения, то имеем  незакрытый регистр, который пухнет с геометрической прогрессией
5 Radeoff
 
16.06.20
14:51
(4) тогда нет, имеем закрытый регистр, если предопределенное имя все же где-то гадит, можно переименовать измерение в Приход, или Партия
6 Radeoff
 
16.06.20
17:20
(1) Правильно ли понимаю, что таким образом мы получим список всех документов (или определенного вида) по данной Фирме,
и, как и говорил, полученные документы в этом подзапросе используем в запросе по остаткам?
Если так, то мне кажется это не совсем правильным - в этот отбор попадут документы, по которым нет и остатка на данный момент, и период там не используешь.
Тогда, наверное, лучше уж получить все остатки по Документам, а потом Документы отобрать по нужной Фирме (реквизиту Фирмы).
Так ли?
7 Дык ё
 
16.06.20
17:32
(6) если кучу левых джойнов не хочешь, можно еще графу отбора по фирме сделать. тогда будет один джойн с _1crcdoc или как там её
8 Дык ё
 
16.06.20
17:34
+ (6) ну и группировка в твоем запросе не нужна, виртуальная таблица сама группирует
9 Radeoff
 
19.06.20
00:59
Всем спасибо.
Решение (подробное, а не в общих чертах), если кому-то такому же ушастому, как я, понадобится


    |SELECT ОстаткиТоваровОстатки.Товар [Товар $Справочник.Номенклатура]
    |, ОстаткиТоваровОстатки.Склад [Склад $Справочник.МестаХранения]
    |, ОстаткиТоваровОстатки.Документ [Документ $Документ]
    |, ОстаткиТоваровОстатки.КоличествоОстаток
    |, ОстаткиТоваровОстатки.СтоимостьОстаток
    |, Журнал.$ОбщийРеквизит.Фирма [Фирма $Справочник.Фирмы]
    |FROM $РегистрОстатки.ОстаткиТоваров(,
    |    INNER JOIN _1SJOURN AS Журнал With (NOLOCK) ON RIGHT(Документ, 9) = Журнал.IDDOC,
    |    (Журнал.$ОбщийРеквизит.Фирма = :ВыбФирма),,) AS ОстаткиТоваровОстатки
    |INNER JOIN _1SJOURN AS Журнал With (NOLOCK) ON RIGHT(ОстаткиТоваровОстатки.Документ, 9) = Журнал.IDDOC
    |WHERE (Журнал.$ОбщийРеквизит.Фирма = :ВыбФирма)
10 Злопчинский
 
19.06.20
03:06
(5) то есть остатки товаров при расходе ты списываешь типа по фифо с документов?
11 Ёпрст
 
19.06.20
08:01
(9) один иннер лишний
12 Ёпрст
 
19.06.20
08:04
(10) нет..  у него так в регистре, на сколько я понял

Приход
  Документ Склад Товар Количество

ПоступлениеТМЦ  ОсновнойСклад Валенки 10

Расход
Реализация ОсновнойСклад Валенки 10

Т.е в измерение Документ он пишет документ движения, а не партиобразующий документ..

(9) такая структура, да ?
13 tgu82
 
19.06.20
08:04
(0) Китайская грамота - жаль что я не китаец ).
Надо изучать этот космос
14 tgu82
 
19.06.20
08:09
(11) [NOLOCK] - для чего нужно?
И еще а почему один иннер лишний?
15 Ёпрст
 
19.06.20
08:12
(14)
1.https://docs.microsoft.com/ru-ru/sql/t-sql/queries/hints-transact-sql-table?view=sql-server-ver15
2.потому, что ВТ уже отфильтрована первым .
16 Ёпрст
 
19.06.20
08:16
17 tgu82
 
19.06.20
08:16
(15) Спасибо.
ВТ - это временная таблица?
Ее вооще-то курсором называют еслим не память не изменяет
18 Ёпрст
 
19.06.20
08:18
(17) в данном случае, ВТ это виртуальная таблица  $РегистрОстатки.ОстаткиТоваров
19 tgu82
 
19.06.20
08:38
(18) Понятно. Спасибо
20 Radeoff
 
19.06.20
12:31
(10) Да, верно, списываю по ФИФО
21 Radeoff
 
19.06.20
12:32
(12) Нет, раньше уже написал, что Документ - это Партия. По ФИФО идет списание, по партиям товара.
22 Radeoff
 
19.06.20
12:41
(13) Китайцами не рождаются - ими становятся !!!
http://script-coding.com/Direct_queries.html#3.2.
23 Ёпрст
 
19.06.20
12:43
(21) ну тогда ладно, см . (11)
24 Ёпрст
 
19.06.20
12:43
и where тоже выкини последнее
25 Radeoff
 
19.06.20
12:49
(24) Яволь, спасиб, посмотрю
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.