Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Можно ли получить ТекущийДокумент в ВТ Обороты (число прочтений - 2574 )
vova64
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 14
Зарегистрирован: 29. Июля 2008
Можно ли получить ТекущийДокумент в ВТ Обороты
29. Июля 2008 :: 12:04
Печать  
Здравствуйте.
Подскажите пожалуйста если знаете
пишу запрос по SQL для получения количества проданого списка товара по регистру по списку серий по реквизиту регистра = 'Р' по списку клиентов доступ к которым можно получить через документ но в регисте нет измрения или реквизита этого документа
возможноли это с использованием виртуальных таблиц Обороты

написал
отдельно запрос на получения списка документов и таблицы проданных товаров
объеденить не могу

запрос 1

Запрос = СоздатьОбъект("ODBCRecordset");
ПолноеУсловиеКлиенты = "";
     СтрСоединенияКлиенты = "";
     Если СпсКлиенты.РазмерСписка() > 0 Тогда
           ФлагТолькоЭлементы = 1;
           Для х = 1 По СпсКлиенты.РазмерСписка() Цикл
                 ВремЗнач = СпсКлиенты.ПолучитьЗначение(х);
                 Если ВремЗнач.ЭтоГруппа() = 1 Тогда
                       ФлагТолькоЭлементы = 0;
                 КонецЕсли;
           КонецЦикла;      
           Если ФлагТолькоЭлементы = 1 Тогда
                 МД = СоздатьОбъект("MetaDataWork");
                 Условия = "";
                 Для х = 1 По СпсКлиенты.РазмерСписка() Цикл
                       Условия = Условия + "'" + МД.ЗначениеВСтрокуБД(СпсКлиенты.ПолучитьЗначение(х)) + "'";
                       Если х < СпсКлиенты.РазмерСписка() Тогда
                             Условия = Условия + ",";
                       КонецЕсли;
                 КонецЦикла;
                 Если ПустоеЗначение(Условия) = 0 Тогда
                       ПолноеУсловиеКлиенты = "
                       |      СпрКлн.ID IN ("+Условия+")
                       |";
                 КонецЕсли;
           Иначе
                 ПолноеУсловиеКлиенты = "
                 |      СпрКлн.ID IN (SELECT Val FROM #ГруппаКлиенты)
                 |";
                 Запрос.УложитьСписокОбъектов(СпсКлиенты, "#ГруппаКлиенты", "Клиенты");
           КонецЕсли;
           СтрСоединенияКлиенты = "INNER JOIN $Справочник.Клиенты as СпрКлн ON СпрКлн.ID = $Док.Клиент AND "+ПолноеУсловиеКлиенты+"";
     КонецЕсли;
     
     ТекстЗапроса = "
     |SELECT
     |   Жур.IDDoc as [Док $Документ],
     |   Жур.IDDocDef as Док_вид,
     |   $Док.РежимПроведения as РежимПроведения,
     |   $Док.Клиент as [Клиент $Справочник.Клиенты]
     |FROM
     |   _1SJourn Жур
     |INNER JOIN
     |   $Документ.Расходная as Док ON Док.IDDoc = Жур.IDDoc "
     +СтрСоединенияКлиенты+"
     |WHERE
     |   Жур.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~ AND
     |   Жур.IDDocDef = $ВидДокумента.Расходная AND
     |   Жур.Closed & 1 = 1 AND
     |      $Док.РежимПроведения = 0
     |";

     
     Запрос.УстановитьТекстовыйПараметр("НачДата", НачДата);
     Запрос.УстановитьТекстовыйПараметр("КонДата", КонДата);
     
     //*******************************************
     
     ТабВрем = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);

запрос 2

Запрос = СоздатьОбъект("ODBCRecordSet");
     Запрос.УстБД1С();
     Запрос.РежимRPC(1);
     //*******************************************
     //*******************************************
     ПолноеУсловиеТовар = "";
     СтрСоединенияТовары = "";
     Если СпсТовары.РазмерСписка() > 0 Тогда
           ФлагТолькоЭлементы = 1;
           Для х = 1 По СпсТовары.РазмерСписка() Цикл
                 ВремЗнач = СпсТовары.ПолучитьЗначение(х);
                 Если ВремЗнач.ЭтоГруппа() = 1 Тогда
                       ФлагТолькоЭлементы = 0;
                 КонецЕсли;
           КонецЦикла;      
           Если ФлагТолькоЭлементы = 1 Тогда
                 МД = СоздатьОбъект("MetaDataWork");
                 Условия = "";
                 Для х = 1 По СпсТовары.РазмерСписка() Цикл
                       Условия = Условия + "'" + МД.ЗначениеВСтрокуБД(СпсТовары.ПолучитьЗначение(х)) + "'";
                       Если х < СпсТовары.РазмерСписка() Тогда
                             Условия = Условия + ",";
                       КонецЕсли;
                 КонецЦикла;
                 Если ПустоеЗначение(Условия) = 0 Тогда
                       ПолноеУсловиеТовар = "
                       |      СпрТов.ID IN ("+Условия+")
                       |";
                 КонецЕсли;
           Иначе
                 ПолноеУсловиеТовар = "
                 |      СпрТов.ID IN (SELECT Val FROM #ГруппаТовары)
                 |";
                 Запрос.УложитьСписокОбъектов(СпсТовары, "#ГруппаТовары", "Товары");
           КонецЕсли;
           СтрСоединенияТовары = "INNER JOIN $Справочник.Товары as СпрТов ON СпрТов.ID = Товар AND "+ПолноеУсловиеТовар+" ";
     КонецЕсли;
     //*******************************************
     //*******************************************
     ПолноеУсловиеСерия = "";
     СтрСоединенияСерии = "";
     Если СпсСерии.РазмерСписка() > 0 Тогда
           ФлагТолькоЭлементы = 1;
           Для х = 1 По СпсСерии.РазмерСписка() Цикл
                 ВремЗнач = СпсСерии.ПолучитьЗначение(х);
                 Если ВремЗнач.ЭтоГруппа() = 1 Тогда
                       ФлагТолькоЭлементы = 0;
                 КонецЕсли;
           КонецЦикла;      
           Если ФлагТолькоЭлементы = 1 Тогда
                 МД = СоздатьОбъект("MetaDataWork");
                 Условия = "";
                 Для х = 1 По СпсСерии.РазмерСписка() Цикл
                       Условия = Условия + "'" + МД.ЗначениеВСтрокуБД(СпсСерии.ПолучитьЗначение(х)) + "'";
                       Если х < СпсСерии.РазмерСписка() Тогда
                             Условия = Условия + ",";
                       КонецЕсли;
                 КонецЦикла;
                 Если ПустоеЗначение(Условия) = 0 Тогда
                       ПолноеУсловиеСерия = "
                       |      СпрСер.ID IN ("+Условия+")
                       |";
                 КонецЕсли;
           Иначе
                 ПолноеУсловиеСерия = "
                 |      СпрСер.ID IN (SELECT Val FROM #ГруппаСерии)
                 |";
                 Запрос.УложитьСписокОбъектов(СпсСерии, "#ГруппаСерии", "Серии");
           КонецЕсли;
           СтрСоединенияСерии = "INNER JOIN $Справочник.Серии as СпрСер ON СпрСер.ID = Серия AND "+ПолноеУсловиеСерия+"";
     КонецЕсли;

ТекстЗапроса = "
     |SELECT
     |      Рег.Товар as [Товар $Справочник.Товары],
     |      Рег.Серия as [Серия $Справочник.Серии],
     |      Рег.ОстатокТовараРасход as ОстатокТовараРасход
     |FROM
     |      $РегистрОбороты.ОстаткиТоваров(:НачДата,:КонДата~,,"+СтрСоединенияТовары+"  "+СтрСоединенияСерии+",КодОперации = 'Р',(Товар,Серия),(ОстатокТовара)) as Рег
     |";
     Запрос.УстановитьТекстовыйПараметр("НачДата", НачДата);
     Запрос.УстановитьТекстовыйПараметр("КонДата", КонДата);
     //*******************************************
     //*******************************************
     ТабВрем = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);
  
Наверх
 
IP записан
 
Вадимко
God Member
*****
Отсутствует


Нам бы чего про ОдноЦэ...

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Можно ли получить ТекущийДокумент в ВТ Обороты
Ответ #1 - 29. Июля 2008 :: 22:00
Печать  
Читай документацию

SELECT ВзаиморасчетыОбороты.Сделка [Сделка $Справочник.Сделки]
, ВзаиморасчетыОбороты.ПозицияДокумента
FROM $РегистрОбороты.Взаиморасчеты(:НачДата, :КонДата,      Документ,,, Сделка,) AS ВзаиморасчетыОбороты
  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
vova64
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 14
Зарегистрирован: 29. Июля 2008
Re: Можно ли получить ТекущийДокумент в ВТ Обороты
Ответ #2 - 30. Июля 2008 :: 06:00
Печать  
Да действительно проглядел. Спасибо получилось.
Но к сожалению теперь не могу объединить эти запросы.
если пишу через вхождение в  подзапрос пишет ошибку
Only one expression can be specified in the select list when the subquery is not introduced with EXISTS

как объединить через INNER JOIN недопонимаю
подсажите пожалуйста.
Изначально цель была
получить данные из регистра с фильтрацией по измерениям регистра по реквизиту регистра и по реквизиту документа сделавшего движение все фильтры через IN (SELECT Val FROM #Группа)

на штатном языке 1с этот запрос выглядит как

СтрРасходная = "Р";
Запрос = СоздатьОбъект("Запрос");
Текст = "
|Период с НачДата По КонДата;
|Товар = Регистр.ОстаткиТоваров.Товар;
|Серия = Регистр.ОстаткиТоваров.Серия;
|Колво = Регистр.ОстаткиТоваров.ОстатокТовара;
|Докум = Регистр.ОстаткиТоваров.ТекущийДокумент;
|КодОп = Регистр.ОстаткиТоваров.КодОперации;
|Функция КолРасх = Расход(Колво);
|Группировка Докум;
|Группировка Товар Без Групп;
|Группировка Серия без групп;
|Условие(Товар в СпсТовары);
|Условие(КодОп = СтрРасходная);
|";

Если СпсСерии.РазмерСписка() > 0 Тогда
     Текст = Текст + "
     |Условие(Серия в СпсСерии);
     |";
КонецЕсли;

Если СпсКлиенты.РазмерСписка() > 0 Тогда
     Текст = Текст + "
     |Условие(Докум.Клиент в СпсКлиенты);
     |";
КонецЕсли;

Если Запрос.Выполнить(Текст) = 0 Тогда
     Сообщить("Ошибка !");
     Возврат;
КонецЕсли;
работает этот запрос очень долго

может есть более простой запрос на 1с++?
  
Наверх
 
IP записан
 
vova64
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 14
Зарегистрирован: 29. Июля 2008
Re: Можно ли получить ТекущийДокумент в ВТ Обороты
Ответ #3 - 30. Июля 2008 :: 07:20
Печать  
в общем есть два запроса которые я со своим пока небольшым опытом прямых запросов не могу объединить
первый запрос по документам с фильтром по списку слиентов
ТекстЗапроса = "
|SELECT
|   Жур.IDDoc as [Док $Документ],
|   Жур.IDDocDef as Док_вид,
|   $Док.РежимПроведения as РежимПроведения,
|   $Док.Клиент as [Клиент $Справочник.Клиенты]
|FROM
|   _1SJourn Жур
|INNER JOIN
|   $Документ.Расходная as Док ON Док.IDDoc = Жур.IDDoc
|INNER JOIN
|   $Справочник.Клиенты as СпрКлн ON СпрКлн.ID = $Док.Клиент AND СпрКлн.ID IN |(SELECT Val FROM #ГруппаКлиенты)
|WHERE
|   Жур.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~ AND
|   Жур.IDDocDef = $ВидДокумента.Расходная AND
|   Жур.Closed & 1 = 1 AND
|      $Док.РежимПроведения = 0
|";
Запрос.УложитьСписокОбъектов(СпсКлиенты, "#ГруппаКлиенты", "Клиенты");

ВТОРОЙ запрос по регистру с фильтом по списку товаров и списку серий
ПолноеУсловиеТовар = "СпрТов.ID IN (SELECT Val FROM #ГруппаТовары)";
Запрос.УложитьСписокОбъектов(СпсТовары, "#ГруппаТовары", "Товары");
СтрСоединенияТовары = "INNER JOIN $Справочник.Товары as СпрТов ON СпрТов.ID = Товар AND "+ПолноеУсловиеТовар+" ";

ПолноеУсловиеСерия = "СпрСер.ID IN (SELECT Val FROM #ГруппаСерии)";                  Запрос.УложитьСписокОбъектов(СпсСерии, "#ГруппаСерии", "Серии");
СтрСоединенияСерии = "INNER JOIN $Справочник.Серии as СпрСер ON СпрСер.ID = Серия AND "+ПолноеУсловиеСерия+"";

ТекстЗапроса = "
|SELECT
|      Рег.Товар as [Товар $Справочник.Товары],
|      Рег.Серия as [Серия $Справочник.Серии],
|      SUM(Рег.ОстатокТовараРасход) as ОстатокТовараРасход,
|      RIGHT(Рег.ПозицияДокумента,9) [Док $Документ],
|      MAX(Рег.ВидДокумента) Док_вид
|FROM
|      +"  "+СтрСоединенияСерии+",КодОперации = 'Р',(Товар,Серия),(ОстатокТовара)) as Рег
|GROUP BY
|   Рег.Товар, Рег.Серия, Рег.ПозицияДокумента
|";
  
Наверх
 
IP записан
 
vova64
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 14
Зарегистрирован: 29. Июля 2008
Re: Можно ли получить ТекущийДокумент в ВТ Обороты
Ответ #4 - 04. Августа 2008 :: 06:16
Печать  
помогите пожалуйста
сам не могу разобраться
как правильно написать этот запрос с фильтрами по двум измерениям регистра
и по реквизиту докумета сделавшего движение в регистре
  
Наверх
 
IP записан
 
vova64
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 14
Зарегистрирован: 29. Июля 2008
Re: Можно ли получить ТекущийДокумент в ВТ Обороты
Ответ #5 - 25. Августа 2008 :: 10:45
Печать  
Может я иду по неправильному пути

Можно ли при извлечении данных при помощи виртуальной таблицы $РегистрОбороты установить фильтр на документ?
может в этом проблемма

возможно нужно переписать запрос без использования виртуальной таблицы $РегистрОбороты
напрямую через регистр или документ?
  
Наверх
 
IP записан
 
Ярослав
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 43
Местоположение: Иркутск
Зарегистрирован: 14. Октября 2008
Re: Можно ли получить ТекущийДокумент в ВТ Обороты
Ответ #6 - 30. Октября 2008 :: 07:54
Печать  
Нужно Присоединить _1SJOURN и устанавливать фильтр
|AND Жур.IDDocDef <> $ВидДокумента.Сторно

Попробуй типо такого)

Код
Выбрать все
    |  SELECT
    |  КОнтрАгенты.ID [КонтРАгент $Справочник.КонтрАгенты],
	|  (DATEDIFF(day,(CAST(LEFT(Жур.date_time_iddoc, 8) as DateTime)  + $Договоры.ГлубинаКредита) ,:КонДата)) as ДнейПросрочка,
	|  Рег.Договор as [ДоГовор $Справочник.Договоры],
	|  Рег.Фирма as [Фирма $Справочник.Фирмы],      
	|  Рег.СуммаРубОстаток as СуммаРубКонОст,
	|  Рег.КредДокумент as [КредДокумент $Документ]
	|FROM
	|  $РегистрОстатки.Покупатели(:КонДата~,,
	|            ,
	|           (КредДокумент,Договор,Фирма),(СуммаРуб)) as Рег    
	|INNER JOIN
    |    $Справочник.Договоры as Договоры ON  (ДОговоры.ID = Рег.ДоговоР)
	|INNER JOIN
    |    $Справочник.КонтрАгенты as КонтрАгенты ON  (КонтрАгенты.ID = Договоры.PARENTEXT)
	|INNER JOIN
	|_1SJOURN AS Жур (NOLOCK) ON (Жур.IDDOC = RIGHT(КредДокумент,9))

	|WHERE
	|КонтрАгенты.ID =:ВыбКонтрагент
	|AND (CAST(LEFT(Жур.date_time_iddoc, 8) as DateTime)  + $Договоры.ГлубинаКредита)  <=:КонДата

	|AND Жур.IDDocDef <> $ВидДокумента.Сторно

	|ORDER BY Жур.date_time_iddoc,Рег.ДнейПросрочкА";
 

  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать