Имя: Пароль:
1C
 
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 [Справочник.Номенклатура]
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс