![]() |
|
v7: Как можно получить бухгалтерские итоги через прямой запрос 1С++ база DBF | ☑ | ||
---|---|---|---|---|
0
sergei123654
20.08.10
✎
09:02
|
Утро доброе! Продолжаю грызть гранит науки!
Собственно весь вопрос в теме данной ветки! На форумах пишут что в ДБФ это сделать не возможно. но может кто то сталкивался и решил подобную задачу. подскажите кто знает! |
|||
1
Sadovnikov
20.08.10
✎
09:06
|
(0) "На форумах пишут что в ДБФ это сделать не возможно" - это на каких форумах такое пишут?
|
|||
2
Злобный Йожег
20.08.10
✎
09:06
|
Возможно, но довольно геморно, я так понимаю. Самому еще ни разу не приходилось, но все советовали только вот что:
Прямой запрос к бухгалтерским таблицам Прямой запрос для получения бухгалтерских остатков Видимо, это единственные способы. |
|||
3
Sadovnikov
20.08.10
✎
09:07
|
||||
4
Злобный Йожег
20.08.10
✎
09:10
|
(1)Кстати, а как БЕЗ этого класса к бухитогам обратиться? Обычным прямым запросом то есть. Для примера, получить остатки по номенклатуре по кол-ву и сумме на определенную дату.
|
|||
5
sergei123654
20.08.10
✎
09:11
|
(1) точнее пишут все примеры если СКУль стоит. именно для ДБФ ниче не находил
|
|||
6
Sadovnikov
20.08.10
✎
09:11
|
(4) Давно-давно писал. Даж не помню - точно ли рабочий запрос. Работаем с регистрами.
Set NoCount On Declare @НачДатаДляОборотов Char(8), @КонДатаПлюс1 Char(8), @НачКвартала DateTime Declare @ИдСчета Char(9), @ИдСубконто2 Char(9) Set @ИдСчета = ' DD ' --1.6 ТМЗ Set @КонДатаПлюс1 = '20040305' Set @НачКвартала = '20040101' Set @НачДатаДляОборотов = '20040301' Select ID ИдСчета Into #Табсчетов From _1SACCS (NoLock) Where PlanID = 46364 And Left(SCHKOD,9) = ' 1. 2' And IsFolder = 0 Select ИдЦФО, ИдСубконто2, ВидСубконто2, ИдСчета , Sum(Сумма) Сумма From ( --Итоги Select SC0 ИдЦФО, SC1 ИдСубконто2, VSC1 ВидСубконто2, ACCID ИдСчета , (SD + OBDT1 + OBDT2 - OBKT1 - OBKT2) Сумма From _1SBKTTL (NoLock) Where ACCID In (Select ИдСчета From #Табсчетов (NoLock)) And [Date] = @НачКвартала And Kind = 1 --Сумма по аналитике And PlanID = 46364 Union All Select DTSC0 ИдЦФО, DTSC1 ИдСубконто2, VDTSC1 ВидСубконто2, ACCDTID ИдСчета, SUM_ Сумма From _1SENTRY (NoLock) Where ACCDTID In (Select ИдСчета From #Табсчетов (NoLock)) --По дебету And Date_Time_DocID >= @НачДатаДляОборотов And Date_Time_DocID <= @КонДатаПлюс1 And ACTIVE = '' And PROVKIND = '' And PlanID = 46364 Union All Select KTSC0 ИдЦФО, KTSC1 ИдСубконто2, VKTSC1 ВидСубконто2, ACCKTID ИдСчета, -SUM_ Сумма From _1SENTRY (NoLock) Where ACCKTID In (Select ИдСчета From #Табсчетов (NoLock)) --По кредиту And Date_Time_DocID >= @НачДатаДляОборотов And Date_Time_DocID <= @КонДатаПлюс1 And ACTIVE = '' And PROVKIND = '' And PlanID = 46364 ) Итоги Group By ИдЦФО, ИдСубконто2, ВидСубконто2, ИдСчета Drop Table #Табсчетов |
|||
7
Sadovnikov
20.08.10
✎
09:12
|
(5) И в чем именно сложность запросы под dbf переделать?
|
|||
8
Mikeware
20.08.10
✎
09:12
|
(5) никакой принципиальной разницы нет.
|
|||
9
sergei123654
20.08.10
✎
09:16
|
(7) только вчера с ними столкнулся... я пока не совсем понимаю чем они отличаются. понял что разница в названиях полей таблиц. и то не уверен что это так
|
|||
10
Злобный Йожег
20.08.10
✎
09:20
|
(6) Интересно... Спасибо. Надо будет изучить на досуге.
|
|||
11
sergei123654
20.08.10
✎
14:21
|
(2)(3) спасибо за ссылки
подскажите что не так делаю! пишу запрос ТекстЗапроса = " |SELECT | Остатки.OBDT1 as [OBDT1 $Число], | Остатки.OBKT1 as [OBKT1 $Число], | Остатки.OBDT2 as [OBDT2 $Число], | Остатки.OBKT2 as [OBKT2 $Число], | Остатки.OBDT3 as [OBDT3 $Число], | Остатки.OBKT3 as [OBKT3 $Число] //| Остатки.SC0 as [Котрагент $Справочник.Контрагенты] |FROM | 1SBKTTL as Остатки |WHERE | (Остатки.DATE =:ДатаОстатков) AND (Остатки.ACCID =:СчетОстатков) AND (Остатки.SC0 =:Контрагет)"; Запрос.УстановитьТекстовыйПараметр("ДатаОстатков", ВыбКонПериода); Запрос.УстановитьТекстовыйПараметр("СчетОстатков", Счет); Запрос.УстановитьТекстовыйПараметр("Контрагет", Контраг); ТЗ = Запрос.ВыполнитьИнструкцию(ТекстЗапроса); Остаток = ТЗ.Итог("OBDT1")+ТЗ.Итог("OBDT2")+ТЗ.Итог("OBDT3")-ТЗ.Итог("OBKT1")-ТЗ.Итог("OBKT2")-ТЗ.Итог("OBKT3"); Сообщить("Остаток"); не могу получить остаток на дату. без условия по дате вываливает список по квартально, или по месяцам, в общем в каком то периоде. и получается после выполнения запроса я получаю не одну строку с остатком, а несколько строк по каким то периодам1 Что не так делаю? |
|||
12
sergei123654
20.08.10
✎
14:44
|
вверх
|
|||
13
Ёпрст
гуру
20.08.10
✎
14:48
|
(11) записи в этой табличке хранятся с периодичностью квартал..
дальше думай. |
|||
14
Rovan
гуру
20.08.10
✎
14:54
|
Ужас ! На ккие ухищрения надо идти в 7.7 !!
|
|||
15
sergei123654
20.08.10
✎
14:59
|
(13) сдается мне нужно куда то в условия капать?
|
|||
16
sergei123654
20.08.10
✎
15:01
|
сайчас условие такое стоит
|WHERE | (Остатки.DATE BETWEEN :ДатаОстатковНач~~ AND :ДатаОстатковКон~~) AND (Остатки.ACCID =:СчетОстатков) AND (Остатки.SC0 =:Контрагет)"; но на мой взгляд - это тот же х, ток в другой руке |
|||
17
Sadovnikov
20.08.10
✎
15:02
|
(16) Там выше пост под номером (6) есть. Покури его чуток.
|
|||
18
sergei123654
20.08.10
✎
15:05
|
(17) подскажите что такое (NoLock) и PlanID
|
|||
19
Sadovnikov
20.08.10
✎
15:23
|
(18) (NoLock) - хинт для SQL. PlanID - идентификатор плана счетов.
|
|||
20
sergei123654
20.08.10
✎
15:41
|
(13)додумался до
|SELECT | Sum(Остатки.OBDT1) as OBDT1, | Sum(Остатки.OBDT2) as OBDT2, | Sum(Остатки.OBDT3) as OBDT3, | Sum(Остатки.OBKT1) as OBKT1, | Sum(Остатки.OBKT2) as OBKT2, | Sum(Остатки.OBKT3) as OBKT3, | Остатки.SC0 as [Котрагент $Справочник.Контрагенты] |FROM | 1SBKTTL as Остатки |WHERE | (Остатки.DATE BETWEEN :ДатаОстатковНач~~ AND :ДатаОстатковКон~~) AND (Остатки.ACCID =:СчетОстатков) AND (Остатки.SC0 =:Котрагент) | Group By Остатки.SC0"; дает ошибку FAILED! ICommandText::Execute(): SQL: Aggregate on non-numeric expression. подумать дальше? |
|||
21
Ёпрст
гуру
20.08.10
✎
15:51
|
(20) нельзя суммировать не числовые поля.
кастани их перед этим. |
|||
22
Ёпрст
гуру
20.08.10
✎
15:52
|
+21 ну и то, что этот запрос радугу покажет, тебе , скорее всего пофик..
|
|||
23
Sadovnikov
20.08.10
✎
15:54
|
(20) Тоесть, (6) скурить ты так и не хочешь?
|
|||
24
sergei123654
20.08.10
✎
15:55
|
(21) что значит костантить?
(22) что за радуга? (23)это пока все что вынес из (6) |
|||
25
Ёпрст
гуру
20.08.10
✎
16:03
|
(24)
1.cast 2.На небе радугу когда нибудь видел после дождя ? Она тебе о чем нибудь говорит ? Нет ? Вот и твой запрос "ни о чем" в данном виде. |
|||
26
Кириллка
20.08.10
✎
17:26
|
(6)у Kind тип char(1) ^)
|
|||
27
Эльниньо
20.08.10
✎
21:03
|
(0) А чем временные Бухитоги не устраивают?
|
|||
28
sergei123654
20.08.10
✎
21:13
|
(27) не мои слова, но у меня проблема идентичная
"Как известно монопольный вариант расчета конечных остатков на требуемую дату всегда быстр и весел, но.., если подключается второй сетевой, и т.д. пользователи, расчет заметно падает, я даже скажу что пипец как падает… вывод. Данный вариант прямых расчетов действительно делает из заядлого 1Сника" - http://www.1cpp.ru/forum/YaBB.pl?num=1211377364/21 |
|||
29
sergei123654
21.08.10
✎
12:42
|
(25)Ёпрст3, (23)Sadovnikov огромное вам спасибо.
Разродился вот таким вот запросом. на серваке выполняется порядка 4-ех секунд.((( Буду рад критике, что то мне подсказывает что через задницу как то все работает в нем, раз так медленно. ДатаНачалаУчета = '01.01.2005'; КонДатаРасчетаОстатков = КонМесяца(НачКвартала((ВыбКонПериода))-1); ТекстЗапроса = " |SELECT | ТаблДляПолученияОстатка.Котрагент as [Котрагент $Справочник.Контрагенты], | Sum(ТаблДляПолученияОстатка.СуммаОстаток+ТаблДляПолученияОстатка.СуммаДебет-ТаблДляПолученияОстатка.СуммаКредит) as Остаток |FROM |( //получаюсь получит остатки | SELECT | Остатки.SC0 as Котрагент, | Sum((CAST(Остатки.OBDT1 as NUMERIC(15,3)) + CAST(Остатки.OBDT2 as NUMERIC(15,3)) + CAST(Остатки.OBDT3 as NUMERIC(15,3)) - CAST(Остатки.OBKT1 as NUMERIC(15,3)) - CAST(Остатки.OBKT2 as NUMERIC(15,3)) - CAST(Остатки.OBKT3 as NUMERIC(15,3)))) as СуммаОстаток, | Sum(0) as СуммаДебет, | Sum(0) as СуммаКредит | FROM | 1SBKTTL as Остатки | WHERE | (Остатки.DATE BETWEEN :ДатаОстатковНач~~ AND :ДатаОстатковКон~~) AND (Остатки.ACCID =:СчетОстатков) AND (Остатки.SC0 =:Котрагент) | GROUP BY | Остатки.SC0 | | UNION ALL //пытаюсь получить кредитный оборот | SELECT | Проводки.KTSC0 as Котрагент, | Sum(0) as СуммаОстаток, | Sum(0) as СуммаДебет, | Sum(CAST(Проводки.SUM as NUMERIC(15,3))) as СуммаКредит | FROM | 1SENTRY as Проводки | WHERE | (Проводки.DATE BETWEEN :ДатаПроводкиНач~~ AND :ДатаПроводкиКон~~) AND (Проводки.ACCKTID =:СчетОстатков) AND (Проводки.KTSC0 =:Котрагент) | GROUP BY | Проводки.KTSC0 | | UNION ALL //пытаюсь получить дебетный оборот | SELECT | Проводки.DTSC0 as Котрагент, | Sum(0) as СуммаОстаток, | Sum(CAST(Проводки.SUM as NUMERIC(15,3))) as СуммаДебет, | Sum(0) as СуммаКредит | FROM | 1SENTRY as Проводки | WHERE | (Проводки.DATE BETWEEN :ДатаПроводкиНач~~ AND :ДатаПроводкиКон~~) AND (Проводки.ACCDTID =:СчетОстатков) AND (Проводки.DTSC0 =:Котрагент) | GROUP BY | Проводки.DTSC0 | ) as ТаблДляПолученияОстатка |GROUP BY | Котрагент"; Запрос.УстановитьТекстовыйПараметр("ДатаОстатковНач", ДатаНачалаУчета); Запрос.УстановитьТекстовыйПараметр("ДатаОстатковКон", КонДатаРасчетаОстатков); Запрос.УстановитьТекстовыйПараметр("ДатаПроводкиНач", КонДатаРасчетаОстатков); Запрос.УстановитьТекстовыйПараметр("ДатаПроводкиКон", ВыбКонПериода); Запрос.УстановитьТекстовыйПараметр("СчетОстатков", Счет); Запрос.УстановитьТекстовыйПараметр("Котрагент", Контраг); ТЗ = Запрос.ВыполнитьИнструкцию(ТекстЗапроса); ТЗ.ВыбратьСтроку(); Что не так сделал? Раскритикуйте! |
|||
30
Mnemonic1C
21.08.10
✎
14:22
|
Это ж какая бухгалтерия должна быть что б появилась необходимость в прямых
|
|||
31
sergei123654
21.08.10
✎
17:20
|
(30) - см. в (28)
у кого нибудь есть какие нибудь идеи по ускорению данного в (29) запросе? |
|||
32
el-gamberro
21.08.10
✎
17:25
|
покажи план запроса
|
|||
33
sergei123654
21.08.10
✎
17:25
|
в смысле план запроса?
|
|||
34
el-gamberro
21.08.10
✎
17:26
|
складывать числа человека не учили?
|
|||
35
Тьма
21.08.10
✎
17:28
|
(31)Вопрос в (28) решается установкой терминального сервера, что проще, быстрее, дешевле и в большинстве случаев эффективнее, чем переписывание всех запросов под прямые.
|
|||
36
el-gamberro
21.08.10
✎
17:29
|
35 пипец еще онид умник
|
|||
37
el-gamberro
21.08.10
✎
17:30
|
покажи план запроса.
|
|||
38
Тьма
21.08.10
✎
17:33
|
(36)pit'a на тебя нет
|
|||
39
sergei123654
21.08.10
✎
17:34
|
1,получаю из таблицы остатков остаток по счету на опред контрагента с момента начала ведения учета по последнюю дату последнего полного квартала
2,с начала квартала (начКвартала(ДатаНаКоторуюХочуПолучитьОстаток)) по ДатаНаКоторуюХочуПолучитьОстаток получаю оборот по дебету и кредиту, что бы получить актуальные по сегодняшний день остатки. как то так примерно я и мыслю. Это и есть план? (34) что там со сложением? чесно говоря не чему меня не учили, все как то сам и если кто пожет. таки учусь (35) предлогал я им терминал... молчат |
|||
40
Cthulhu
21.08.10
✎
17:35
|
(36): ну я ещё один, у которого если с регистрами возникала необходимость ускорять - то с бух.итогами исключительно штатными запросами и достаточно быстро (благо бух.итоги "вылизаны" в технологической части даже по логике гораздо лучше остального). ну вот не было проблем со скоростями штатных бух.запросов - а с регистрами, выборками документов и элементов справочников - да, случалось.
|
|||
41
sergei123654
21.08.10
✎
17:39
|
(40) попробуйте протестировать, путем одновременного запуска, один и тот же бух.запрос с 3-ех машин.
на серваке данные появятся мгновенно, 3 другие которые по сетки соеденены с серваком повиснут минуты на 3. база дбф. вчера в офисе тестировали. а у клиентов 15 машин которые постоянно обращаются через бух.запрос. |
|||
42
sergei123654
21.08.10
✎
17:42
|
+(41)* 2 другие машины.
и получается что 2 машины висят по 3 минуты, а если все 15 то повисаю мин 10-15. в общем сделал запрос и сменло идешь куришь а тут посоветовали что прямые запросы избавят от этого. но у меня сомнения. запрос из (29) на серваке выполняется 4 секунды... |
|||
43
КонецЦикла
21.08.10
✎
20:31
|
Вот шматок из отчета по сверке остатков, мот помогет
ДатаНачКвартала = Формат(НачКвартала(ВыбДата),"ДГГГГММДД"); ДатаКон = Формат(ВыбДата,"ДГГГГММДД"); Если НачКвартала(ВыбДата) = НачМесяца(ВыбДата) Тогда //первый месяц квартала СтрСальдо = "SD"; ДатаНач = Формат(НачКвартала(ВыбДата),"ДГГГГММДД"); ИначеЕсли ДобавитьМесяц(НачКвартала(ВыбДата), 1) = НачМесяца(ВыбДата) Тогда //второй СтрСальдо = "SD+(OBDT1-OBKT1)"; ДатаНач = Формат(ДобавитьМесяц(НачКвартала(ВыбДата), 1), "ДГГГГММДД"); ИначеЕсли ДобавитьМесяц(НачКвартала(ВыбДата), 2) = НачМесяца(ВыбДата) Тогда //третий СтрСальдо = "SD+(OBDT1-OBKT1)+(OBDT2-OBKT2)"; ДатаНач = Формат(ДобавитьМесяц(НачКвартала(ВыбДата), 2), "ДГГГГММДД"); КонецЕсли; |
|||
44
Бертыш
21.08.10
✎
20:32
|
Давно бы блин учебник по 1с++ написали бы
|
|||
45
КонецЦикла
21.08.10
✎
20:32
|
|SELECT Номенклатура.SP21509 НоменклатураIDD
|, 0 СуммаТ |, 0 КоличествоТ |, SUM(SUM_) СуммаБ |, SUM(AMOUNT) КоличествоБ |FROM |( |SELECT SC0=CASE WHEN VKTSC0=3989 THEN KTSC0 WHEN VKTSC1=3989 THEN KTSC1 WHEN VKTSC2=3989 THEN KTSC2 WHEN VKTSC3=3989 THEN KTSC3 ELSE ' ' END |,SUM_=-CONVERT(NUMERIC(18, 3), SUM_),AMOUNT=-CONVERT(NUMERIC(18, 3), AMOUNT) |FROM ( SELECT ID FROM BaseMxBuh.dbo._1SACCS WHERE PLANID=16100 AND SCHKOD>=:ВыбСчет AND substring(SCHKOD,1,8)=:ВыбСчет AND (SC0 = 3989 OR SC1 = 3989 OR SC2 = 3989 OR SC3 = 3989) |) AS DT,BaseMxBuh.dbo._1SENTRY ENTRY |WHERE PROVKIND<>'D' AND DATE_TIME_DOCID BETWEEN '" + ДатаНач + "' and '" + ДатаКон + "' AND ACTIVE=' ' AND ACCKTID=DT.ID AND ( ENTRY.VKTSC0=3989 OR ENTRY.VKTSC1=3989 OR ENTRY.VKTSC2=3989 OR ENTRY.VKTSC3=3989 ) |"; Если ТаблСкладов.СчетУчета <> "004." Тогда //склад недостач в бухгалтерии ТекстЗапроса = ТекстЗапроса + " |AND ( ENTRY.VKTSC0=3984 AND ENTRY.KTSC0<>' 3M001 ' |) |"; ТекстЗапроса = ТекстЗапроса + " |AND ( ENTRY.VKTSC0=3984 AND ENTRY.KTSC0=" + ТаблСкладов.ИДВБухгалтерии + " |) |"; КонецЕсли; Если СписокИнвентаризаций.ТекущаяСтрока() <> 1 Тогда ТекстЗапроса = ТекстЗапроса + " |AND ( |KTSC0 IN (SELECT Id FROM BaseMxBuh.dbo.InvHistoryTov WHERE Dt = :ВыбДатаИнв) |OR KTSC1 IN (SELECT Id FROM BaseMxBuh.dbo.InvHistoryTov WHERE Dt = :ВыбДатаИнв) |OR KTSC2 IN (SELECT Id FROM BaseMxBuh.dbo.InvHistoryTov WHERE Dt = :ВыбДатаИнв) |)"; КонецЕсли; ТекстЗапроса = ТекстЗапроса + " | UNION ALL |SELECT SC0=CASE WHEN VDTSC0=3989 THEN DTSC0 WHEN VDTSC1=3989 THEN DTSC1 WHEN VDTSC2=3989 THEN DTSC2 WHEN VDTSC3=3989 THEN DTSC3 ELSE ' ' END |,SUM_=CONVERT(NUMERIC(18, 3), SUM_),AMOUNT=CONVERT(NUMERIC(18, 3), AMOUNT) |FROM ( SELECT ID FROM BaseMxBuh.dbo._1SACCS WHERE PLANID=16100 AND SCHKOD>=:ВыбСчет AND substring(SCHKOD,1,8)=:ВыбСчет AND (SC0 = 3989 OR SC1 = 3989 OR SC2 = 3989 OR SC3 = 3989) |) AS DT,BaseMxBuh.dbo._1SENTRY ENTRY |WHERE PROVKIND<>'K' AND DATE_TIME_DOCID BETWEEN '" + ДатаНач + "' and '" + ДатаКон + "' AND ACTIVE=' ' AND ACCDTID=DT.ID AND ( ENTRY.VDTSC0=3989 OR ENTRY.VDTSC1=3989 OR ENTRY.VDTSC2=3989 OR ENTRY.VDTSC3=3989 ) |"; Если ТаблСкладов.СчетУчета <> "004." Тогда //склад недостач в бухгалтерии ТекстЗапроса = ТекстЗапроса + " |AND ( ENTRY.VDTSC0=3984 AND ENTRY.DTSC0<>' 3M001 ' |) |"; ТекстЗапроса = ТекстЗапроса + " |AND ( ENTRY.VDTSC0=3984 AND ENTRY.DTSC0=" + ТаблСкладов.ИДВБухгалтерии + " |) |"; КонецЕсли; Если СписокИнвентаризаций.ТекущаяСтрока() <> 1 Тогда ТекстЗапроса = ТекстЗапроса + " |AND ( |DTSC0 IN (SELECT Id FROM BaseMxBuh.dbo.InvHistoryTov WHERE Dt = :ВыбДатаИнв) |OR DTSC1 IN (SELECT Id FROM BaseMxBuh.dbo.InvHistoryTov WHERE Dt = :ВыбДатаИнв) |OR DTSC2 IN (SELECT Id FROM BaseMxBuh.dbo.InvHistoryTov WHERE Dt = :ВыбДатаИнв) |)"; КонецЕсли; ТекстЗапроса = ТекстЗапроса + " | UNION ALL |SELECT SC0=CASE WHEN VSC0=3989 THEN SC0 WHEN VSC1=3989 THEN SC1 WHEN VSC2=3989 THEN SC2 WHEN VSC3=3989 THEN SC3 ELSE ' ' END |,SUM_=CASE KIND WHEN '1' THEN " + СтрСальдо + " ELSE 0 END,AMOUNT=CASE KIND WHEN '3' THEN " + СтрСальдо + " ELSE 0 END |FROM ( SELECT ID FROM BaseMxBuh.dbo._1SACCS WHERE PLANID=16100 AND SCHKOD>=:ВыбСчет AND substring(SCHKOD,1,8)=:ВыбСчет AND (SC0 = 3989 OR SC1 = 3989 OR SC2 = 3989 OR SC3 = 3989) |) AS DT,BaseMxBuh.dbo._1SBKTTL BKTTL |WHERE DATE='" + ДатаНачКвартала + "' AND ACCID=DT.ID AND ( BKTTL.VSC0=3989 OR BKTTL.VSC1=3989 OR BKTTL.VSC2=3989 OR BKTTL.VSC3=3989 ) | AND (KIND = '1' OR KIND = '2' OR KIND = '3') |"; Если ТаблСкладов.СчетУчета <> "004." Тогда //склад недостач в бухгалтерии ТекстЗапроса = ТекстЗапроса + " |AND ( BKTTL.VSC0=3984 AND BKTTL.SC0<>' 3M001 ' |) |"; ТекстЗапроса = ТекстЗапроса + " |AND ( BKTTL.VSC0=3984 AND BKTTL.SC0=" + ТаблСкладов.ИДВБухгалтерии + " |) |"; КонецЕсли; Если СписокИнвентаризаций.ТекущаяСтрока() <> 1 Тогда ТекстЗапроса = ТекстЗапроса + " |AND ( |SC0 IN (SELECT Id FROM BaseMxBuh.dbo.InvHistoryTov WHERE Dt = :ВыбДатаИнв) |OR SC1 IN (SELECT Id FROM BaseMxBuh.dbo.InvHistoryTov WHERE Dt = :ВыбДатаИнв) |OR SC2 IN (SELECT Id FROM BaseMxBuh.dbo.InvHistoryTov WHERE Dt = :ВыбДатаИнв) |)"; КонецЕсли; ТекстЗапроса = ТекстЗапроса + " |) AS SD |LEFT JOIN BaseMxBuh.dbo.SC961 AS Номенклатура ON LEFT(SD.SC0, 9) = Номенклатура.ID |GROUP BY Номенклатура.SP21509 |HAVING SUM(SUM_)<>0 OR SUM(AMOUNT)<>0 |) AS Запрос |
|||
46
Кириллка
21.08.10
✎
20:37
|
(40)ну как сказать, "вылизаны"....
пример из опыта: штатный оборотный бухзапрос с отбором по субконто по одному субсчету за период работал 20 минут, переписаный на sql-запрос - 20 секунд. Не все замечательно там. |
|||
47
Кириллка
21.08.10
✎
20:39
|
+46 ну сессно не dbf.
|
|||
48
Cthulhu
21.08.10
✎
20:50
|
(41): даже и пробовать не буду. у меня давно все юзера работаю "на сервере", а что 1с-ина в сетевом режиме гонят бешенные объемы данных - так то проблема не бух.итогов.
(46): да так и сказать. я старый человек, и прежде чем чтио-то делать - соотношу цену и результат. так вот ни разу(!) при использовании бух.итогов мне не встречалось случаев, когда бы разработка вместо штатных (и довольно корректно и быстро работающих) бух.запросов "овчинка" более быстрого получения тех же данных стоила "выделки" (трудозатрат на, между нами говоря, не такое уж простое, очевидное и легкое ваяние универсальных или не слишком универсальных прямых запросов). как-то так. (47): а у меня много где "ну ессно" именно dbf. так, между прочим. |
|||
49
Кириллка
21.08.10
✎
20:55
|
(48)так я под знамена не зову, у каждого это дело личное и можно сказать интимное.
Некоторые считают приемлимым ждать 20 минут, другим и 20 сек много. Ну, а когда в месяц от (1.5 - 3.5) млн. проводок, то выбор очевиден :) |
|||
50
sergei123654
21.08.10
✎
21:47
|
(43) спасибо, с помощью этого удалось сократить выполнение запроса почти на секунду. тестировал на сервере. в итоге мой прямой запрос на бух итоги выглядит так:
ДатаНачалаУчета = НачКвартала(ВыбКонПериода); КонДатаРасчетаОстатков = КонМесяца(НачКвартала((ВыбКонПериода))-1); Если НачКвартала(ВыбКонПериода) = НачМесяца(ВыбКонПериода) Тогда //первый месяц квартала СтрСальдо = "CAST(Остатки.SD as NUMERIC(15,3))"; КонДатаРасчетаОстатков = НачМесяца(ВыбКонПериода); ИначеЕсли ДобавитьМесяц(НачКвартала(ВыбКонПериода), 1) = НачМесяца(ВыбКонПериода) Тогда //второй СтрСальдо = "CAST(Остатки.SD as NUMERIC(15,3))+(CAST(Остатки.OBDT1 as NUMERIC(15,3))-CAST(Остатки.OBKT1 as NUMERIC(15,3)))"; КонДатаРасчетаОстатков = ДобавитьМесяц(НачКвартала(ВыбКонПериода), 1); ИначеЕсли ДобавитьМесяц(НачКвартала(ВыбКонПериода), 2) = НачМесяца(ВыбКонПериода) Тогда //третий СтрСальдо = "CAST(Остатки.SD as NUMERIC(15,3))+(CAST(Остатки.OBDT1 as NUMERIC(15,3))-CAST(Остатки.OBKT1 as NUMERIC(15,3)))+(CAST(Остатки.OBDT2 as NUMERIC(15,3))-CAST(Остатки.OBKT2 as NUMERIC(15,3)))"; КонДатаРасчетаОстатков = ДобавитьМесяц(НачКвартала(ВыбКонПериода), 2); КонецЕсли; ТекстЗапроса = " //получаюсь получит остатки |SELECT | ТаблДляПолученияОстатка.Котрагент as [Котрагент $Справочник.Контрагенты], | Sum(ТаблДляПолученияОстатка.СуммаОстаток+ТаблДляПолученияОстатка.СуммаДебет-ТаблДляПолученияОстатка.СуммаКредит) as Остаток |FROM |( | SELECT | Остатки.SC0 as Котрагент, | Sum("+СтрСальдо+") as СуммаОстаток, | Sum(0) as СуммаДебет, | Sum(0) as СуммаКредит | FROM | 1SBKTTL as Остатки | WHERE | (Остатки.DATE BETWEEN :ДатаОстатковНач~~ AND :ДатаОстатковКон~~) AND (Остатки.ACCID =:СчетОстатков) AND (Остатки.SC0 =:Котрагент) | GROUP BY | Остатки.SC0 | | UNION ALL //пытаюсь получить кредитный оборот | SELECT | Проводки.KTSC0 as Котрагент, | Sum(0) as СуммаОстаток, | Sum(0) as СуммаДебет, | Sum(CAST(Проводки.SUM as NUMERIC(15,3))) as СуммаКредит | FROM | 1SENTRY as Проводки | WHERE | (Проводки.DATE BETWEEN :ДатаПроводкиНач~~ AND :ДатаПроводкиКон~~) AND (Проводки.ACCKTID =:СчетОстатков) AND (Проводки.KTSC0 =:Котрагент) | GROUP BY | Проводки.KTSC0 | | UNION ALL //пытаюсь получить дебетный оборот | SELECT | Проводки.DTSC0 as Котрагент, | Sum(0) as СуммаОстаток, | Sum(CAST(Проводки.SUM as NUMERIC(15,3))) as СуммаДебет, | Sum(0) as СуммаКредит | FROM | 1SENTRY as Проводки | WHERE | (Проводки.DATE BETWEEN :ДатаПроводкиНач~~ AND :ДатаПроводкиКон~~) AND (Проводки.ACCDTID =:СчетОстатков) AND (Проводки.DTSC0 =:Котрагент) | GROUP BY | Проводки.DTSC0 | ) as ТаблДляПолученияОстатка |GROUP BY | Котрагент"; Запрос.УстановитьТекстовыйПараметр("ДатаОстатковНач", ДатаНачалаУчета); Запрос.УстановитьТекстовыйПараметр("ДатаОстатковКон", КонДатаРасчетаОстатков); Запрос.УстановитьТекстовыйПараметр("ДатаПроводкиНач", КонДатаРасчетаОстатков); Запрос.УстановитьТекстовыйПараметр("ДатаПроводкиКон", ВыбКонПериода); Запрос.УстановитьТекстовыйПараметр("СчетОстатков", Счет); Запрос.УстановитьТекстовыйПараметр("Котрагент", Контраг); ТЗ = Запрос.ВыполнитьИнструкцию(ТекстЗапроса); ТЗ.ВыбратьСтроку(); буду рад критике. (45) что это? что делает этот запрос? (48)проблема в том что несколько пользователей выполняют один и тот же запрос может быть этих бух запросы как то писали через не то место что они долго работают. но у меня задание ускорить все что они понаписали, вот и в силу того кто писал эти бух запросы стал сразу искать решение через прямые запросы. про терминал молчат. |
|||
51
sergei123654
21.08.10
✎
21:49
|
+(50) а писал эти бух запросы мой шеф!)
|
|||
52
Тьма
21.08.10
✎
22:02
|
(50)Хорошо, а поднять новелловский файл-сервер это в рамках? Или попробовать на 2003 сервере, если он там, конечно, есть, настроить кеширование?
|
|||
53
sergei123654
21.08.10
✎
22:15
|
(52)что такое новеловский файл-сервер? как настраивать кеширивание тоже слабо представляю...
|
|||
54
Тьма
21.08.10
✎
22:54
|
||||
55
МастерВопросов
22.08.10
✎
05:46
|
(7)(8)
Прямые запросы к ДБФ не поддерживают виртуальных таблиц. Например, чтобы получить значение периодического реквизита там надо писать два запроса в запросе. Так же формат даты другой. Физические таблицы могут быть немного другие. Плюс многие команды не работают, или работают по другому. Например уложитьвсписок там надо делать через временную таблицу, а не параметр запроса. |
|||
56
МастерВопросов
22.08.10
✎
06:05
|
(31) я тоже как то пол дня писал простенький прямой запрос к ДБФ, а по итогу он работал дольше запроса, написаного на встроенном языке. Больше я к теме прямых запросов к ДБФ не возвращался.
|
|||
57
МастерВопросов
22.08.10
✎
06:21
|
"Если уж пошла такая пьянка", просветите плс по такому вопросу. В инете пишут, что можно писать прямые запросы к ДБФ без всякого 1С++, через АDO.Connection к провайдеру ФоксПро, а как тогда обходят отсутствие метапарсера? Или он там всё таки как то прикручивается?
|
|||
58
ДенисЧ
22.08.10
✎
06:38
|
(57) Без метапарсера вполне можно обойтись.
Писать select * from sc33 вместо select * from $справочник.Номенклатура не так уж и сложно... Работали же люди с радугой, когда 1с++ не было |
|||
59
МастерВопросов
22.08.10
✎
07:51
|
(58) а как быть с преобразованием данных из запроса? Ну получишь ты набор символов, а как его преобразовать в ссылку на объект?
А к итогам регистра, или оборота как обращаться? Сначала выгружать это во временные таблицы, а потом строить к ним запрос? Тогда весь смысл запроса теряется. |
|||
60
Mikeware
22.08.10
✎
07:54
|
(55) И что? Различия dbf и sql давно описаны, стуктуры бух.таблиц тоже.
(56) Может, дело в соотношении радиусов? (59) Смотря что нужно получить. |
|||
61
ДенисЧ
22.08.10
✎
07:58
|
(59) Данные получать - через metadatawork
Итоги - руками запрос писать. |
|||
62
Mikeware
22.08.10
✎
08:04
|
(61) Тогда смысл теряется.
Да и проще тогда препроцессировать запрос, выполнить через АДО, результаты в таблицу, откуда их примитивным запросом достать с типизацией. Но в общем-то, возникает традиционный китайский вопрос... |
|||
63
Ёпрст
гуру
23.08.10
✎
08:50
|
(56) всё зависит от радиуса
|
|||
64
Ёпрст
гуру
23.08.10
✎
08:51
|
(50) можно еще ускорить.. в разы, если почитаешь Это
http://www.1cpp.ru/forum/YaBB.pl?num=1184317705 ну или пиши на 1sqlite - там автоматический подбор индекса. |
|||
65
sergei123654
23.08.10
✎
09:53
|
(64)спасибо конечно за помощь, но да ну его в баню. в терминал будем переносить. если с обычным 1Совским кодом, при условии что 2 компа в сети выполняют один и тот же запрос, операция выполняется 2 мин 40 сек. то с прямым запросом время возрасло до 7 минут.
|
|||
66
Ёпрст
гуру
23.08.10
✎
09:56
|
(65) запрос не оптимизирован по индексу - вот и долго
|
|||
67
sergei123654
23.08.10
✎
11:29
|
(66) так ради интереса буду пробовать
подскажите как оптимизировать такой запрос.не могу разобраться с датой | SELECT | Проводки.KTSC0 as Котрагент, | Sum(CAST(Проводки.SUM as NUMERIC(15,3))) as СуммаКредит | FROM | 1SENTRY as Проводки | WHERE | Проводки.DATE BETWEEN :ДатаПроводкиНач~~ AND :ДатаПроводкиКон~~ | GROUP BY | Проводки.KTSC0 |
|||
68
Ёпрст
гуру
23.08.10
✎
11:42
|
(67) условие в части WHERE нужно достроить слева и справа до подходящего индекса, например до DATETIME
|
|||
69
sergei123654
23.08.10
✎
11:53
|
(68) сделал
| SELECT | Остатки.SC0 as [Котрагент $Справочник.Контрагенты], | Sum("+СтрСальдо+") as СуммаОстаток, | Sum(0) as СуммаДебет, | Sum(0) as СуммаКредит | FROM | 1SBKTTL as Остатки | WHERE | (DTOS(Остатки.DATE) BETWEEN DTOS(:ДатаОстатковНач~~) AND DTOS(:ДатаОстатковКон~~)) | AND (Остатки.ACCID + Остатки.SC0 =:СчетОстатков + :Котрагент) | GROUP BY | Остатки.SC0"; по времени тоже самое выполняется, если не дольше |
|||
70
Ёпрст
гуру
23.08.10
✎
12:00
|
(69) ну как тебе сказать помягче.. х..ню сделал :)
|
|||
71
Ёпрст
гуру
23.08.10
✎
12:00
|
+70 читай (64) внимательнее, там всё написано и с примерами.
|
|||
72
Ёпрст
гуру
23.08.10
✎
12:01
|
+71 вот этим провершь потом, посмотрев план запроса
http://www.1cpp.ru/forum/YaBB.pl?num=1210677779/15 |
|||
73
sergei123654
23.08.10
✎
15:43
|
(70) а как по другому?
вот эту строку никак ведь не преобразуешь? (DTOS(Остатки.DATE) BETWEEN DTOS(:ДатаОстатковНач~~) AND DTOS(:ДатаОстатковКон~~)) |
|||
74
Ёпрст
гуру
23.08.10
✎
15:48
|
(73) покажи, какие индексы есть у 1SBKTTL у тебя.
|
|||
75
sergei123654
23.08.10
✎
15:52
|
#----Indexes------
# Name |Descr |Unique|Indexed fields |DBName I=ACC1 | |0 |DATE,KIND,ACCID,SC0,SC1,SC2,CURRID |ACC1 |
|||
76
Ёпрст
гуру
23.08.10
✎
15:56
|
тип того должно быть:
where DTOS(Остатки.DATE)+Остатки.KIND+Остатки.ACCID+Остатки.SC0+Остатки.SC1+Остатки.SC2 +Остатки.currid between DTOS(:ДатаОстатковНач~~)+' '+:СчетОстатков+:Контрагент+ ' '+' '+' ' And DTOS(:ДатаОстатковКон~~)+' '+:СчетОстатков+:Контрагент+ 'ZZZZZZZZZ'+'ZZZZZZZZZ'+'ZZZZZZZZZ' |
|||
77
Ёпрст
гуру
23.08.10
✎
15:59
|
+76 должно быть сделано Запрос.Выполнить("EXECSCRIPT('SET ANSI OFF')"); перед этим.
|
|||
78
sergei123654
23.08.10
✎
16:08
|
(76) отбор по контрагенту не отрабатывает...
вываливает весь список контрагентов. нужно соединение наверно делать? или опять я не туда? |
|||
79
Ёпрст
гуру
23.08.10
✎
16:47
|
Тьфу мл..насмотришься на тупизну и сам тупить начинаешь, це же табличка остатков - там итоги на начало каждого квартала..
тип того напиши: | SELECT | Остатки.SC0 as [Котрагент $Справочник.Контрагенты] | From | 1SBKTTL as Остатки | WHERE | | DTOS(Остатки.DATE)+Остатки.KIND+Остатки.ACCID+Остатки.SC0+Остатки.SC1+Остатки.SC2 +Остатки.currid Like DTOS(:НачДата~~)+'_'+:СчетОстатков+:ВыбКонтрагент+ |'_________'+'_________'+'_________' Запрос.УстановитьТекстовыйПараметр("НачДата",НачКвартала(НачДата)); Запрос.УстановитьТекстовыйПараметр("ВыбКонтрагент",ВыбКонтрагент); Запрос.УстановитьТекстовыйПараметр("СчетОстатков",СчетПоКоду(Счет)); только сумы там нужные воткни.. блин.. пришлось даже пофигуратор открыть. |
|||
80
v_rtex
23.08.10
✎
17:04
|
-- Сальдо по 62 счету
SELECT Остатки.Клиент Клиент, SUM(Остатки.Сумма) Сумма FROM ( SELECT БИ.SC0 Клиент, ISNULL(БИ.SD,0) Сумма FROM _1sbkttl БИ (NOLOCK) WHERE БИ.Kind=1 AND БИ.Date=$НачалоПериода.Квартал(:ДатаКон) AND БИ.AccID=:Счет_62 UNION ALL SELECT Пров.DTSC0, Пров.Sum_ FROM _1sentry Пров (NOLOCK) WHERE Пров.Date_Time_DocID BETWEEN CONVERT(char(8),$НачалоПериода.Квартал(:ДатаКон),112) AND :ДатаКон~ AND Пров.AccDTID=:Счет_62 UNION ALL SELECT Пров.KTSC0, -Пров.Sum_ FROM _1sentry Пров (NOLOCK) WHERE Пров.Date_Time_DocID BETWEEN CONVERT(char(8),$НачалоПериода.Квартал(:ДатаКон),112) AND :ДатаКон~ AND Пров.AccKTID=:Счет_62 ) Остатки GROUP BY Остатки.Клиент HAVING SUM(Остатки.Сумма)<>0 |
|||
81
Дык ё
23.08.10
✎
18:19
|
(80) кг. это если понадобится остаток на дату в 3-ем месяце квартала, оно у тебя будет суммировать проводки за весь квартал, вместо того, чтобы взять готовые обороты из _1sbkttl или считать от начала следующего квартала
это была реклама AccountsRecordset ;-) |
|||
82
vandalsvq
24.08.10
✎
10:43
|
AccountsRecordset - только для SQL
я не понимаю почему автор отказался от использования класса "ПрямойЗапрос" :). |
|||
83
Ёпрст
гуру
24.08.10
✎
10:45
|
(82) рано еще.. пусть научиться сам писать..руками.
А то понимашь, приучают сразу к ВТ и прочим удобствам, а как и что и откуда берётся - не в зуб ногой :) |
|||
84
vandalsvq
24.08.10
✎
11:07
|
(83) есть подозрение что около 80% пользователей v8 не очень то понимают что да как там организовано. И вроде не парятся. Им что ВТ, что доступ к реквизиту через кучу точек. :))))))
|
|||
85
sergei123654
24.08.10
✎
12:19
|
(79) спасибо конечно. но не отрабатывает. такое ощущение что по данному контрагенту и счету нет данных
|
|||
86
Ёпрст
гуру
24.08.10
✎
12:23
|
(85) счет то какой хоть?
|
|||
87
sergei123654
24.08.10
✎
15:13
|
(86)662.1 субконто1 - контрагент субконто1 - Спр.Основания
если поледняя проводка была в 2009 г. на начало сегодняшнего квартала он ведь должен показать сальдо? |
|||
88
Mikeware
24.08.10
✎
15:17
|
(84) Есть подозрения, что 95% "программистов 1с" не понимают, "что да как там организовано" - что в 7.7, что в 8.х
|
|||
89
sergei123654
24.08.10
✎
15:18
|
(88) чесно говоря не понимал. и вот только сейчас кое что начинает складываться
|
|||
90
sergei123654
24.08.10
✎
15:22
|
+(87) проблема с периодом
|
|||
91
Ёпрст
гуру
24.08.10
✎
15:39
|
(89) да нет проблемы там никакой, есть проблема в твоём непонимании, что хранится в табличке 1sbkttl
|
|||
92
sergei123654
24.08.10
✎
15:55
|
(91) в ней хранятся(или расчитываются???%) остатки на начала квартала и текущие обороты по месяцам за текущий квартал в разрезе счетов и субконто. Правильно?
Но вот нсли я получаю остатки на Like DTOS(:НачДата~~). это означает что всем остаткам в таблице "нравится" НачДата - начало квартала искомой даты. но если почему же нет отбора? пустой отбор получается. как будто на начало этого квартала нет ничего? я слабо разбираюсь как в таком запросе задать условия отбора вот это - '_________' - означает что там пусто? |
|||
93
Mikeware
24.08.10
✎
16:05
|
(92) like , Прилагательное - подобный
|
|||
94
filh
24.08.10
✎
16:40
|
(92) почитай внимательно все что написано тут http://www.1cpp.ru/forum/YaBB.pl?num=1184317705/0
придет немного понимания про индексы. |
|||
95
Дык ё
24.08.10
✎
23:26
|
(82) мой ответ был на (80), а там запрос именно к sql
(83) в 80% случаев запрос с ВТ будет эффективнее, чем написанный в лоб запрос без ВТ при тех же затратах времени на написание. + запрос без ВТ сложнее. в чем профит? |
|||
96
SnarkHunter
25.08.10
✎
00:53
|
Профит в 20%...
|
|||
97
sergei123654
25.08.10
✎
08:12
|
с вот таким вот условием:
| WHERE | DTOS(Остатки.DATE)+Остатки.KIND+Остатки.ACCID+Остатки.SC0 Like | DTOS(:ДатаОстатковНач~~)+'1'+:СчетОстатков+:Котрагент"; все работает. правда скорость вообще никакая. для ускорения нужно добавить все индексы таблицы в условие DTOS(Остатки.DATE)+Остатки.KIND+Остатки.ACCID+Остатки.SC0+Остатки.SC1+Остатки.SC2 +Остатки.currid - это все индексы. делаю так: | WHERE | DTOS(Остатки.DATE)+Остатки.KIND+Остатки.ACCID+Остатки.SC0+Остатки.SC1 Like | DTOS(:ДатаОстатковНач~~)+'1'+:СчетОстатков+:Котрагент+'_________'"; и результат запроса становится пустым. то есть нет никаких данных с таким условием. (94) в той ссылке написано: " если значение отбора не задано, то при установке параметра достаточно передавать '_________'" но не отрабатывает у меня... |
|||
98
Ёпрст
гуру
25.08.10
✎
08:35
|
(95)я не утверждал , что с ВТ медленнее..:)
Имхо, писать надо уметь что так, что эдак.. |
|||
99
Ёпрст
гуру
25.08.10
✎
08:38
|
(97) открой словарь и напиши сюда индексное выражение.
|
|||
100
zak555
25.08.10
✎
08:39
|
сто !
|
|||
101
sergei123654
25.08.10
✎
08:43
|
(99)в FoxPro пишет это:
DTOS(date)+kind+accid+sc0+sc1+sc2+currid |
|||
102
Ёпрст
гуру
25.08.10
✎
08:50
|
(101) ну и ? Какого ж хрена ты индексное выражение сократил что в левой, что в правой части в (97) ???
|
|||
103
sergei123654
25.08.10
✎
08:53
|
(102) для проверки на каком именно элементе у меня прекращает условие работать
сейчас отрабатывает вот это | DTOS(Остатки.DATE)+Остатки.KIND+Остатки.ACCID+Остатки.SC0+Остатки.SC1+Остатки.SC2 Like | (DTOS(:ДатаОстатковНач~~)+'1'+:СчетОстатков+:Котрагент+'_____________'+'_____________') а если пишу так: | DTOS(Остатки.DATE)+Остатки.KIND+Остатки.ACCID+Остатки.SC0+Остатки.SC1+Остатки.SC2 + Остатки.Currid Like | (DTOS(:ДатаОстатковНач~~)+'1'+:СчетОстатков+:Котрагент+'_____________'+'_____________'+'_________') то опять выборка пустая |
|||
104
Ёпрст
гуру
25.08.10
✎
09:00
|
(103) ясен пень..SC1,SC2 - по 9 символов, если что, а не 13
|
|||
105
filh
25.08.10
✎
09:06
|
(104) вроде как описано 13...
F=SC0 | |C |13 |0 F=SC1 | |C |13 |0 F=SC2 | |C |13 |0 глянул в cdx там тоже 13 символов. |
|||
106
filh
25.08.10
✎
09:10
|
+105 и кажется, если в конфе описано скажем справочник.КтоТо - тогда 9, а если просто справочник, тогда 13
|
|||
107
Ёпрст
гуру
25.08.10
✎
09:11
|
(106) так и есть..добавляется вид справочника к ид..
Просто в типовой конфе - определенного вида всё. |
|||
108
Ёпрст
гуру
25.08.10
✎
09:15
|
(103) ты уверен, что kind у тебя = 1 ???
|
|||
109
Ёпрст
гуру
25.08.10
✎
09:15
|
а не 7 например ?
|
|||
110
filh
25.08.10
✎
09:21
|
(103) покажи всю структуру из dd по табличке 1SBKTTL.
(107) Может там не типовая и с чего то родилось у автора 13, а не 9. |
|||
111
Ленинград
25.08.10
✎
09:55
|
закладко
|
|||
112
sergei123654
25.08.10
✎
17:56
|
(104) - в Остатки.SC0+Остатки.SC1+Остатки.SC2 по 13 символов. в условии ставлю
+:Котрагент+'_____________'+'_____________' все отрабатывает хорошо. Остатки.Currid имеет 9 символов на нее в условии ставлю +'_________' и результат запроса получаю пустым (108) в это пока не вдавался, но думаю что '1'. главное построить запрос с использованием индексов. (110) #==TABLE no 223 : Остатки # Name |Descr |Type[A/S/U]|DBTableName|ReUsable T=1SBKTTL |Остатки |A |1SBKTTL |1 #-----Fields------- # Name |Descr |Type|Length|Precision F=DATE |Period |D |8 |0 F=ACCID |AccountDt Id |C |9 |0 F=CURRID |Currency Id |C |9 |0 F=KIND |Total kind |C |1 |0 F=OBDT1 |Total turnover DT |C |16 |0 F=OBKT1 |Total turnover KT |C |16 |0 F=OBDT2 |Total turnover DT |C |16 |0 F=OBKT2 |Total turnover KT |C |16 |0 F=OBDT3 |Total turnover DT |C |16 |0 F=OBKT3 |Total turnover KT |C |16 |0 F=SD |Saldo |C |16 |0 F=FLAGS | |N |1 |0 F=VSC0 | |C |4 |0 F=SC0 | |C |13 |0 F=OSC0 | |N |1 |0 F=VSC1 | |C |4 |0 F=SC1 | |C |13 |0 F=OSC1 | |N |1 |0 F=VSC2 | |C |4 |0 F=SC2 | |C |13 |0 F=OSC2 | |N |1 |0 #----Indexes------ # Name |Descr |Unique|Indexed fields |DBName I=ACC1 | |0 |DATE,KIND,ACCID,SC0,SC1,SC2,CURRID |ACC1 # не типовая конфа, очень сильно дописана |
|||
113
Mikeware
25.08.10
✎
18:04
|
(112) "очень сильно дописать" бухгалтерскую подсистему ты можешь только изменением количества субконто, и добавлением разделителя учета.
|
|||
114
ТочноеЯдро
26.08.10
✎
02:56
|
кстати об индексах: 1sqlite уже предлагали ?
|
|||
115
sergei123654
26.08.10
✎
11:02
|
(114) попробовал. работает. намного быстрей чем предыдущие запросы.
Попытка ЗагрузитьВнешнююКомпоненту("1sqlite.dll"); Сообщить("Подключил компоненту"); Исключение КонецПопытки; База=СоздатьОбъект("SQLiteBase"); База.Открыть(:memory:); Запрос=База.НовыйЗапрос(); Запрос.ВыполнитьЗапрос("PRAGMA journal_mode = OFF"); Запрос.ВыполнитьЗапрос("create virtual table _1SBKTTL using dbeng(_1S.Bkttl)"); Запрос.ВыполнитьЗапрос("create virtual table _1SENTRY using dbeng(_1S.ENTRY)"); Запрос.Подставлять("Контрагент",Контрагент); Запрос.Подставлять("Счет",СчетПоКоду("662.1")); Запрос.Подставлять("ДатаОстатков",Формат(НачКвартала(Дата2),"Д YYYYMMDD")); Запрос.Отладка(1); Если НачКвартала(Дата2) = НачМесяца(Дата2) Тогда //первый месяц квартала СтрСальдо = "CAST(Остатки.SD as NUMERIC(15,3))"; КонДатаРасчетаОстатков = НачМесяца(Дата2); ИначеЕсли ДобавитьМесяц(НачКвартала(Дата2), 1) = НачМесяца(Дата2) Тогда //второй СтрСальдо = "CAST(Остатки.SD as NUMERIC(15,3))+(CAST(Остатки.OBDT1 as NUMERIC(15,3))-CAST(Остатки.OBKT1 as NUMERIC(15,3)))"; КонДатаРасчетаОстатков = ДобавитьМесяц(НачКвартала(Дата2), 1); ИначеЕсли ДобавитьМесяц(НачКвартала(Дата2), 2) = НачМесяца(Дата2) Тогда //третий СтрСальдо = "CAST(Остатки.SD as NUMERIC(15,3))+(CAST(Остатки.OBDT1 as NUMERIC(15,3))-CAST(Остатки.OBKT1 as NUMERIC(15,3)))+(CAST(Остатки.OBDT2 as NUMERIC(15,3))-CAST(Остатки.OBKT2 as NUMERIC(15,3)))"; КонДатаРасчетаОстатков = ДобавитьМесяц(НачКвартала(Дата2), 2); КонецЕсли; ТекстЗапроса="SELECT |"+СтрСальдо+" КоличествоОстаток |FROM _1SBKTTL AS Остатки |WHERE (Остатки.ACCID = :Счет) | AND (Остатки.DATE = :ДатаОстатков) | AND (Остатки.SC0 = :Контрагент) |"; ТЗ=Запрос.ВыполнитьЗапрос(ТекстЗапроса); ТЗ.ВыбратьСтроку(); Спасибо буду изучать дальше. Ёпрст3 - отдельное огромное спасибо! Очень помогли! |
|||
116
Ёпрст
гуру
26.08.10
✎
11:18
|
(115)
>>> Запрос.ВыполнитьЗапрос("create virtual table _1SBKTTL using dbeng(_1S.Bkttl)"); Так писать ужо давно не надо, есть автоподключение таблиц: |select * | from [Справочник.Номенклатура] |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |