Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 7.7 и ранее

v7: Прямой запрос 1С 7.7 SQL

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

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

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

 
Фирма = Регистр.ОстаткиТоваров.Документ.Фирма;
          //или даже так:

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

          // потом писал условие:

Условие(РаздУчет=ВыбФирма.РаздельныйУчет)


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

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

а как наложить фильтр по Фирма.РаздельныйУчет ?
Неужели запросом получать список Документов, имеющих нужное значение общего реквизита Фирма.РаздельныйУчет, а потом
этот список использовать в фильтре указанного Запроса?
   ДенисЧ
 
1 - 16.06.20 - 14:14
Если это общий реквизит с установленным отбором - то в _1sjourn по iddoc лезть.
Иначе тупо список левых джойнов.
   Ёпрст
 
2 - 16.06.20 - 14:17
(0) Измерение документ ?
И он еще поди = документ движения, угадал ?
   Radeoff
 
3 - 16.06.20 - 14:41
(2) Да, измерение "Документ", тут обсдалася, давно писал, потом в ДБФ косяков из-за этого не встречал, поэтому не переписывал...
Флаг отбора движений не установлен, если Вы об этом
   Ёпрст
 
4 - 16.06.20 - 14:44
(3) нет не об этом, если в это измерение пишется докумнт движения, то имеем  незакрытый регистр, который пухнет с геометрической прогрессией
   Radeoff
 
5 - 16.06.20 - 14:51
(4) тогда нет, имеем закрытый регистр, если предопределенное имя все же где-то гадит, можно переименовать измерение в Приход, или Партия
   Radeoff
 
6 - 16.06.20 - 17:20
(1) Правильно ли понимаю, что таким образом мы получим список всех документов (или определенного вида) по данной Фирме,
и, как и говорил, полученные документы в этом подзапросе используем в запросе по остаткам?
Если так, то мне кажется это не совсем правильным - в этот отбор попадут документы, по которым нет и остатка на данный момент, и период там не используешь.
Тогда, наверное, лучше уж получить все остатки по Документам, а потом Документы отобрать по нужной Фирме (реквизиту Фирмы).
Так ли?
   Дык ё
 
7 - 16.06.20 - 17:32
(6) если кучу левых джойнов не хочешь, можно еще графу отбора по фирме сделать. тогда будет один джойн с _1crcdoc или как там её
   Дык ё
 
8 - 16.06.20 - 17:34
+ (6) ну и группировка в твоем запросе не нужна, виртуальная таблица сама группирует
   Radeoff
 
9 - 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) такая структура, да ?
   tgu82
 
13 - 19.06.20 - 08:04
(0) Китайская грамота - жаль что я не китаец ).
Надо изучать этот космос
   tgu82
 
14 - 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
   tgu82
 
17 - 19.06.20 - 08:16
(15) Спасибо.
ВТ - это временная таблица?
Ее вооще-то курсором называют еслим не память не изменяет
   Ёпрст
 
18 - 19.06.20 - 08:18
(17) в данном случае, ВТ это виртуальная таблица  $РегистрОстатки.ОстаткиТоваров
   tgu82
 
19 - 19.06.20 - 08:38
(18) Понятно. Спасибо
   Radeoff
 
20 - 19.06.20 - 12:31
(10) Да, верно, списываю по ФИФО
   Radeoff
 
21 - 19.06.20 - 12:32
(12) Нет, раньше уже написал, что Документ - это Партия. По ФИФО идет списание, по партиям товара.
   Radeoff
 
22 - 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 тоже выкини последнее
   Radeoff
 
25 - 19.06.20 - 12:49
(24) Яволь, спасиб, посмотрю


Список тем форума
Рекламное место пустует  Рекламное место пустует
2 + 2 = 3.9999999999999999999999999999999...
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.