Имя: Пароль:
1C
1C 7.7
v7: Прямой запрос по дате и документам
0 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
3 Mikeware
 
07.09.20
16:11
(1) в какой-то из ВТ (вроде, в классе ПоставщикДанных была ВТ, в которой можно было задать дополнение "на каждый день")
Ну а так да, задача классическая - "остатки на каждый день"
4 Rurouny
 
07.09.20
16:41
(2) галка есть )
5 Rurouny
 
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.
8 tgu82
 
07.09.20
21:16
(7) Забираю к себе. То что надо. Спасибо
9 Mikeware
 
08.09.20
07:52
(8) анахрена? Чтоб жизнь медом не казалась?
10 tgu82
 
08.09.20
08:11
(9) Ага. А то уж больно слащавая какай-то )
11 Mikeware
 
08.09.20
08:15
(10) лучше возьми класс ПоставщикДанных, пиши запросы с его помощью, заодно привыкнешь к восьмерочным запросам.
ИМХО, сочетать надо полезное с приятным, а не бесполезное с отвратительным...
12 Rurouny
 
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".



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

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

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

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

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

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

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

select
..
  Док2.БР
..
from
...
  INNER JOIN $Документ.ВидБ AS Док2
23 trad
 
08.09.20
14:07
$Док1.БР и $Док2.БР конечно
24 trad
 
08.09.20
14:08
(21) если первый запрос выполняет отдельно и через метапарсер, то вычисляется не sp13482
25 trad
 
08.09.20
14:11
(24) + а когда выполняет вместе, в мозгах метапарсера за алиасом Док закреплен только $Документ.ВидБ, и на втором проходе поле (вверху и внизу) вычисляется по этому виду документа
26 Rurouny
 
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
всё что после юниона не должно иметь этого
[Док $Документ],...и остальные поля
29 trad
 
08.09.20
14:52
(26) ответ дан в  (20)
30 trad
 
08.09.20
14:52
а в (22) написано как надо
31 trad
 
08.09.20
14:56
это чтоб запрос заработал
Но по сути запрос не верный, с отбором и групбаем туфта полная
32 Sserj
 
08.09.20
15:47
А почему тема начиналась с запроса по регистрам, а теперь стала по журналу. Не осилил регистры? Может вернуться к первоначальному, так как по регистрам однозначно быстрее будет.
33 Rurouny
 
09.09.20
08:27
(32) вернусь к регистру )) так как многие отчеты на регистрах. но это не надолго скоро переход на ERP
34 Mikeware
 
09.09.20
08:46
(33) чот вангуется мне, что если вы тут запрос написать не можете, то и в erp будет примерно так же...
35 Ёпрст
 
09.09.20
09:15
(34) там же всё из коробки !
)
36 Mikeware
 
09.09.20
09:16
(35) дык галочки не там расставят!
37 Rurouny
 
14.09.20
08:58
С запросом разобрался, сделал через конструктор и без проблем, и то что с коробки ERP  и галочки уже расставили, так же уже допилили половину документов под себя, пишем арм для линий, а это, что в 1С7.7 прямые запросы просто через ж.. все сделано (тупо нужно было время переключиться на ПрямЗапр 1С), пишу запросы на MSSQL, MySQL, Firebird и все без проблем. (36) так, что не сцы, сертификаты по ерп имеем и знаем, что и где расставлять. И из коробки там ни хрена нет, все в ручном режиме делается (нужно допиливать многое), всем МИРА.
38 ДенисЧ
 
14.09.20
09:02
ИНтересно, в каком больном мозгу могла возникнуть связь между ЕРП и прямыми запросами в 77...
39 Mikeware
 
14.09.20
09:13
(38) оно обиделось.
40 МихаилМ
 
28.09.20
17:19
как то не стыкуется "пишу запросы на MSSQL, MySQL, Firebird "

и


WHERE  
    |     ((ОперСкладыОстаткиОбороты.ВидДокумента   <> "+РегДок+")
    |    OR (ОперСкладыОстаткиОбороты.ВидДокумента  <> "+РегДок1 +")
    |    OR (ОперСкладыОстаткиОбороты.ВидДокумента  <> "+РегДок2 +")
    |    OR (ОперСкладыОстаткиОбороты.ВидДокумента  <> "+РегДок3 +")
    |    OR (ОперСкладыОстаткиОбороты.ВидДокумента  <> "+РегДок4 +")
    |     OR (ОперСкладыОстаткиОбороты.ВидДокумента <> "+РегДок5 +")
    |     OR (ОперСкладыОстаткиОбороты.ВидДокумента <> "+РегДок6 +")
    |     OR (ОперСкладыОстаткиОбороты.ВидДокумента <> "+РегДок7 +")
    |     OR (ОперСкладыОстаткиОбороты.ВидДокумента <> "+РегДок8 +")
    |     OR (ОперСкладыОстаткиОбороты.ВидДокумента <> "+РегДок9 +")

к тому же
Журнал.Closed & 1 = 1  убивает обращение к индексу
41 trdm
 
28.09.20
17:32
(14) > какая религия заставляет писать без использования метапарсера?
Да у него просто нет скрипта SQLIntellisence.vbs %)
Программист всегда исправляет последнюю ошибку.