Переключение на Главную Страницу Страницы: [1] 2 3  ОтправитьПечать
Очень популярная тема (более 25 ответов) Получение остатков на классе "ПрямойЗапрос" (число прочтений - 5448 )
Попытка1С
1c++ donor
Отсутствует


Делал все, иногда быстро.

Сообщений: 103
Местоположение: Санкт-Петербург
Зарегистрирован: 28. Февраля 2008
Пол: Мужской
Получение остатков на классе "ПрямойЗапрос"
08. Сентября 2010 :: 09:11
Печать  
Всем привет.

Есть функция получающая остатки.

Код
Выбрать все
Функция ОстаткиТовараНачалоПериода()
	ЗапросПриходов = СоздатьОбъект("ПрямойЗапрос");
	ЗапросПриходов.РежимОтладки = 1;
	ТекстЗапроса = "
	|ВЫБРАТЬ
	| БИ.Субконто1 КАК [Товар $Субконто]
	|,БИ.Субконто1_вид КАК Товар_вид
	|,БИ.КоличествоОстатокДт КАК Количество
	|ИЗ
	| $БИОстатки.Основной(:КонДата~, #СзСчетов, (Субконто1), (Количество), ,) КАК БИ
	|";
	ЗапросПриходов.УстановитьТекстовыйПараметр("КонДата",ВыбДата);
	СзСчетов = СоздатьОбъект("СписокЗначений");
	СзСчетов.ДобавитьЗначение(СчетПоКоду("41.1"));
	СзСчетов.ДобавитьЗначение(СчетПоКоду("41.4"));
	ЗапросПриходов.УложитьСписокЗначений(СзСчетов,"#СзСчетов");
	ИтТз  = ЗапросПриходов.Выполнить("ИндексированнаяТаблица",ТекстЗапроса);

	Возврат ИтТз;
КонецФункции
 



Все работает, все супер. Но данную таблицу мне нужно дополнить следующими полями:

СчетСсылка - внутренний ID счета
СчетКод - код счета
НоменклатураСсылка - внутренний ID субконто1

Как это все добавить на прямом запросе?
  
Наверх
 
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Получение остатков на классе "ПрямойЗапрос"
Ответ #1 - 08. Сентября 2010 :: 09:17
Печать  
Вообще то если я правильно понял то: БИ.Субконто1, БИ.Счет - и так хранят id. Без типизации напиши. Что же касается реквизита Код, то делаешь левое соединение с таблицей ПланыСчетов по счету и все. Аналогично для получения информации по реквизитам номенклатуры.
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
Попытка1С
1c++ donor
Отсутствует


Делал все, иногда быстро.

Сообщений: 103
Местоположение: Санкт-Петербург
Зарегистрирован: 28. Февраля 2008
Пол: Мужской
Re: Получение остатков на классе "ПрямойЗапрос"
Ответ #2 - 08. Сентября 2010 :: 09:32
Печать  
vandalsvq писал(а) 08. Сентября 2010 :: 09:17:
Вообще то если я правильно понял то: БИ.Субконто1, БИ.Счет - и так хранят id. Без типизации напиши. Что же касается реквизита Код, то делаешь левое соединение с таблицей ПланыСчетов по счету и все. Аналогично для получения информации по реквизитам номенклатуры.


vandalsvq спс, почти разобрался.
Еще вопрос, к тебе как к разработчику класса.
Я могу делать запрос к другой бд так же как на голом 1с++ через MetaDataWork
  
Наверх
 
IP записан
 
Попытка1С
1c++ donor
Отсутствует


Делал все, иногда быстро.

Сообщений: 103
Местоположение: Санкт-Петербург
Зарегистрирован: 28. Февраля 2008
Пол: Мужской
Re: Получение остатков на классе "ПрямойЗапрос"
Ответ #3 - 08. Сентября 2010 :: 09:40
Печать  
С товаром разобрался, не получается приджонить таблицу с планом счетов, не подскажите где ошибка?
Код
Выбрать все
	|ВЫБРАТЬ
    | БИ.Счет КАК Счет_Ссылка
	|,БИ.Субконто1 КАК Номенклатура_Ссылка
	|,$Спр.КОД КАК Номенклатура_КОД
	|,БИ.Субконто1_вид КАК Товар_вид
	|,БИ.КоличествоОстатокДт КАК КонОстКол
	|ИЗ
	| $БИОстатки.Основной(:КонДата~, #СзСчетов, (Субконто1), (Количество), ,) КАК БИ
	|ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Спр $nolock
	|ПО ($Спр.ТекущийЭлемент = БИ.Субконто1)
	|ЛЕВОЕ СОЕДИНЕНИЕ ПланСчетов.Основной КАК ПС $nolock
	|ПО ($ПС.Счет = БИ.Счет)
 


  
Наверх
 
IP записан
 
Попытка1С
1c++ donor
Отсутствует


Делал все, иногда быстро.

Сообщений: 103
Местоположение: Санкт-Петербург
Зарегистрирован: 28. Февраля 2008
Пол: Мужской
Re: Получение остатков на классе "ПрямойЗапрос"
Ответ #4 - 08. Сентября 2010 :: 10:01
Печать  
Вообщем со всем разобрался.
Осталось понять как мне из базы торговли сделать запрос к базе бухии.
  
Наверх
 
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Получение остатков на классе "ПрямойЗапрос"
Ответ #5 - 08. Сентября 2010 :: 10:10
Печать  
Я думаю что 100% работы со сторонней базой не получится. В смысле что парсер работать наверное не будет. У меня там помесь MetaDataWork и чего-то из 1С-овского. Поэтому возможны ошибки. А для DBF это вообще нереально. Так что проще и вернее сказать что класс не умеет работать со сторонними базами Печаль
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Получение остатков на классе "ПрямойЗапрос"
Ответ #6 - 08. Сентября 2010 :: 10:12
Печать  
Попытка1С писал(а) 08. Сентября 2010 :: 09:40:
С
Код
Выбрать все
ЛЕВОЕ СОЕДИНЕНИЕ ПланСчетов.Основной КАК ПС $nolock 


Советую писать запрос просто к ПланыСчетов. Поскольку ПланСчетов.Основной = "select * from ПланыСчетов where planid = :ПланСчетов.Основной).
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
Попытка1С
1c++ donor
Отсутствует


Делал все, иногда быстро.

Сообщений: 103
Местоположение: Санкт-Петербург
Зарегистрирован: 28. Февраля 2008
Пол: Мужской
Re: Получение остатков на классе "ПрямойЗапрос"
Ответ #7 - 08. Сентября 2010 :: 10:17
Печать  
vandalsvq писал(а) 08. Сентября 2010 :: 10:10:
Я думаю что 100% работы со сторонней базой не получится. В смысле что парсер работать наверное не будет. У меня там помесь MetaDataWork и чего-то из 1С-овского. Поэтому возможны ошибки. А для DBF это вообще нереально. Так что проще и вернее сказать что класс не умеет работать со сторонними базами Печаль



Эх.... очень жаль. Печаль
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Получение остатков на классе "ПрямойЗапрос"
Ответ #8 - 08. Сентября 2010 :: 11:20
Печать  
Попытка1С писал(а) 08. Сентября 2010 :: 10:17:
Эх.... очень жаль. Печаль


Пиши запрос "руками" к сторонней базе, на формат базы фиолетово.
Для дбф используй фоксовый провайдер
  
Наверх
 
IP записан
 
Попытка1С
1c++ donor
Отсутствует


Делал все, иногда быстро.

Сообщений: 103
Местоположение: Санкт-Петербург
Зарегистрирован: 28. Февраля 2008
Пол: Мужской
Re: Получение остатков на классе "ПрямойЗапрос"
Ответ #9 - 08. Сентября 2010 :: 11:33
Печать  
Eprst писал(а) 08. Сентября 2010 :: 11:20:
Попытка1С писал(а) 08. Сентября 2010 :: 10:17:
Эх.... очень жаль. Печаль


Пиши запрос "руками" к сторонней базе, на формат базы фиолетово.
Для дбф используй фоксовый провайдер


Да я так и начал.

Только вот есть сложности. база SQL.
Код
Выбрать все
	|SELECT
	| БИ.Счет AS [Счет $Счет.Основной]
	|,БИ.Счет AS Счет_Ссылка
	|,БИ.Субконто1 AS Номенклатура_Ссылка
	|,СпрНоменклатура.CODE AS Номенклатура_КОД
	|,Спр.DESCR AS Наименование
	|,$Спр.СтранаПроисхождения AS СтранаПроисхождения
	|,БИ.КоличествоОстатокДт AS КонОстКол
	|FROM
	| (
	|	SELECT
	|		Счет
	|		,Валюта
	|		,Субконто1,Субконто1_вид
	|		,Субконто2,Субконто2_вид
	|
	|		,SUM(КоличествоОстаток) КоличествоОстаток
	|		,CASE WHEN SUM(КоличествоОстаток) > 0 THEN SUM(КоличествоОстаток) ELSE 0 END КоличествоОстатокДт
	|		,CASE WHEN SUM(КоличествоОстаток) < 0 THEN -SUM(КоличествоОстаток) ELSE 0 END КоличествоОстатокКт
	|	FROM (
	|		SELECT
	|			bkttl_vt.ACCID Счет
	|			,bkttl_vt.CURRID Валюта
	|			,bkttl_vt.SC0 Субконто1
	|			,bkttl_vt.VSC0 Субконто1_вид
	|			,bkttl_vt.SC1 Субконто2
	|			,bkttl_vt.VSC1 Субконто2_вид
	|
	|			,CASE WHEN bkttl_vt.KIND = '3' THEN bkttl_vt.SD+bkttl_vt.OBDT1-bkttl_vt.OBKT1+bkttl_vt.OBDT2-bkttl_vt.OBKT2 ELSE 0 END AS КоличествоОстаток
	|		FROM _1SBKTTL bkttl_vt (nolock)
//	|		INNER JOIN #СзСчетов accfilter
//	|		ON bkttl_vt.ACCID = accfilter.val
	|		INNER JOIN (SELECT ID FROM _1SACCS WHERE SCHKOD = 'ГТД.') accfilter ON (bkttl_vt.ACCID = accfilter.ID)
//	|		INNER JOIN _1SACCS AS accfilter ON (bkttl_vt.ACCID = accfilter.ID) AND accfilter.SCHKOD = 'ГТД.'
	|		WHERE (bkttl_vt.DATE = :ВыбДата~)
	|		AND (bkttl_vt.KIND = '3')
	|
	|
	|
	|	UNION ALL
	|
	|		SELECT
	|			entry_vt.ACCDTID
	|			,CASE WHEN entry_vt.DTFLAGS & 1 = 1 THEN entry_vt.CURRID ELSE '     0   ' END
	|			,entry_vt.DTSC0
	|			,entry_vt.VDTSC0
	|			,entry_vt.DTSC1
	|			,entry_vt.VDTSC1
	|
	|			,entry_vt.AMOUNT
	|		FROM _1SENTRY entry_vt (nolock)
//	|		INNER JOIN #СзСчетов accfilter
//	|		ON entry_vt.ACCDTID = accfilter.val
	|		INNER JOIN (SELECT ID FROM _1SACCS WHERE SCHKOD = 'ГТД.') accfilter ON (entry_vt.ACCDTID = accfilter.ID)
//	|		INNER JOIN _1SACCS AS accfilter ON (bkttl_vt.ACCID = accfilter.ID) AND accfilter.SCHKOD = 'ГТД.'
	|		WHERE (entry_vt.DATE_TIME_DOCID >= '20100901     0     0   ')
	|		AND (entry_vt.DATE_TIME_DOCID < '20100908     0     0   ')
	|		AND (entry_vt.ACTIVE = ' ')
	|
	|
	|		AND (entry_vt.PROVKIND <> 'K')
	|
	|	UNION ALL
	|
	|		SELECT
	|			entry_vt.ACCKTID
	|			,CASE WHEN entry_vt.KTFLAGS & 1 = 1 THEN entry_vt.CURRID ELSE '     0   ' END
	|			,entry_vt.KTSC0
	|			,entry_vt.VKTSC0
	|			,entry_vt.KTSC1
	|			,entry_vt.VKTSC1
	|
	|			,-entry_vt.AMOUNT
	|		FROM _1SENTRY entry_vt (nolock)
//	|		INNER JOIN #СзСчетов accfilter
//	|		ON entry_vt.ACCKTID = accfilter.val
	|		INNER JOIN (SELECT ID FROM _1SACCS WHERE SCHKOD = 'ГТД.') accfilter ON (entry_vt.ACCKTID = accfilter.ID)
//	|		INNER JOIN _1SACCS AS accfilter ON (bkttl_vt.ACCID = accfilter.ID) AND accfilter.SCHKOD = 'ГТД.'
	|		WHERE (entry_vt.DATE_TIME_DOCID >= '20100901     0     0   ')
	|		AND (entry_vt.DATE_TIME_DOCID < '20100908     0     0   ')
	|		AND (entry_vt.ACTIVE = ' ')
	|
	|
	|		AND (entry_vt.PROVKIND <> 'D')
	|
	|		) AS accountingbalance
	|	GROUP BY
	|		Счет,Валюта
	|		,Субконто1,Субконто1_вид
	|		,Субконто2,Субконто2_вид
	|
	|	HAVING (SUM(КоличествоОстаток) <> 0)
	|) AS БИ
	|LEFT JOIN $Справочник.Номенклатура AS СпрНоменклатура (nolock)
	|ON (СпрНоменклатура.ID = БИ.Субконто1)
	|LEFT JOIN $Справочник.ГТД AS Спр (nolock)
	|ON (Спр.ID = БИ.Субконто2)
 




Проблема с адаптацией вот этой конструкции:

INNER JOIN #СзСчетов accfilter
ON bkttl_vt.ACCID = accfilter.val

как правильно ее заменить?
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Получение остатков на классе "ПрямойЗапрос"
Ответ #10 - 08. Сентября 2010 :: 11:37
Печать  
В плане заменить?
Да и проще условие на ACCID вынести в ветку where для всего запроса, чем каждый раз "иннерить" табличку
  
Наверх
 
IP записан
 
Попытка1С
1c++ donor
Отсутствует


Делал все, иногда быстро.

Сообщений: 103
Местоположение: Санкт-Петербург
Зарегистрирован: 28. Февраля 2008
Пол: Мужской
Re: Получение остатков на классе "ПрямойЗапрос"
Ответ #11 - 08. Сентября 2010 :: 11:42
Печать  
Eprst писал(а) 08. Сентября 2010 :: 11:37:
В плане заменить?
Да и проще условие на ACCID вынести в ветку where для всего запроса, чем каждый раз "иннерить" табличку


Был написан запрос на классе.
Вставлен режим отладки.
Получившийся запрос я сейчас и пытаюсь переделать на 1с++ без использования временных таблиц или списков счетов, а прямо сделать селект из таблички счетов с указание определенного кода.

Вот вопрос как правильно это сделать?
  
Наверх
 
IP записан
 
Попытка1С
1c++ donor
Отсутствует


Делал все, иногда быстро.

Сообщений: 103
Местоположение: Санкт-Петербург
Зарегистрирован: 28. Февраля 2008
Пол: Мужской
Re: Получение остатков на классе "ПрямойЗапрос"
Ответ #12 - 08. Сентября 2010 :: 11:45
Печать  
Eprst писал(а) 08. Сентября 2010 :: 11:37:
Да и проще условие на ACCID вынести в ветку where для всего запроса, чем каждый раз "иннерить" табличку


там разные таблички используются

bkttl_vt.ACCID
entry_vt.ACCDTID
entry_vt.ACCKTID
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Получение остатков на классе "ПрямойЗапрос"
Ответ #13 - 08. Сентября 2010 :: 11:52
Печать  
Ну и что с того что разные? ACCID один же у всех Улыбка
выкидываешь соединение и втыкаешь where в итог селекта по всем юнионам который (т.е на саму БИ, там где у тебя справочник приджоин)
  
Наверх
 
IP записан
 
Попытка1С
1c++ donor
Отсутствует


Делал все, иногда быстро.

Сообщений: 103
Местоположение: Санкт-Петербург
Зарегистрирован: 28. Февраля 2008
Пол: Мужской
Re: Получение остатков на классе "ПрямойЗапрос"
Ответ #14 - 08. Сентября 2010 :: 11:59
Печать  
Eprst писал(а) 08. Сентября 2010 :: 11:52:
Ну и что с того что разные? ACCID один же у всех Улыбка
выкидываешь соединение и втыкаешь where в итог селекта по всем юнионам который (т.е на саму БИ, там где у тебя справочник приджоин)


угу понял.

вот в квери такой запрос отрабатывает.
Код
Выбрать все
SELECT
 БИ.Счет AS [Счет $Счет.Основной]
,БИ.Счет AS Счет_Ссылка
,БИ.Субконто1 AS Номенклатура_Ссылка
,СпрНоменклатура.CODE AS Номенклатура_КОД
,Спр.DESCR AS Наименование
,Спр.SP165 AS СтранаПроисхождения
,БИ.КоличествоОстатокДт AS КонОстКол
FROM
 (
SELECT
Счет
,Валюта
,Субконто1,Субконто1_вид
,Субконто2,Субконто2_вид

,SUM(КоличествоОстаток) КоличествоОстаток
,CASE WHEN SUM(КоличествоОстаток) > 0 THEN SUM(КоличествоОстаток) ELSE 0 END КоличествоОстатокДт
,CASE WHEN SUM(КоличествоОстаток) < 0 THEN -SUM(КоличествоОстаток) ELSE 0 END КоличествоОстатокКт
FROM (
SELECT
bkttl_vt.ACCID Счет
,bkttl_vt.CURRID Валюта
,bkttl_vt.SC0 Субконто1
,bkttl_vt.VSC0 Субконто1_вид
,bkttl_vt.SC1 Субконто2
,bkttl_vt.VSC1 Субконто2_вид

,CASE WHEN bkttl_vt.KIND = '3' THEN bkttl_vt.SD+bkttl_vt.OBDT1-bkttl_vt.OBKT1+bkttl_vt.OBDT2-bkttl_vt.OBKT2 ELSE 0 END AS КоличествоОстаток
FROM _1SBKTTL bkttl_vt (nolock)
WHERE (bkttl_vt.DATE = '20100901')
AND (bkttl_vt.KIND = '3')



UNION ALL

SELECT
entry_vt.ACCDTID
,CASE WHEN entry_vt.DTFLAGS & 1 = 1 THEN entry_vt.CURRID ELSE '     0   ' END
,entry_vt.DTSC0
,entry_vt.VDTSC0
,entry_vt.DTSC1
,entry_vt.VDTSC1

,entry_vt.AMOUNT
FROM _1SENTRY entry_vt (nolock)
WHERE (entry_vt.DATE_TIME_DOCID >= '20100901     0     0   ')
AND (entry_vt.DATE_TIME_DOCID < '20100908     0     0   ')
AND (entry_vt.ACTIVE = ' ')


AND (entry_vt.PROVKIND <> 'K')

UNION ALL

SELECT
entry_vt.ACCKTID
,CASE WHEN entry_vt.KTFLAGS & 1 = 1 THEN entry_vt.CURRID ELSE '     0   ' END
,entry_vt.KTSC0
,entry_vt.VKTSC0
,entry_vt.KTSC1
,entry_vt.VKTSC1

,-entry_vt.AMOUNT
FROM _1SENTRY entry_vt (nolock)
WHERE (entry_vt.DATE_TIME_DOCID >= '20100901     0     0   ')
AND (entry_vt.DATE_TIME_DOCID < '20100908     0     0   ')
AND (entry_vt.ACTIVE = ' ')


AND (entry_vt.PROVKIND <> 'D')

) AS accountingbalance

GROUP BY
Счет,Валюта
,Субконто1,Субконто1_вид
,Субконто2,Субконто2_вид

HAVING (SUM(КоличествоОстаток) <> 0)
) AS БИ
LEFT JOIN SC323 AS СпрНоменклатура (nolock)
ON (СпрНоменклатура.ID = БИ.Субконто1)
LEFT JOIN SC170 AS Спр (nolock)
ON (Спр.ID = БИ.Субконто2)

 



не пойму как мне написать условие на счет?
нужен подзапрос и условие in чтоли?

или я могу просто написать типа:
WHERE БИ.Счет = :ВыбСчет
а потом УстановитьТекстовыйПараметр

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