Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Очень популярная тема (более 25 ответов) Вопрос по использованию РегистрОстаткиОбороты (число прочтений - 6231 )
Сережа
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 20
Зарегистрирован: 01. Февраля 2010
Вопрос по использованию РегистрОстаткиОбороты
27. Мая 2010 :: 07:37
Печать  
Добрый день.
Есть регистр Взаиморасчеты, у которого Измерения:Клиент,Агент, Ресурсы:СуммаНал,СуммаБезНал
нужно получить данные: начальный остаток, приход, расход и конечный остаток по дням, примерно должно выйти так:
допустим, выбираем клиента Иванов, агента Петров и период с 01.01.01 по 07.01.01,
начальный остаток - это сумма долга клиента на начало дня, приход - это отгрузка клиенту, расход - это оплата клиента, конечный остаток - это
остаток на конец дня

день             |Нач. ост.|Приход|Расход|Кон. ост.|
--------------------------------------------------------------------
01.01.01  |10          |2          |1         |11          |
02.01.01  |11          |0          |1         |10          |
03.01.01  |10          |0          |2         |8            |
04.01.01  |8            |6          |0         |14          |
05.01.01  |14          |0          |0         |14          |
06.01.01  |14          |0          |0         |14          |
07.01.01  |14          |2          |2         |14          |

Вспомнил про ВТ $РегистрОстаткиОбороты
вот написал запросик:

     |SELECT
     |    Рег.Период as День,
     |    SUM(Рег.СуммаНалНачальныйОстаток) as НачНал,
     |    SUM(Рег.СуммаНалПриход) as ПрихНал,
     |    SUM(Рег.СуммаНалРасход) as РасхНал,
     |    SUM(Рег.СуммаНалКонечныйОстаток) as КонНал
     |FROM
     |    $РегистрОстаткиОбороты.Взаиморасчеты(:НачДата, :КонДата~,День,ДвиженияИГраницыПериода ,,
     |    ((Клиент IN (SELECT Val FROM #Клиенты) ) AND (Агент IN (SELECT Val FROM #Агенты))),(Агент,Клиент),(СуммаНал)) as Рег
     |GROUP BY
     |  Рег.Период      
     |";
     RS.УстановитьТекстовыйПараметр("НачДата", ДатаНачала);
     RS.УстановитьТекстовыйПараметр("КонДата", ДатаКонца);
     RS.УложитьСписокОбъектов(СписокКлиентов, "#Клиенты", "Клиенты");
     RS.УложитьСписокОбъектов(СписокАгентов, "#Агенты", "Агенты");
после выполнения запроса увидел печальную картину, не все дни разворачивает, если нет оборота то и не развернет,
и начальные  и конечные остатки странные выходят, точнее первый день правильно показывает, а вот остальные дни ерунду показывает,
может я ерунду написал? или может, есть другие способы получить нужные данные? приму любые подсказки, заранее спасибо
  
Наверх
 
IP записан
 
Сережа
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 20
Зарегистрирован: 01. Февраля 2010
Re: Вопрос по использованию РегистрОстаткиОбороты
Ответ #1 - 27. Мая 2010 :: 07:38
Печать  
p.s. Перед тем как создавать пост прочитал пару тем на форуме,но в одно сообщение все символы не вошли, идеи понравились, попытался сделать что то подобное,
результат тот же, нормальные данные выдает если использовать ВТ за один день, может конечно я напутал что то, я не считаю себя спецом,
не судите строго, взял пример из одного топика, правда там ПрямойЗапрос & ПоставщикДанных, установив у себя данные классы, один класс ругается при инициализации класса
ПоставщикДанных, из-за этого сделал запрос по своему.приведу пример чего у меня вышло:
     МетаДата = СоздатьОбъект("MetaDataWork");      
     RS = СоздатьОбъект("ODBCRecordset");
     RS.УстБД1С();      
     Попытка
           RS.ВыполнитьСкалярный("drop table #Периоды");
     Исключение
     КонецПопытки;      
     ТзЗапроса = СоздатьОбъект("ТаблицаЗначений");
     ТзЗапроса.Очистить();      
     ТекстЗапросаСоздать = "create table #Периоды(date datetime)";
     ТзЗапроса = RS.ВыполнитьИнструкцию(ТекстЗапросаСоздать);
     ТекстЗапроса = "insert into #Периоды";
     Для Н = 1 По (ДатаКонца - ДатаНачала)+1 Цикл
           Если Н > 1 Тогда
                 ТекстЗапроса = ТекстЗапроса + "union all ";
           КонецЕсли;
           
           ТекстЗапроса = ТекстЗапроса + "select '" + МетаДата.ПолучитьСтрИзДаты(ДатаНачала + Н - 1) + "'
           |";
     КонецЦикла;
     ТзЗапроса = RS.ВыполнитьИнструкцию(ТекстЗапроса);
     Попытка
           RS.ВыполнитьИнструкцию("drop table #Пересчет");
     Исключение
     КонецПопытки;      
     RS.ВыполнитьИнструкцию("create table #Пересчет(
     |      НачалоПериода datetime
     |      ,Агент char(9)
     |      ,Клиент char(9)
     |      ,НачОстаток numeric(38,3)
     |      ,Приход numeric(38,3)
     |      ,Расход numeric(38,3)
     |      ,КонОстаток numeric(38,3)
     |      ,primary key clustered(Агент,Клиент,НачалоПериода))");      
     
     ТзЗапросаПересчет = СоздатьОбъект("ТаблицаЗначений");  // таблица выгрузки результатов запроса
     ТзЗапросаПересчет.Очистить();
     ТекстЗапросаСбораДанных = "insert into #Пересчет
     |select
     |      p.date as НачалоПериода
     |      ,isnull(ost.Агент,$ПустойИД) as Номенклатура
     |      ,isnull(ost.Клиент,$ПустойИД) as Склад
     |      ,isnull(sum(ost.СуммаБазоваяНачальныйОстаток),0) as НачОстаток
     |      ,isnull(sum(ost.СуммаБазоваяПриход),0) as Приход
     |      ,isnull(sum(ost.СуммаБазоваяРасход),0) as Расход
     |      ,isnull(sum(ost.СуммаБазоваяКонечныйОстаток),0) as КонОстаток
     |from
     |      #Периоды as p
     |left join
     |      $РегистрОстаткиОбороты.Взаиморасчеты(:Дата1
     |            ,:Дата2~
     |            ,ДЕНЬ
     |            ,
     |            ,      
     |            ,(Агент IN (SELECT Val FROM #Агенты))
     |            ,(Агент,Клиент)
     |            ,) as ost
     |on
     |      p.date = ost.Период
     |group by ost.Агент,ost.Клиент,p.date
     |order by ost.Агент,ost.Клиент,p.date
     |";
     RS.УстановитьТекстовыйПараметр("Дата1",ДатаНачала);
     RS.УстановитьТекстовыйПараметр("Дата2",ДатаКонца);      
     RS.УложитьСписокОбъектов(СписокАгентов, "#Агенты", "Агенты");
     
     ТзЗапросаПересчет = RS.ВыполнитьИнструкцию(ТекстЗапросаСбораДанных);
     Попытка
           RS.ВыполнитьИнструкцию("drop table #Периоды");
     Исключение
     КонецПопытки;      
     ТекстЗапросаПересчетаДанных = "
     |declare @dim_Агент char(9)
     |declare @dim_Клиент char(9)
     |declare @Количество_SumBegin numeric(38,3)
     |declare @Количество_SumEnd numeric(38,3)
     |
     |update #Пересчет
     |set
     |      @Количество_SumBegin =
     |case
     |      when (@dim_Агент = Агент)and (@dim_Клиент = Клиент) then @Количество_SumEnd else НачОстаток end
     |      ,@Количество_SumEnd = @Количество_SumBegin + Приход - Расход
     |      ,НачОстаток = @Количество_SumBegin
     |      ,КонОстаток = @Количество_SumEnd
     |      ,@dim_Агент = Агент
     |      ,@dim_Клиент = Клиент
     |";
     RS.ВыполнитьИнструкцию(ТекстЗапросаПересчетаДанных);
     
     ТекстЗапросаИтог = "
     |select НачалоПериода as [Дата $Дата]
     |      ,Агент [Агент $Справочник.Агенты]
     |      ,Клиент [Клиент $Справочник.Клиенты]      
     |      ,НачОстаток as НачОстаток
     |      ,Приход as Приход
     |      ,Расход as Расход
     |      ,КонОстаток as КонОстаток
     |from #Пересчет";
     ТзЗапросаПересчет = RS.ВыполнитьИнструкцию(ТекстЗапросаИтог);
     ТзЗапросаПересчет.УдалитьКолонку("Клиент");
     ТзЗапросаПересчет.УдалитьКолонку("Агент");
     ТзЗапросаПересчет.свернуть("Дата","НачОстаток,Приход,Расход,КонОстаток");
     ТзЗапросаПересчет.Сортировать("Дата");
     ТзЗапросаПересчет.ВыбратьСтроку();

меня лично смущает пересчет таблицы,Дата1 и Дата2 не изменяются, я так понимаю нужно передавать каждый день заново для пересчета,
$РегистрОстаткиОбороты.Взаиморасчеты(:Дата1,:Дата2~..., можно по-простому конечно сделать цикл 1Сный и все время менять дату дня и запускать запрос,
результат потом добавлять в ТЗ, может я опять со своими кривыми ручками что то сделал не так, еще раз прошу помощи и совета
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Вопрос по использованию РегистрОстаткиОбороты
Ответ #2 - 27. Мая 2010 :: 08:06
Печать  
делаешь табличку с датами и джойнишь ей к своему запросу.
  
Наверх
 
IP записан
 
Сережа
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 20
Зарегистрирован: 01. Февраля 2010
Re: Вопрос по использованию РегистрОстаткиОбороты
Ответ #3 - 27. Мая 2010 :: 08:13
Печать  
Eprst писал(а) 27. Мая 2010 :: 08:06:
делаешь табличку с датами и джойнишь ей к своему запросу.


Я так и делаю, во втором посте вроде описал даже как, но опять вопрос джойнить к ВТ которая берет данные за весь период или по одному дню? За весть период если брать то приходы и расходы правильные, начальные и конечные остатки получаются не понятными, как я понимаю конечный остаток на 1 число должен равняться начальному остатку на 2 число.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Вопрос по использованию РегистрОстаткиОбороты
Ответ #4 - 27. Мая 2010 :: 09:00
Печать  
По мне, так вообще ВТ зло Улыбка
Пиши сам все руками..
  
Наверх
 
IP записан
 
Сережа
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 20
Зарегистрирован: 01. Февраля 2010
Re: Вопрос по использованию РегистрОстаткиОбороты
Ответ #5 - 27. Мая 2010 :: 09:20
Печать  
Eprst писал(а) 27. Мая 2010 :: 09:00:
По мне, так вообще ВТ зло Улыбка
Пиши сам все руками..

можно конечно и так:
     |Клиент    = Регистр.Взаиморасчеты.Клиент;
     |Агент     = Регистр.Взаиморасчеты.Агент;
     |СумНал    = Регистр.Взаиморасчеты.СуммаБазовая;
     |Функция НачНал     = НачОст(СумНал);
     |Функция ПрихНал    = Приход(СумНал);
     |Функция РасхНал    = Расход(СумНал);
     |Функция КонНал     = КонОст(СумНал);      
     |Группировка День;
       |Условие (Клиент в СписокКлиентов);
       |Условие (Агент в СписокАгентов);
но думал что ВТ РегистрОстаткиОбороты при выборе "периодичность" день выдаст такие же данные, но увы...
а сам все руками...., не хватает у меня мыслей...можете хоть направление указать что руками делать? Улыбка
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Вопрос по использованию РегистрОстаткиОбороты
Ответ #6 - 27. Мая 2010 :: 09:33
Печать  
Сережа писал(а) 27. Мая 2010 :: 09:20:
..можете хоть направление указать что руками делать? Улыбка


Да просто самому прописать запрос целиком, для получения останков и оборотов, тупо к начальному останку прибавлять приход и отнимать расход - заодно поймешь, как ВТ устроен.
Ну или добить запрос с ВТ, чтоб работал верно.
  
Наверх
 
IP записан
 
Сережа
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 20
Зарегистрирован: 01. Февраля 2010
Re: Вопрос по использованию РегистрОстаткиОбороты
Ответ #7 - 27. Мая 2010 :: 11:49
Печать  
Eprst писал(а) 27. Мая 2010 :: 09:33:
Сережа писал(а) 27. Мая 2010 :: 09:20:
..можете хоть направление указать что руками делать? Улыбка


Да просто самому прописать запрос целиком, для получения останков и оборотов, тупо к начальному останку прибавлять приход и отнимать расход - заодно поймешь, как ВТ устроен.
Ну или добить запрос с ВТ, чтоб работал верно.

Пытаюсь понять работу ВТ, с оборотами разобрался, а вот проблема с начальными остатками осталась, из таблицы итогов регистра можно получить начальный остаток только на начало периода, то есть начало месяца, а если нужно начало остатков на любой другой день? Не хочу прибегать к помощи  ВТ РегистрОстатки, но как получить остатки на любой день понять пока не могу, можете, пожалуйста, подсказать или намекнуть, как можно получить остаток на любой день месяца?
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Вопрос по использованию РегистрОстаткиОбороты
Ответ #8 - 27. Мая 2010 :: 12:06
Печать  
Дык там же есть периодичность - втыкай нужную и вперёд..
  
Наверх
 
IP записан
 
Сережа
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 20
Зарегистрирован: 01. Февраля 2010
Re: Вопрос по использованию РегистрОстаткиОбороты
Ответ #9 - 27. Мая 2010 :: 12:21
Печать  
Что то я совсем запутался, периодичность есть в ВТ, но по Вашему совету Вт не использую, вот написал обороты за произвольные дни:
     |SELECT
     |   Выборка.Агент as [Агент $Справочник.Агенты],
     |   Выборка.ДатаДок as День,
     |   Sum(Выборка.КвоПриходБезНал + Выборка.КвоПриходБазовая) As Приход,
     |   Sum(Выборка.КвоРасходБезНал + Выборка.КвоРасходБазовая) As Расход
     |FROM
     |(
     |SELECT
     |      $TabReg.Агент as Агент,
     |   CAST(LEFT(TabJ.Date_Time_IDDoc, 8) as DateTime) as ДатаДок,
     |      0 As НачОстБезНал,
     |      0 As НачОстБазовая,
     |      $TabReg.СуммаБезНал*((DEBKRED+1)%2) As КвоПриходБезНал,
     |      $TabReg.СуммаБезНал*DEBKRED As КвоРасходБезНал,
     |      $TabReg.СуммаБазовая*((DEBKRED+1)%2) As КвоПриходБазовая,
     |      $TabReg.СуммаБазовая*DEBKRED As КвоРасходБазовая
     |FROM
     |      $Регистр.Взаиморасчеты As TabReg
     |INNER JOIN _1SJOURN As TabJ ON (TabReg.IDDOC = TabJ.IDDOC)
     |WHERE
     |      TabJ.DATE_TIME_IDDOC >= :ДатаНач
     |      AND TabJ.DATE_TIME_IDDOC <= :датаКон~
     |   AND $TabReg.Агент = :Агент
     |) as Выборка
     |GROUP BY
     |      Выборка.Агент,Выборка.ДатаДок
     |ORDER BY
     |      Выборка.Агент
     |";
Понимаю что нужно через UNION ALL посчитать начальные остатки, но как это сделать пока понять не могу,
если использовать $РегистрИтоги.Взаиморасчеты то можно получить только на начало месяца остаток, я конечно нуб в запросах но хочется разобраться в них...
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Вопрос по использованию РегистрОстаткиОбороты
Ответ #10 - 27. Мая 2010 :: 12:48
Печать  
Для начала, в регистре стоит галка "быстрая обработка движений ?"
  
Наверх
 
IP записан
 
Сережа
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 20
Зарегистрирован: 01. Февраля 2010
Re: Вопрос по использованию РегистрОстаткиОбороты
Ответ #11 - 27. Мая 2010 :: 12:50
Печать  
Eprst писал(а) 27. Мая 2010 :: 12:48:
Для начала, в регистре стоит галка "быстрая обработка движений ?"

не стоит, Тип регистра - остатки
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Вопрос по использованию РегистрОстаткиОбороты
Ответ #12 - 27. Мая 2010 :: 13:10
Печать  
тип того:
Код
Выбрать все
 |SELECT
     |   Выборка.Агент as [Агент $Справочник.Агенты],
     |   Выборка.ДатаДок as День,
	 |   Sum(Выборка.НачОстБезНал+Выборка.НачОстБазовая) НачОст
	 |   Sum(Выборка.НачОстБезНал+Выборка.НачОстБазовая+Выборка.КвоПриходБезНал + Выборка.КвоПриходБазовая
	 |     -Выборка.КвоРасходБезНал - Выборка.КвоРасходБазовая)) КонОст
	 |
     |   Sum(Выборка.КвоПриходБезНал + Выборка.КвоПриходБазовая) As Приход,
     |   Sum(Выборка.КвоРасходБезНал + Выборка.КвоРасходБазовая) As Расход
	 |
     |FROM
     |(
	 |SELECT
     |	$TabReg.Агент as Агент,
     |   CAST(LEFT(TabJ.Date_Time_IDDoc, 8) as DateTime) as ДатаДок,
     |	0 As НачОстБезНал,
     |	0 As НачОстБазовая,
     |	$TabReg.СуммаБезНал*((DEBKRED+1)%2) As КвоПриходБезНал,
     |	$TabReg.СуммаБезНал*DEBKRED As КвоРасходБезНал,
     |	$TabReg.СуммаБазовая*((DEBKRED+1)%2) As КвоПриходБазовая,
     |	$TabReg.СуммаБазовая*DEBKRED As КвоРасходБазовая
     |FROM
     |	$Регистр.Взаиморасчеты As TabReg
     |INNER JOIN _1SJOURN As TabJ ON (TabReg.IDDOC = TabJ.IDDOC)
     |WHERE
     |	TabJ.DATE_TIME_IDDOC >= :ДатаНач
     |	AND TabJ.DATE_TIME_IDDOC <= :датаКон~
     |   AND $TabReg.Агент = :Агент
	 |Union ALL
 	 | SELECT
	 |		$Р.Агент,
	 |		'',
	 |		$Р.СуммаБезНал,
	 |		$Р.СуммаБазовая,
	 |		0,
	 |	0,
	 |	0,
	 |	0
	 |	FROM
	 |		$РегистрИтоги.Взаиморасчеты as Р
	 |	WHERE Р.period = :ПредМесяц~
	 |
     |	UNION ALL
	 |
	 |	SELECT
	 |		$Р.Агент,
	 |		'',
	 |		$Р.СуммаБезНал*(1 - Р.debkred * 2),
	 |		$Р.СуммаБазовая*(1 - Р.debkred * 2),
	 |		0,
	 |	0,
	 |	0,
	 |	0
	 |	FROM
	 |		$Регистр.Взаиморасчеты AS Р
	 |	INNER JOIN
	 |		1sjourn jr ON (Р.iddoc = jr.iddoc)
	 |			AND (jr.DATE_TIME_IDDOC BETWEEN :НачалоМесяца AND :ПредДата~)
	 |
     |) as Выборка
     |GROUP BY
     |	Выборка.Агент,Выборка.ДатаДок
     |ORDER BY
     |	Выборка.Агент
     |";  

  
Наверх
 
IP записан
 
Сережа
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 20
Зарегистрирован: 01. Февраля 2010
Re: Вопрос по использованию РегистрОстаткиОбороты
Ответ #13 - 27. Мая 2010 :: 13:12
Печать  
ох огромное спасибо Улыбка побегу учить данный код Улыбка еще раз спс))
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Вопрос по использованию РегистрОстаткиОбороты
Ответ #14 - 28. Мая 2010 :: 06:08
Печать  
(0) Сорри за off
А регистр у Вас закрывается?
т.е. если сделку по клиенту начал один менеджер а закончил ее другой.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать