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

v7: Прямой запрос по дате и документам

v7: Прямой запрос по дате и документам
Я
   Rurouny
 
07.09.20 - 15:52
Как построить запрос по дате
Запрос в 1С
    Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса =
    "//{{ЗАПРОС(Сформировать)
    |Период с НачДата по КонДата;
    |Склад = Регистр.ОперСклады.Склад;
    |Товар = Регистр.ОперСклады.Товар;
    |Кол = Регистр.ОперСклады.КолЕдИзм1;
    |Док = Регистр.ОперСклады.ТекущийДокумент;
    |Функция КолНачОст = НачОст(Кол);
    |Функция КолПриход = Приход(Кол);
    |Функция КолРасход = Расход(Кол);
    |Функция КолРасходГП = Расход(Кол) когда(Найти(Док.Вид(),""ВыпускБР"")<>0);
    |Функция КолРасходГП1 = Расход(Кол) когда(Найти(Док.Вид(),""ВыпускБР"")=0);
    |Функция КолКонОст = КонОст(Кол);
    |Группировка День;
    |Группировка Товар без групп;
    |Условие((Склад В Склад1) или (Склад В Склад2));
    |"//}}ЗАПРОС
    ;



    ТекстЗапросаГП1 = "-- Это запрос по ГП
    |SELECT  
    |     '' [Документ_вид $ВидДокумента]
    |   , ОперСкладыОстаткиОбороты.Склад [Склад $Справочник.МестаХранения]
    |    , ОперСкладыОстаткиОбороты.Товар [Товар $Справочник.ТМЦ]
    |    , ОперСкладыОстаткиОбороты.Документ [Документ $Документ]
    |    , ОперСкладыОстаткиОбороты.КолЕдИзм1Расход AS КолРасходГП1
    |    , ОперСкладыОстаткиОбороты.КолЕдИзм1НачальныйОстаток
    |    , ОперСкладыОстаткиОбороты.КолЕдИзм1Приход  
    |    , ОперСкладыОстаткиОбороты.КолЕдИзм1Расход
    |    , ОперСкладыОстаткиОбороты.КолЕдИзм1КонечныйОстаток
    |   , ОперСкладыОстаткиОбороты.Период Период
    //тут трямая зависимомть если стоит 3-м условием *Документ* тогда отбор по Виду документа возможен !!!
    |FROM $РегистрОстаткиОбороты.ОперСклады(:НачДата,:КонДата,День,ДвиженияИГраницыПериода,,,(Склад, Товар, Документ),КолЕдИзм1) AS ОперСкладыОстаткиОбороты
    |   WHERE " + РегМест + РегТовар + "  
    |
    | UNION all
    |
    |SELECT  
    |     ОперСкладыОстаткиОбороты.ВидДокумента [Документ_вид $ВидДокумента]
    |   , ОперСкладыОстаткиОбороты.Склад [Склад $Справочник.МестаХранения]
    |    , ОперСкладыОстаткиОбороты.Товар [Товар $Справочник.ТМЦ]
    |    , ОперСкладыОстаткиОбороты.Документ [Документ $Документ]
    |    , ОперСкладыОстаткиОбороты.КолЕдИзм1Расход AS КолРасходГП1
    |    , ОперСкладыОстаткиОбороты.КолЕдИзм1НачальныйОстаток
    |    , ОперСкладыОстаткиОбороты.КолЕдИзм1Приход  
    |    , ОперСкладыОстаткиОбороты.КолЕдИзм1Расход
    |    , ОперСкладыОстаткиОбороты.КолЕдИзм1КонечныйОстаток
    |   , 0 AS Период
    |FROM $РегистрОстаткиОбороты.ОперСклады(:НачДата,:КонДата,Документ,ДвиженияИГраницыПериода,,,(Склад, Товар, Документ),КолЕдИзм1) AS ОперСкладыОстаткиОбороты
    |    WHERE  
    |     ((ОперСкладыОстаткиОбороты.ВидДокумента   <> "+РегДок+")
    |    OR (ОперСкладыОстаткиОбороты.ВидДокумента  <> "+РегДок1 +")
    |    OR (ОперСкладыОстаткиОбороты.ВидДокумента  <> "+РегДок2 +")
    |    OR (ОперСкладыОстаткиОбороты.ВидДокумента  <> "+РегДок3 +")
    |    OR (ОперСкладыОстаткиОбороты.ВидДокумента  <> "+РегДок4 +")
    |     OR (ОперСкладыОстаткиОбороты.ВидДокумента <> "+РегДок5 +")
    |     OR (ОперСкладыОстаткиОбороты.ВидДокумента <> "+РегДок6 +")
    |     OR (ОперСкладыОстаткиОбороты.ВидДокумента <> "+РегДок7 +")
    |     OR (ОперСкладыОстаткиОбороты.ВидДокумента <> "+РегДок8 +")
    |     OR (ОперСкладыОстаткиОбороты.ВидДокумента <> "+РегДок9 +")
    |" + ") and" + РегМест + РегТовар + "  
    //|GROUP BY Товар
    |";

Хотелось бы отобрать по виду документа и по дням их формирования
$РегистрОстаткиОбороты.<?>(<?>, <?>, <?>, <?>, <?>, <?>, <?>, <?>)
Виртуальная таблица остатков и оборотов
Синтаксис:
$РегистрОстаткиОбороты.<ИмяРегистра>([<НачалоПериода>][,
<КонецПериода>][, <Периодичность>][,<МетодДополнения>][,
<Соединение>][,<Условие>]
[,<Измерение>][,<Ресурс>]) [as <Алиас>]

<Периодичность> - можно задать или по Дню или по документу. Как отобрать и по тому и по другому.
   Ёпрст
 
1 - 07.09.20 - 15:55
не использовать вт останки и обороты. взять отдельно вт остатки и присоединить обороты с фильтрами на виддокумента
   Ёпрст
 
2 - 07.09.20 - 15:57
ну и соединять с журналом для даты. Если есть галка быстрой обработки движения, то журнал не нужен, всё и так есть в ra
   Mikeware
 
3 - 07.09.20 - 16:11
(1) в какой-то из ВТ (вроде, в классе ПоставщикДанных была ВТ, в которой можно было задать дополнение "на каждый день")
Ну а так да, задача классическая - "остатки на каждый день"
   Rurouny
 
4 - 07.09.20 - 16:41
(2) галка есть )
   Rurouny
 
5 - 07.09.20 - 17:30
А есть пример у кого такого запроса
   Ёпрст
 
6 - 07.09.20 - 17:38
(5) ну, для КонОст бери запрос к ВТ Останки, а для своего

 |Функция КолРасходГП = Расход(Кол) когда(Найти(Док.Вид(),""ВыпускБР"")<>0);

можешь тупо обращаться к табличке движения регистра, с фильтром на iddocdef (вид документа) и фильтр по дате ставить (date_time_iddoc)
эти поля уже будут в ra, коли галка стоит.

оба запроса в union all  и в подзапрос, на выходе всё группируешь и привет
   Ёпрст
 
7 - 07.09.20 - 17:41
Вот пример, без ВТ..
и без метапарсера имён
https://www.script-coding.com/v77tables.html#3.4.2.6.
   tgu82
 
8 - 07.09.20 - 21:16
(7) Забираю к себе. То что надо. Спасибо
   Mikeware
 
9 - 08.09.20 - 07:52
(8) анахрена? Чтоб жизнь медом не казалась?
   tgu82
 
10 - 08.09.20 - 08:11
(9) Ага. А то уж больно слащавая какай-то )
   Mikeware
 
11 - 08.09.20 - 08:15
(10) лучше возьми класс ПоставщикДанных, пиши запросы с его помощью, заодно привыкнешь к восьмерочным запросам.
ИМХО, сочетать надо полезное с приятным, а не бесполезное с отвратительным...
   Rurouny
 
12 - 08.09.20 - 13:41
SELECT
   Журнал.IDDOCDEF Док_вид,
   Журнал.IDDOC [Док $Документ],
    Док.sp13482 as [БР $Справочник.ТМЦ],
    БР.sp16474 as [Модель $Справочник.Модель],
    БР.sp16475 as [Рецептура $Справочник.Рецептура],
    Док.sp18247 as [ДокНорма $Документ.НормыРасхода],
    ДокС.sp13035 as [Материал $Справочник.ТМЦ],
    Sum(ДокС.sp13037) ПоФакту,
    Sum(ДокС.sp13039) КромПоФакту,
    Sum(ДокС.sp13041) ПромПоФакту,
    Sum(ДокС.sp13043) СлиткиПоФакту,
    Sum(ДокС.sp13774) as УгарПоФакту
FROM 
    _1SJOURN AS Журнал With (NOLOCK)
   INNER JOIN dh13034 AS Док on Журнал.IDDOC = Док.IDDOC
   INNER JOIN sc44 AS БР on БР.ID = Док.sp13482
   INNER JOIN dt13034 AS ДокС on Док.IDDOC = ДокС.IDDOC
WHERE
    Журнал.DATE_TIME_IDDOC BETWEEN '20200401' AND '20200430Z' and
    Журнал.IDDOCDEF = 13034 and
    Журнал.Closed & 1 = 1

UNION all

SELECT
   Журнал.IDDOCDEF Док_вид,
   Журнал.IDDOC [Док $Документ],
    Док.sp13482 as [БР $Справочник.ТМЦ],
    БР.sp16474 as [Модель $Справочник.Модель],
    БР.sp16475 as [Рецептура $Справочник.Рецептура],
    Док.sp18247 as [ДокНорма $Документ.НормыРасхода],
    ДокСЗ.sp13492 as [Материал $Справочник.ТМЦ],
    Sum(ДокСЗ.sp13495) ПоФакту,
    Sum(ДокСЗ.sp13497) КромПоФакту,
    Sum(ДокСЗ.sp13499) ПромПоФакту,
    Sum(ДокСЗ.sp13501) СлиткиПоФакту,
    0 as УгарПоФакту 
FROM 
    _1SJOURN AS Журнал With (NOLOCK)
   INNER JOIN dh13479 AS Док on Журнал.IDDOC = Док.IDDOC
   INNER JOIN sc44 AS БР on БР.ID = Док.sp13482
   INNER JOIN dt13479 AS ДокСЗ on Док.IDDOC = ДокСЗ.IDDOC
WHERE
    Журнал.DATE_TIME_IDDOC BETWEEN '20200401' AND '20200430Z' and
    Журнал.IDDOCDEF = 13479 and
    Журнал.Closed & 1 = 1
 
GROUP BY
    Журнал.IDDOCDEF,
    Журнал.IDDOC,
   Док.sp13482,
   БР.sp16474,
   БР.sp16475,
   Док.sp18247,
   ДокС.sp13035,   
   ДокСЗ.sp13492 

тз = рс.ВыполнитьИнструкцию(ТекстЗапроса);
{W:\ОАИП\ОБЩАЯ\ВЫПУСК БР.ERT(110)}: State 42S22, native 207, message [Microsoft][ODBC SQL Server Driver][SQL Server]Недопустимое имя столбца "sp13482".



По отдельности работает, а вместе нет В чем проблема ???
   Salimbek
 
13 - 08.09.20 - 13:52
(12) Док.sp13482 - это у тебя поле в документе. Только документы у тебя получаются разные, а поле ты берешь одно и то же.  
Посему выкинь обращение к полям через sp13482 а пиши $Док.Товар - или как там у тебя оно называется. Ну либо тщательнее смотри названия полей в зависимости от Вида Документа.
   Mikeware
 
14 - 08.09.20 - 13:53
(12) какая религия заставляет писать без использования метапарсера?
   trad
 
15 - 08.09.20 - 13:57
(14) например дергание из снеговика
   trad
 
16 - 08.09.20 - 13:58
(15) + но тут, да, не этот случай
   Sserj
 
17 - 08.09.20 - 14:00
(12) Без метапарсера это конечно круто, но таки:

в первой части:
select
..
  Док.sp13482
..
from
  INNER JOIN dh13479 AS Док
...

и во второй части:

select
..
  Док.sp13482
..
from
...
  INNER JOIN dh13479 AS Док
...

Тобишь Док однозначно на разные таблицы документов ссылается, а поле sp13482 у них одинаковое пишешь. Так не может быть все реквизитов уникальные.
   Sserj
 
18 - 08.09.20 - 14:01
+(17) В первой части: "..INNER JOIN dh13034 AS Док.."
   trad
 
19 - 08.09.20 - 14:03
если "По отдельности работает"
то скорее всего ТС пишет с метапарсером, просто сюда вывалил уже отпарсеный
   trad
 
20 - 08.09.20 - 14:05
(19) +
в таком случае, проблема в том, что в одном запросе нельзя применять одинаковые алиас для разных таблиц
метапарсер - он простой, семантику не умеет
   Sserj
 
21 - 08.09.20 - 14:05
(19) Что-то он не договаривает или не так проверяет по отдельности. Не может оно все работать. Один из двух запросов должне на sp13482 ругаться.
   trad
 
22 - 08.09.20 - 14:07
т.е.

select
..
  Док1.БР
..
from
  INNER JOIN $Документ.ВидА AS Док1
...

и во второй части:

select
..
  Док2.БР
..
from
...
  INNER JOIN $Документ.ВидБ AS Док2
   trad
 
23 - 08.09.20 - 14:07
$Док1.БР и $Док2.БР конечно
   trad
 
24 - 08.09.20 - 14:08
(21) если первый запрос выполняет отдельно и через метапарсер, то вычисляется не sp13482
   trad
 
25 - 08.09.20 - 14:11
(24) + а когда выполняет вместе, в мозгах метапарсера за алиасом Док закреплен только $Документ.ВидБ, и на втором проходе поле (вверху и внизу) вычисляется по этому виду документа
   Rurouny
 
26 - 08.09.20 - 14:34
В 1С запрос написан так 


    ТекстЗапроса = "
    |SELECT
    |   Журнал.IDDOCDEF Док_вид,
    |   Журнал.IDDOC [Док $Документ],
    |    $Док.БР as [БР_0 $Справочник.ТМЦ],
    |    $БР_.Модель as [Модель $Справочник.Модель],
    |    $БР_.Рецептура1 as [Рецептура $Справочник.Рецептура],
    |    $Док.ДокНорма as [ДокНорма $Документ.НормыРасхода],
    //|    Sum($Док.Выпуск) Выпуск,

    //|    Sum($Док.КолОтхКром) КолКром,

    //|    Sum($Док.КолОтхПром) КолПром,

    //|    Sum($Док.КолОтхСлитки) + Sum($Док.КолОтхСлитки1) as КолСлитки,

    //|    Sum($Док.Угар) Угар,

    |    $ДокС.Материал as [Материал $Справочник.ТМЦ],
    |    Sum($ДокС.ПоФакту) ПоФакту,
    |    Sum($ДокС.ОтхКромПоФакту) КромПоФакту,
    |    Sum($ДокС.ОтхПромПоФакту) ПромПоФакту,
    |    Sum($ДокС.СлиткиПоФакту) СлиткиПоФакту,
    |    Sum($ДокС.УгарПоФакту) as УгарПоФакту
    |FROM 
    |    _1SJOURN AS Журнал With (NOLOCK)
    |   INNER JOIN $Документ.ВыпускБР AS Док on Журнал.IDDOC = Док.IDDOC
    |   INNER JOIN $Справочник.ТМЦ AS БР_ on БР_.ID = $Док.БР
    |   INNER JOIN $ДокументСтроки.ВыпускБР AS ДокС on Док.IDDOC = ДокС.IDDOC
    |WHERE 
    |    Журнал.DATE_TIME_IDDOC BETWEEN :НачДата AND :КонДата~ and
    |    Журнал.IDDOCDEF = $ВидДокумента.ВыпускБР and
    |    Журнал.Closed & 1 = 1
    |
    |UNION all
    |
    |SELECT
    |   Журнал.IDDOCDEF Док_вид,
    |   Журнал.IDDOC [Док $Документ],
    |    $Док.БР as [БР_0 $Справочник.ТМЦ],
    |    $БРЗ.Модель as [Модель $Справочник.Модель],
    |    $БРЗ.Рецептура1 as [Рецептура $Справочник.Рецептура],
    |    $Док.ДокНорма as [ДокНорма $Документ.НормыРасхода],
    //|    Sum($Док.Выпуск) Выпуск,

    //|    Sum($Док.КолОтхКром) КолКром,

    //|    Sum($Док.КолОтхПром) КолПром,

    //|    Sum($Док.КолОтхСлитки) as КолСлитки,

    //|    Sum(0) Угар,

    |    $ДокСЗ.Материал as [Материал $Справочник.ТМЦ],
    |    Sum($ДокСЗ.ПоФакту) ПоФакту,
    |    Sum($ДокСЗ.ОтхКромПоФакту) КромПоФакту,
    |    Sum($ДокСЗ.ОтхПромПоФакту) ПромПоФакту,
    |    Sum($ДокСЗ.СлиткиПоФакту) СлиткиПоФакту,
    |    0 as УгарПоФакту 
    |FROM 
    |    _1SJOURN AS Журнал With (NOLOCK)
    |   INNER JOIN $Документ.ВыпускБРзапуска AS Док on Журнал.IDDOC = Док.IDDOC
    |   INNER JOIN $Справочник.ТМЦ AS БРЗ on БРЗ.ID = $Док.БР
    |   INNER JOIN $ДокументСтроки.ВыпускБРЗапуска AS ДокСЗ on Док.IDDOC = ДокСЗ.IDDOC
    |WHERE 
    |    Журнал.DATE_TIME_IDDOC BETWEEN :НачДата AND :КонДата~ and
    |    Журнал.IDDOCDEF = $ВидДокумента.ВыпускБРЗапуска and
    |    Журнал.Closed & 1 = 1
    |";
    
    Если ПустоеЗначение(ВыбБР) = 0 Тогда 
        Если ВыбБР.ЭтоГруппа() = 1 Тогда
            ТекстЗапроса = ТекстЗапроса + "
            | and $Док.БР in (SELECT Val FROM #ВыбБР)
            |";
            рс.УложитьСписокОбъектов(ВыбБР, "#ВыбБР", "ТМЦ");
        Иначе
            ТекстЗапроса = ТекстЗапроса + "
            | and $Док.БР = :ВыбБР
            |";
            рс.УстановитьТекстовыйПараметр("ВыбБР", ВыбБР);
        КонецЕсли;
    КонецЕсли;
    
    ТекстЗапроса = ТекстЗапроса + " 
    |GROUP BY
    |    Журнал.IDDOCDEF,
    |    Журнал.IDDOC,
    |   $Док.БР,
    |   $БР_.Модель,
    |   $БР_.Рецептура1,
    |   $БРЗ.Модель,
    |   $БРЗ.Рецептура1,
    |   $Док.ДокНорма,
    |   $ДокСЗ.Материал,   
    |   $ДокС.Материал 
    |";
    Сообщить(ТекстЗапроса);
    рс.УстановитьТекстовыйПараметр("НачДата", НачДата);
    рс.УстановитьТекстовыйПараметр("КонДата", КонДата);
    рс.Отладка(1);
   Ёпрст
 
27 - 08.09.20 - 14:39
(26) из второго запроса выкини всю типизацию к едрени фени
   Ёпрст
 
28 - 08.09.20 - 14:39
всё что после юниона не должно иметь этого 
 [Док $Документ],...и остальные поля
   trad
 
29 - 08.09.20 - 14:52
(26) ответ дан в  (20)
   trad
 
30 - 08.09.20 - 14:52
а в (22) написано как надо
 
 Рекламное место пустует
   trad
 
31 - 08.09.20 - 14:56
это чтоб запрос заработал
Но по сути запрос не верный, с отбором и групбаем туфта полная
   Sserj
 
32 - 08.09.20 - 15:47
А почему тема начиналась с запроса по регистрам, а теперь стала по журналу. Не осилил регистры? Может вернуться к первоначальному, так как по регистрам однозначно быстрее будет.
   Rurouny
 
33 - 09.09.20 - 08:27
(32) вернусь к регистру )) так как многие отчеты на регистрах. но это не надолго скоро переход на ERP
   Mikeware
 
34 - 09.09.20 - 08:46
(33) чот вангуется мне, что если вы тут запрос написать не можете, то и в erp будет примерно так же...
   Ёпрст
 
35 - 09.09.20 - 09:15
(34) там же всё из коробки !
)
   Mikeware
 
36 - 09.09.20 - 09:16
(35) дык галочки не там расставят!
   Rurouny
 
37 - 14.09.20 - 08:58
С запросом разобрался, сделал через конструктор и без проблем, и то что с коробки ERP  и галочки уже расставили, так же уже допилили половину документов под себя, пишем арм для линий, а это, что в 1С7.7 прямые запросы просто через ж.. все сделано (тупо нужно было время переключиться на ПрямЗапр 1С), пишу запросы на MSSQL, MySQL, Firebird и все без проблем. (36) так, что не сцы, сертификаты по ерп имеем и знаем, что и где расставлять. И из коробки там ни хрена нет, все в ручном режиме делается (нужно допиливать многое), всем МИРА.
   ДенисЧ
 
38 - 14.09.20 - 09:02
ИНтересно, в каком больном мозгу могла возникнуть связь между ЕРП и прямыми запросами в 77...
   Mikeware
 
39 - 14.09.20 - 09:13
(38) оно обиделось.


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