Имя: Пароль:
1C
1C 7.7
v7: Прямые запросы. Таблица остатков, с отбором
0 Oblako486
 
25.07.14
14:37
|ВЫБРАТЬ
|    $РегПокупатели.Договор КАК [Договор $Справочник.Договоры],
|    $РегПокупатели.КоличествоОстаток КАК Количество    
|ИЗ
|    РегистрОстатки.Покупатели(,
|           INNER JOIN $Справочник.Договоры КАК СпрД ON
|                   СпрД.ID =  Договор AND
|            $СпрД.Владелец = :впКонтрагент,
|            ,
|            (Договор),(Количество)) КАК РегПокупатели";
Ошибка: Meta name parser error: неизвестное метаимя или алиас "$РегПокупатели"
1 lamme
 
25.07.14
14:40
а что - думаешь оно  в 1С7 так называется ?
есть констурктор прямых запросов для 1С7
2 Oblako486
 
25.07.14
14:41
(1) дай ссылку
3 lamme
 
25.07.14
14:42
искать надо
давно было

уж извини

1Срр по-моему там где-то
или в яндексе -
1С7 прямые запросы
4 trad
 
25.07.14
14:44
|    РегПокупатели.Договор КАК [Договор $Справочник.Договоры],
|    РегПокупатели.КоличествоОстаток КАК Количество

я так думаю
5 Эльниньо
 
25.07.14
16:46
Без КАК никак?
6 ДенисЧ
 
25.07.14
16:47
Наверное, этот тупой SQL не понимает твоего КАК...
7 trad
 
25.07.14
16:50
(5) можно и без КАК, но у автора не в этом проблема
8 trad
 
25.07.14
16:50
(6) до SQL дело не доходит, еще на подступах его Meta name parser рубит
9 Ёпрст
 
25.07.14
16:51
+7 это точно, не все пишут прямой запрос, используя класс ПрямойЗапрос.
10 AleksAnt
 
25.07.14
16:51
|Select
|    РегПокупатели.Договор as [Договор $Справочник.Договоры],
|    РегПокупатели.КоличествоОстаток as Количество    
|From
.....
11 spock
 
25.07.14
16:54
Петросяны :-)
12 Oblako486
 
25.07.14
17:07
(4) я попробовал. Ошибка такая: Meta name parser error: неизвестное метаимя или алиас "$SC204"
Я думаю проблема во внутреннем запросе, поэтому Псевдоним не назначается.
13 Oblako486
 
25.07.14
17:11
(11) Я пользовался этой инструкций для вирт таблиц остатков http://www.script-coding.com/Direct_queries.html#4.2.
Может быть есть у кого-нибудь пример?
14 Ёпрст
 
25.07.14
17:13
(13) для начала, надо поведать миру через что ты пытаешься выполнить запрос - через класс.ПрямойЗапрос или через одбсрекорсет
15 Ёпрст
 
25.07.14
17:13
отсюда будет разный синтаксис текста запроса
16 Oblako486
 
25.07.14
17:44
(14) через класс ПрямойЗапрос.
17 Ёпрст
 
25.07.14
17:53
(16) тогда ответ в (4)
18 Oblako486
 
25.07.14
18:04
(17) для (4) ошибка в (12)
19 trad
 
25.07.14
18:10
(18) в этом архиве
http://www.1cpp.ru/forumfiles/Attachments/Query_ExtTF_other_001.zip
есть файл
ПрямойЗапрос.doc
в нем годная документация
20 Голубушка
 
25.07.14
18:27
|SELECT
//|SELECT TOP 10
|    'РозничныйПокупатель' AS Клиент,
|   0 AS ЭтоПодарочныйСертификат,
|   '' AS Подразделение,
|    РегЦенныеБумаги.Клиент AS [КлиентОтбор $Справочник.Контрагенты],
|    РегЦенныеБумаги.НомерЦБ as КартаЛояльности,
|    FLOOR(РегЦенныеБумаги.БаллыОстаток) as Баллы,
|    FLOOR(РегЦенныеБумаги.БаллыОстаток)*(:Курс) as Сумма
//|    СуммаОстаток as Сумма
|FROM
|    $РегистрОстатки.ЦенныеБумаги(:ВыбДата~,,Клиент=:ВыбКлиент,(Клиент,НомерЦБ),(Баллы,Сумма)) AS РегЦенныеБумаги
|WHERE РегЦенныеБумаги.БаллыОстаток  <> 0 ";

вот пример
21 Голубушка
 
25.07.14
18:30
RS = СоздатьОбъект("ODBCRecordSet");
RS.УстБД1С();


RS.УстановитьТекстовыйПараметр("ПодтвРез", Перечисление.ВидыРезервов.ПодтвержденныйРезерв);
RS.УстановитьТекстовыйПараметр("ПоСчетуРез", Перечисление.ВидыРезервов.ПоСчету);
RS.УстановитьТекстовыйПараметр("ЗаказТовараРез", Перечисление.ВидыРезервов.ЗаказТовара);
RS.УстановитьТекстовыйПараметр("ВыбДата", Параметры.ДатаВводаОстатков);

ТекстЗапросаПоРезервам = "
//|SELECT TOP 5
|SELECT
|    РегРезервов.ВидРезерва AS [ВидРезерва $Перечисление.ВидыРезервов],
|    РегРезервов.ПоСчету AS [ПоСчету $Документ],
|    РегРезервов.Склад AS [Склад $Справочник.МестаХранения],
|    РегРезервов.Товар AS [Номенклатура $Справочник.Номенклатура],
|   РегРезервов.РезервТовараОстаток as Количество,
|    Док.Цена,
|    (Док.Цена * РегРезервов.РезервТовараОстаток) AS Сумма,
|    (Док.Цена * РегРезервов.РезервТовараОстаток) AS СуммаСНДС
|FROM
|    $РегистрОстатки.РезервыТоваров(:ВыбДата~,,(ВидРезерва=:ПодтвРез OR ВидРезерва=:ПоСчетуРез OR ВидРезерва=:ЗаказТовараРез),(ВидРезерва,ПоСчету,Склад,Товар),(РезервТовара)) as РегРезервов
|Left JOIN (
|    SELECT
|        Д1.IDDoc AS IDDoc,
|        $Д1.Товар AS Т,
|        $Д1.Цена AS Цена
|        FROM
|        $ДокументСтроки.Счет as Д1
|) AS Док
|    ON
|    Док.IDDoc = Right(РегРезервов.ПоСчету,9)
|AND
|    Док.Т = РегРезервов.Товар
|";


Состояние("Выполняем запрос по резервам");
ТЗ = RS.ВыполнитьИнструкцию(ТекстЗапросаПоРезервам);
ТЗ.Сортировать("+ПоСчету");

вот еще

убери $  при выборе полей .. все должно работать
22 Голубушка
 
25.07.14
18:31
http://www.script-coding.com/Direct_queries.html#4.2.

самое то что нужно
23 ikea
 
26.07.14
00:18
|SELECT
|    $РегПокупатели.Договор AS [Договор $Справочник.Договоры],
|    $РегПокупатели.КоличествоОстаток AS Количество    
|FROM
|    РегистрОстатки.Покупатели(,
|           INNER JOIN $Справочник.Договоры  AS СпрД ON
|                   СпрД.ID =  Договор AND
|            $СпрД.ParentExt= :впКонтрагент,
|            ,
|            (Договор),(Количество)) AS РегПокупатели";
24 Oblako486
 
28.07.14
09:19
(21) Твои оба примера не очень хорошие, потому что ты не используешь второй параметр виртуальной таблицы, в котором у меня ошибка.
25 Oblako486
 
28.07.14
09:41
(23) Из это инструкции я понял, что условие лучше заключать в круглые скобки, но примера с условием нет.
26 Oblako486
 
28.07.14
09:42
(19)  Из это инструкции я понял, что условие лучше заключать в круглые скобки, но примера с условием нет.
27 Oblako486
 
28.07.14
09:43
(23) Все равно не работает
|SELECT
|    $РегПокупатели.Договор AS [Договор |$Справочник.Договоры],    
|    $РегПокупатели.КоличествоОстаток AS Количество    
|FROM
|    РегистрОстатки.Покупатели(,
|           (INNER JOIN $Справочник.Договоры  AS СпрД ON
|                   СпрД.ID =  Договор AND
|            $СпрД.ParentExt= :впКонтрагент),
|            ,
|            (Договор),(Количество)) AS РегПокупатели,
Число БезПодготовки=0) : Meta name parser error: неизвестное метаимя или алиас "$РегПокупатели"
28 Oblako486
 
28.07.14
09:47
(4) Если без $ то вот
|SELECT
|    РегПокупатели.Договор AS [Договор |$Справочник.Договоры],    
|    РегПокупатели.КоличествоОстаток AS Количество    
|FROM
|    РегистрОстатки.Покупатели(,
|           (INNER JOIN $Справочник.Договоры  AS СпрД ON
|                   СпрД.ID =  Договор AND
|            $СпрД.ParentExt= :впКонтрагент),
|            ,
|            (Договор),(Количество)) AS РегПокупатели,
Число БезПодготовки=0) : Meta name parser error: неизвестное |метаимя или алиас "$SC204"
29 Дык ё
 
28.07.14
09:48
(27) это нормально :-) к (4) добавь символ $ перед РегистрОстатки.
30 Дык ё
 
28.07.14
09:48
+(29) а лучше забей на ПрямойЗапрос и используй конструктор
31 Oblako486
 
28.07.14
09:55
(30)Добавил $
|SELECT
|    $РегПокупатели.Договор AS [Договор $Справочник.Договоры],    
|    $РегПокупатели.КоличествоОстаток AS Количество    
|FROM
|    $РегистрОстатки.Покупатели(,
|           (INNER JOIN $Справочник.Договоры  AS СпрД ON
|                   СпрД.ID =  Договор AND
|            $СпрД.ParentExt= :впКонтрагент),
|            ,
|            (Договор),(Количество)) AS РегПокупатели";

ПрямойЗапрос::Остатки_РегистрОстатки_SQL(АссоциативныйВектор ВекторВыражения=) : Не существует ресурса: Договор
ИмяПоляТаблицы = "sp"+МетаДата.ИДРесурсаРегистра(ИдентификаторРегистра,ИдентификаторРесурса);
32 Oblako486
 
28.07.14
09:55
(30) Дай ссылку на конструктор
33 Oblako486
 
28.07.14
10:28
(31) Договор перенес на одну запятую раньше.
|ВЫБРАТЬ
|    $РегПокупатели.Договор AS [Договор $Справочник.Договоры],    
|    $РегПокупатели.СуммаРубОстаток AS Сумма    
|FROM
|    $РегистрОстатки.Покупатели(,
|           (INNER JOIN $Справочник.Договоры СпрД ON
|                   СпрД.ID =  Договор AND
|            $СпрД.ParentExt= :впКонтрагент),
|            Договор,
|            СуммаРуб,) AS РегПокупатели";
Meta name parser error: неизвестное метаимя или алиас "$РегПокупатели"
34 trad
 
28.07.14
10:38
(33)
1. соединения в ВТ $РегистрОстатки класса ПрямойЗапрос должны быть пятым параметром
2. и снова (4)
35 Oblako486
 
28.07.14
10:48
(34)
|ВЫБРАТЬ
|    РегПокупатели.Договор AS [Договор $Справочник.Договоры],    
|    РегПокупатели.СуммаРубОстаток AS Сумма    
|FROM
|    $РегистрОстатки.Покупатели(,
|           (,,
|            Договор,
|            СуммаРуб,
|            (INNER JOIN $Справочник.Договоры СпрД ON
|            СпрД.ID =  Договор AND
|            $СпрД.ParentExt= :впКонтрагент)
|    ) AS РегПокупатели,
Число БезПодготовки=0) : Meta name parser error: незавершённое метаимя "$РегистрОстатки.Покупатели"
36 m-serg74
 
28.07.14
11:07
(35) держи
ТекстЗапроса = "
|SELECT ПокупателиОстатки.Договор [Договор $Справочник.Договоры]
|    , ПокупателиОстатки.СуммаРубОстаток
|FROM $РегистрОстатки.Покупатели(:КонДата~,
|        INNER JOIN $Справочник.Договоры AS Договоры With (NOLOCK) ON Договор = Договоры.ID,
|        (Договоры.PARENTEXT = :Контр),
|        Договор,
|        СуммаРуб) AS ПокупателиОстатки
|";
37 trad
 
28.07.14
11:09
(35)
|    $РегистрОстатки.Покупатели(,
|           (,,
- что это за скобка?
38 monsterZE
 
28.07.14
11:31
ты читал - Эффективное использование MSSQL при помощи ВК 1С.doc ?
---
Виртуальные таблицы
Чтобы получить остаток на некоторую дату, допустим на середину месяца, нужно объединить два запроса: Итоги на конец предыдущего месяца и Обороты с начала месяца по выбранную дату. Чтобы облегчить нам работу были придуманы, так называемые, виртуальные таблицы (не путать с представлениями VIEW), которые являются простыми макроподстановками (хотя на самом деле не такими уж и простыми. С большой вероятностью, если вы сами будете их разворачивать, то у вас получится хуже, т.к. лучше уже просто уже некуда).

Существует несколько видов виртуальных таблиц
Остатки, ОстаткиОбороты, Обороты.
Первые 2 только для регистров остатков, 2 – для оборотного регистра.

Пример: Получим остатки по складу в разрезе товаров на дату

ТекстЗапроса = "
|SELECT
|    Рег.Товар as [Товар $Справочник.Номенклатура],
|    Рег.КоличествоОстаток as Количество
|FROM
|    $РегистрОстатки.ОстаткиТоваров(:ВыбДата,,
|                               Склад = :ВыбСклад,
|                               (Товар), (Количество)) as Рег";

$РегистрОстатки.<ИмяРегистра>([<ГраницаРасчета>] [, <Соединение>] [,<Условие>] [,<Измерение>] [,<Ресурс>]) [as <Алиас>]
Все параметры являются необязательными, если их все опустить, получим таблицу, содержащую регистр на ТА. Однако, такой способ получения регистра выполняется немного быстрее, чем стандартный Рег.ВыгрузитьИтоги(ТЗ,1,1). Разница несущественная, но она есть.
Границей расчета не обязательно должна быть какаято дата, это может быть и документ, но тогда нужно применить модификатор "~", т.е. :ГраницаРасчета~ ,где ГраницаРасчета задана как текстовый параметр полученый из СформироватьПозициюДокумента(ТекущийДокумент(),-1)
Соединение конструкция типа join. На языке SQL можно описать дополнительные соединения с таблицами, которые могут быть необходимы для формирования условий в следующем параметре
Условие - конструкция типа where. Позволяет фильтровать результат выборки по какому либо измерению или по нескольким измерениям
В выше приведенном примере в скобках указаны измерения и ресурсы, по которым строится запрос к регистру. Это позволяет уменьшить объем запроса, вернувшегося на клиента. В случае, если требуется построить запрос по нескольким измерениям или рассчитать несколько ресурсов, их указывают в скобках через запятую, например (Товар,Склад) или (Количество,СуммаУпр), либо их вообще можно пропустить ошибкой это не будет, просто в запрос попадут все измерения или все ресурсы.
39 Salimbek
 
28.07.14
12:52
(35) Тут:
INNER JOIN $Справочник.Договоры СпрД ON
|            СпрД.ID =  Договор AND
|            $СпрД.ParentExt= :впКонтрагент

СпрД - уже обозванная таблица, и в ней уже есть поле ParentExt, поэтому выбирать его надо без "доллара". Вот если бы такого поля не было, то нужен доллар, и тогда метапарсер сходит сам в таблички, найдет нужное поле и подставит его в итоговый запрос (например, для этого стоит доллар в $Справочник.Договоры).
Т.е. ответ на проблему:
INNER JOIN $Справочник.Договоры СпрД ON
|            СпрД.ID =  Договор AND
|            СпрД.ParentExt= :впКонтрагент
40 Salimbek
 
28.07.14
12:56
И полностью запрос:
|SELECT
|    РегПокупатели.Договор AS [Договор $Справочник.Договоры],    
|    РегПокупатели.КоличествоОстаток AS Количество    
|FROM
|    РегистрОстатки.Покупатели(,
|           (INNER JOIN $Справочник.Договоры  AS СпрД ON
|                   СпрД.ID =  Договор AND
|            СпрД.ParentExt= :впКонтрагент),
|            ,
|            (Договор),(Количество)) AS РегПокупатели";
41 trad
 
28.07.14
14:01
(40) имя ВТ должно начинаться с $
и у автора класс ПрямойЗапрос, там синтаксис ВТ несколько отличается, судя по документации
42 Oblako486
 
28.07.14
14:51
(36) Взлетело через СоздатьОбъект(ODBCRecordSet)
(40) Не смог победить через класс ПрямойЗапрос