Переключение на Главную Страницу Страницы: [1]  ОтправитьПечать
Очень популярная тема (более 25 ответов) Получение остатков на классе "ПрямойЗапрос" (число прочтений - 5427 )
Попытка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 записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Получение остатков на классе "ПрямойЗапрос"
Ответ #15 - 08. Сентября 2010 :: 12:05
Печать  
Ну, если он один, то достаточно WHERE БИ.Счет = :ВыбСчет
если много, то in ..
  
Наверх
 
IP записан
 
Попытка1С
1c++ donor
Отсутствует


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

Сообщений: 103
Местоположение: Санкт-Петербург
Зарегистрирован: 28. Февраля 2008
Пол: Мужской
Re: Получение остатков на классе "ПрямойЗапрос"
Ответ #16 - 08. Сентября 2010 :: 12:13
Печать  
Вот так все работает из любой бухгалтерской базы

Код
Выбрать все
Функция СформироватьОстПоГТДИзДругойБазы()


	ИБ=СоздатьОбъект("ODBCDataBase");
	ИБ.ПрисоединитьИБ(ПутьКБазе,"Связь","");

	Мета.ПрисоединитьМд(СокрЛП(ПутьКБазе)+"1cv7.md");
	ЗапросОстатковГТД.УстБд(ИБ);

	ТекстЗапроса = "

	|SELECT
	| БИ.Счет 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)
	|		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)
	|		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 $Справочник.Номенклатура AS СпрНоменклатура (nolock)
	|ON (СпрНоменклатура.ID = БИ.Субконто1)
	|LEFT JOIN $Справочник.ГТД AS Спр (nolock)
	|ON (Спр.ID = БИ.Субконто2)
	|WHERE БИ.Счет = :ВыбСчет
	|";

	итТз = СоздатьОбъект("ИндексированнаяТаблица");
	ЗапросОстатковГТД.УстановитьТекстовыйПараметр("ВыбДата",ВыбДата);
	ЗапросОстатковГТД.УстановитьТекстовыйПараметр("ВыбСчет",СчетПоКоду("ГТД"));
	ЗапросОстатковГТД.ВыполнитьИнструкцию(ТекстЗапроса,итТз);
	итТз.Показать();

КонецФункции
 




Но из торговли не работает так как не знает торговля что такое СчетПоКоду("ГТД")

Как быть?
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Получение остатков на классе "ПрямойЗапрос"
Ответ #17 - 08. Сентября 2010 :: 12:21
Печать  
Смотреть в сторону
http://www.1cpp.ru/docum/icpp/html/ODBC.html#attachmd
и методов для получения ИД объектов.
  
Наверх
 
IP записан
 
Попытка1С
1c++ donor
Отсутствует


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

Сообщений: 103
Местоположение: Санкт-Петербург
Зарегистрирован: 28. Февраля 2008
Пол: Мужской
Re: Получение остатков на классе "ПрямойЗапрос"
Ответ #18 - 08. Сентября 2010 :: 12:32
Печать  
Да забавно получается.
Ведь если ВыбДата равна последнему дню квартала то никакого UNION ALL не будет совсем, так как таблица оборотов не нужна.

Ладно придется два разных запроса сделать.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Получение остатков на классе "ПрямойЗапрос"
Ответ #19 - 08. Сентября 2010 :: 12:37
Печать  
Да учти, что если ты работаешь через метаданные, и потом получаешь ид счета через ИдОбъекта(), то таким способом, можешь получить только счета из плана счетов, созданных только в пофигураторе.
В твоём случае, проще соединиться с табличкой счетов и фильтровать уже по коду счета.
ЗЫ: чорт, у тебя так и было Улыбка), только мог бы этот иннер вынести наружу.
  
Наверх
 
IP записан
 
Попытка1С
1c++ donor
Отсутствует


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

Сообщений: 103
Местоположение: Санкт-Петербург
Зарегистрирован: 28. Февраля 2008
Пол: Мужской
Re: Получение остатков на классе "ПрямойЗапрос"
Ответ #20 - 08. Сентября 2010 :: 15:48
Печать  
Вообщем вроде сделал, вроде работает для любой базы.  Улыбка
Критика приветствуется.

Код
Выбрать все
Функция СформироватьОстПоГТДИзДругойБазы()


	ИБ=СоздатьОбъект("ODBCDataBase");
	ИБ.ПрисоединитьИБ(ПутьКБазе,"Связь","");

	Мета.ПрисоединитьМд(СокрЛП(ПутьКБазе)+"1cv7.md");
	ЗапросОстатковГТД.УстБд(ИБ);
	ЗапросОстатковГТД.Отладка(1);

	Если ВыбДата = КонКвартала(ВыбДата) Тогда

		ТекстЗапроса = "

		|SELECT
		| ПС.SCHKOD 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 ELSE 0 END AS КоличествоОстаток
		|		FROM _1SBKTTL bkttl_vt (nolock)
		|		WHERE (bkttl_vt.DATE = :ВыбДата)
		|		AND (bkttl_vt.KIND = '3')
		|		) AS accountingbalance
		|	GROUP BY
		|		Счет,Валюта
		|		,Субконто1,Субконто1_вид
		|		,Субконто2,Субконто2_вид
		|
		|	HAVING (SUM(КоличествоОстаток) <> 0)
		|) AS БИ
		|LEFT JOIN _1SACCS AS ПС (nolock)
		|ON (ПС.ID = БИ.Счет)
		|LEFT JOIN $Справочник.Номенклатура AS СпрНоменклатура (nolock)
		|ON (СпрНоменклатура.ID = БИ.Субконто1)
		|LEFT JOIN $Справочник.ГТД AS Спр (nolock)
		|ON (Спр.ID = БИ.Субконто2)
		|WHERE (ПС.SCHKOD like 'ГТД%') AND (БИ.КоличествоОстатокДт <> 0)
		|ORDER BY СпрНоменклатура.CODE
		|";

	Иначе

		ТекстЗапроса = "

		|SELECT
		| ПС.SCHKOD 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)
		|		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)
		|		WHERE (entry_vt.DATE_TIME_DOCID >= '"+формат((НачКвартала(ВыбДата)),"ДГГГГММДД")+"     0     0   ')
		|		AND (entry_vt.DATE_TIME_DOCID < '"+формат((ВыбДата+1),"ДГГГГММДД")+"     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 >=  '"+формат((НачКвартала(ВыбДата)),"ДГГГГММДД")+"     0     0   ')
		|		AND (entry_vt.DATE_TIME_DOCID < '"+формат((ВыбДата+1),"ДГГГГММДД")+"     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 _1SACCS AS ПС (nolock)
		|ON (ПС.ID = БИ.Счет)
		|LEFT JOIN $Справочник.Номенклатура AS СпрНоменклатура (nolock)
		|ON (СпрНоменклатура.ID = БИ.Субконто1)
		|LEFT JOIN $Справочник.ГТД AS Спр (nolock)
		|ON (Спр.ID = БИ.Субконто2)
		|WHERE (ПС.SCHKOD like 'ГТД%') AND (БИ.КоличествоОстатокДт <> 0)
		|ORDER BY СпрНоменклатура.CODE
		|";

	КонецЕсли;

    итТз = СоздатьОбъект("ИндексированнаяТаблица");
	ЗапросОстатковГТД.УстановитьТекстовыйПараметр("ВыбДата",ВыбДата+1);
	ЗапросОстатковГТД.ВыполнитьИнструкцию(ТекстЗапроса,итТз);
	итТз.Показать();

КонецФункции
 



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


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

Сообщений: 103
Местоположение: Санкт-Петербург
Зарегистрирован: 28. Февраля 2008
Пол: Мужской
Re: Получение остатков на классе "ПрямойЗапрос"
Ответ #21 - 08. Сентября 2010 :: 16:15
Печать  
Обнаружил 2 ошибки.

1.  ЗапросОстатковГТД.УстановитьТекстовыйПараметр("ВыбДата",ВыбДата-1);

2. Запросы имеют разный вид, если я делаю его например на 10.07.2010 и на 15.07.2010. Только я пока не допер почему так.
Подскажите?
  
Наверх
 
IP записан
 
Попытка1С
1c++ donor
Отсутствует


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

Сообщений: 103
Местоположение: Санкт-Петербург
Зарегистрирован: 28. Февраля 2008
Пол: Мужской
Re: Получение остатков на классе "ПрямойЗапрос"
Ответ #22 - 08. Сентября 2010 :: 16:25
Печать  
Не могу понять закономерность в зависимости от даты

то так в запросе
Код
Выбрать все
CASE WHEN bkttl_vt.KIND = '3' THEN bkttl_vt.SD+bkttl_vt.OBDT1-bkttl_vt.OBKT1 ELSE 0 END AS КоличествоОстаток
 



то так
Код
Выбрать все
,CASE WHEN bkttl_vt.KIND = '3' THEN bkttl_vt.SD ELSE 0 END AS КоличествоОстаток
 

  
Наверх
 
IP записан
 
vandalsvq
1c++ power user
Отсутствует


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

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Получение остатков на классе "ПрямойЗапрос"
Ответ #23 - 08. Сентября 2010 :: 18:30
Печать  
Попытка1С писал(а) 08. Сентября 2010 :: 16:15:
Обнаружил 2 ошибки.

1.  ЗапросОстатковГТД.УстановитьТекстовыйПараметр("ВыбДата",ВыбДата-1);

2. Запросы имеют разный вид, если я делаю его например на 10.07.2010 и на 15.07.2010. Только я пока не допер почему так.
Подскажите?

А кто сказал что это ошибки?  Подмигивание Как то у Ивана написано в подписи "у нас как в армии либо работает, либо так задумано". В общем так задумано, для 15 и более считается что оптимальнее считать от конца месяца. Поэтому к sd (начало квартала) добавляется один месяц (obdt1, obkt1), соответственно для получения на 15 от этой суммы вычтется оборот с данной даты до конца месяца. Теперь понятнее? Улыбка
  

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


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

Сообщений: 103
Местоположение: Санкт-Петербург
Зарегистрирован: 28. Февраля 2008
Пол: Мужской
Re: Получение остатков на классе "ПрямойЗапрос"
Ответ #24 - 08. Сентября 2010 :: 22:11
Печать  
Цитата:
А кто сказал что это ошибки?  Подмигивание Как то у Ивана написано в подписи "у нас как в армии либо работает, либо так задумано". В общем так задумано, для 15 и более считается что оптимальнее считать от конца месяца. Поэтому к sd (начало квартала) добавляется один месяц (obdt1, obkt1), соответственно для получения на 15 от этой суммы вычтется оборот с данной даты до конца месяца. Теперь понятнее? Улыбка


Я не имел ввиду ошибки класса, а ошибки моего кода который я выложил. Улыбка Что он отличается от того что класс пишет мне в отладку.
По поводу числа 15, я не до конца понял всетаки. В пределах некоторых месяцев да, все так и есть, но не всегда. Вот я проводил эксперименты на разные даты:

привожу отличия запросов

Код
Выбрать все
05.01.10

,CASE WHEN bkttl_vt.KIND = '3' THEN bkttl_vt.SD ELSE 0 END AS КоличествоОстаток

16.01.10

,CASE WHEN bkttl_vt.KIND = '3' THEN bkttl_vt.SD+bkttl_vt.OBDT1-bkttl_vt.OBKT1 ELSE 0 END AS КоличествоОстаток

10.02.10

,CASE WHEN bkttl_vt.KIND = '3' THEN bkttl_vt.SD+bkttl_vt.OBDT1-bkttl_vt.OBKT1 ELSE 0 END AS КоличествоОстаток

23.03.10

,CASE WHEN bkttl_vt.KIND = '3' THEN bkttl_vt.SD ELSE 0 END AS КоличествоОстаток

 



Вот мне тут всеравно не очень понятно почему так....
Не понимаю закономерность.
  
Наверх
 
IP записан
 
Alex_Bob
Full Member
***
Отсутствует



Сообщений: 136
Местоположение: Липецк
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Получение остатков на классе "ПрямойЗапрос"
Ответ #25 - 09. Сентября 2010 :: 04:44
Печать  
Закономерность примерно такая (если я сам ее правильно понял  Подмигивание:
Берем квартал (январь, февраль, март)
1-15 января - берутся остатки на начало квартала + движения с 1 января по текущую границу расчета;
16-31 января - остатки на начало февраля - движения с текущей границы расчета по начало дня 1 февраля;
1 - 14 февраля - остатки на начало февраля + движения с 1 февраля по текущую границу расчета;
15 - 28 февраля - остатки на начало марта - движения с текущей границы расчета по начало дня 1 марта;
1 -15 марта - остатки на начало марта + движения с 1 марта по текущую границу расчета;
16 - 31 марта - остатки на начало след. квартала -  движения с текущей границы расчета по начало дня 1 апреля;

Границ и знаков для движений в твоем примере не показано, поэтому ты закономерность и не уловил.
  

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


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

Сообщений: 103
Местоположение: Санкт-Петербург
Зарегистрирован: 28. Февраля 2008
Пол: Мужской
Re: Получение остатков на классе "ПрямойЗапрос"
Ответ #26 - 09. Сентября 2010 :: 09:42
Печать  
vandalsvq как-то у тебя июнь странно разбивается  Улыбка

Например в апреле и июне одинаковое количество дней, а граница расчета, когда считать от конца следующего, или от начала текущего разная.

В июне расчет от следующего месяца идет с 14 числа, а в апреле с 15  Улыбка

Это просто в познавательных целях.

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


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

Сообщений: 103
Местоположение: Санкт-Петербург
Зарегистрирован: 28. Февраля 2008
Пол: Мужской
Re: Получение остатков на классе "ПрямойЗапрос"
Ответ #27 - 09. Сентября 2010 :: 09:43
Печать  
Alex_Bob писал(а) 09. Сентября 2010 :: 04:44:
Закономерность примерно такая (если я сам ее правильно понял  Подмигивание:
Берем квартал (январь, февраль, март)
1-15 января - берутся остатки на начало квартала + движения с 1 января по текущую границу расчета;
16-31 января - остатки на начало февраля - движения с текущей границы расчета по начало дня 1 февраля;
1 - 14 февраля - остатки на начало февраля + движения с 1 февраля по текущую границу расчета;
15 - 28 февраля - остатки на начало марта - движения с текущей границы расчета по начало дня 1 марта;
1 -15 марта - остатки на начало марта + движения с 1 марта по текущую границу расчета;
16 - 31 марта - остатки на начало след. квартала -  движения с текущей границы расчета по начало дня 1 апреля;

Границ и знаков для движений в твоем примере не показано, поэтому ты закономерность и не уловил.


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


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

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

Вроде все работает, выкладываю, может кому пригодиться.
Критика как всегда приветствуется  Подмигивание
  

___________________________________.txt ( 6 KB | Загрузки )
Наверх
 
IP записан
 
Попытка1С
1c++ donor
Отсутствует


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

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

Polu4enieIzDrugoyBasi.txt ( 7 KB | Загрузки )
Наверх
 
IP записан
 
vandalsvq
1c++ power user
Отсутствует


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

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Получение остатков на классе "ПрямойЗапрос"
Ответ #30 - 09. Сентября 2010 :: 17:44
Печать  
Попытка1С писал(а) 09. Сентября 2010 :: 09:42:
vandalsvq как-то у тебя июнь странно разбивается  Улыбка

Да открой код, посмотри. В целом я ему (классу) доверяю, точнее боюсь его спрашивать. Вдруг пошлет куда подалее.
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
Переключение на Главную Страницу Страницы: [1] 
ОтправитьПечать