Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Дебиторка по документам. (число прочтений - 1822 )
Berck
Junior Member
**
Отсутствует



Сообщений: 66
Местоположение: Москва
Зарегистрирован: 17. Июля 2007
Пол: Мужской
Дебиторка по документам.
28. Мая 2010 :: 13:14
Печать  
Добрый день!
Может уже сталкивался кто.
База 1С 7.7 самописка.
Есть некий регистр.
Измерение - Клиент.
Ресурс       - СуммаДолга.    

Регистр двигается документами Расход (добавляет к СуммеДолга) и Приход (вычитает из суммы долга). Документы между собой связаны только Клиентом.

Требуется получить табличку где будут на каждый день по всем клиентам все неоплаченные или частично оплаченные документы расход.

З.Ы Все это средствами SQL.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Дебиторка по документам.
Ответ #1 - 28. Мая 2010 :: 13:36
Печать  
так вроде сегодня ветка
http://www.1cpp.ru/forum/YaBB.pl?num=1274945827/0#0
  
Наверх
 
IP записан
 
Berck
Junior Member
**
Отсутствует



Сообщений: 66
Местоположение: Москва
Зарегистрирован: 17. Июля 2007
Пол: Мужской
Re: Дебиторка по документам.
Ответ #2 - 31. Мая 2010 :: 07:52
Печать  
там нето.
Если сузить задачи, то мне нужно получить остатки на конкретную дату в разрезе клиентов и документов.
До сих пор это делалось средствами 1С по алгоритму:
1) Получаем Долг на клиента.
2) Получаем все документы Расход и Приход на этого клиента отсортированные от последнего по времени к первому.
3)  Цикл по документам.
Код
Выбрать все
Пока ТЗдок.ПолучитьСтроку()=1 цикл
 Долг = Долг +(?(Док = "Расход",-1,1)*Сумма;
ТЗ.НоваяСтрока();
ТЗ.Клиент = клиент;
ТЗ.Док      = Док;
Если Долг>0 тогда
ТЗ.СуммаДолг = Сумма;
иначе
ТЗ.СуммаДолг = Сумма +Долг;
Прервать;
конецЕсли
 



И так по каждому клиенту.
Вот это получить средствами SQL.


  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Дебиторка по документам.
Ответ #3 - 31. Мая 2010 :: 09:16
Печать  
Либо надо в этот регистр добавить ДокРасходнаяНалкдная
и тогда можно использовать прямые запросы, либо все оставляй как
работает сейчас.
  
Наверх
 
IP записан
 
Berck
Junior Member
**
Отсутствует



Сообщений: 66
Местоположение: Москва
Зарегистрирован: 17. Июля 2007
Пол: Мужской
Re: Дебиторка по документам.
Ответ #4 - 16. Июня 2010 :: 11:04
Печать  
Вот получился такой скрипт:
Код
Выбрать все
/*
	Поиск расходных документов, просроченных по времени
*/
--Результирующая таблица (здесь временная, но вообще постоянная)	:
CREATE TABLE #DocDebt(
	[DTcheck] [datetime] NOT NULL, -- контрольная дата, на которую осуществляется расчет
	[DTdoc] [datetime] NOT NULL,
	[IDCust] [varchar](13)  NOT NULL,
	[IdDoc] [varchar](13) NOT NULL,
	[DocSum] [decimal](14, 4) NULL,
	[DocDebt] [decimal](14, 4) NULL,
	[Days] [int] NULL			-- сколько дней просрочки платежа по документу
) ON [PRIMARY]

CREATE UNIQUE CLUSTERED INDEX [PK_DocDebt_DT_Cust_Doc] ON #DocDebt
(
	[DTdoc] ASC,
	[IDCust] ASC,
	[IdDoc] ASC
)
-- Контрольная Дата на которую надо получить просроченные документы
declare @dtCheck datetime
set @dtCheck = '2010-06-15' --например
set nocount on

--------------------------------------------------
-- Переменные для курсора по клиентам
declare @custID varchar(9), @custdebt money
--------------------------------------------------
-- Переменные для курсора поиска просроченных документов
declare @dt datetime, @iddoc varchar(9), @debkred int, @sum money
--------------------------------------------------
-- Промежуточные расчеты
declare @DEBTdoc money, @debtTotal money
--------------------------------------------------

--	КУРСОР	Получить долги клиента на контрольную дату
declare CURR_Cust  cursor for
			select
				cust.id
				,CustDebt  = sum(case when dbt.debkred=1 then -1*doc.docsum else doc.docsum end ) -- debkred=1 оплата

			from docList	doc
			join Customers	cust on cust.id = doc.idcust
			where
				doc.dtdoc <= @dtCheck
			Group by cust.id
			Having  sum(case when dbt.debkred=1 then -1*doc.docsum else doc.docsum end )  >0 --ДОЛГ клиента нам > 0

	--------------------------------------------------
	open CURR_Cust
	fetch next from CURR_Cust into @custID, @custdebt

	---------------------------------------------------
	WHILE @@FETCH_STATUS = 0
	BEGIN

		set @DEBTdoc = @custdebt -- начинаем с долга клиента,
		set @debtTotal = @custdebt -- долг по расходному документу
		print 'Проверка клиента ' + @CustID + ' на дату ' + cast(@dtCheck as varchar(16)) +' конечный долг = ' + str(@DEBTdoc)
					--------------------------------------------------------------------------

							--	КУРСОР  сделать цикл для поиска просроченных документов
							declare CURR_Doc CURSOR FOR
								select
										 DocDate
										,IDDOC
										,debkred
										,docSum
								from docList doc
								where  IDcust  = @custID
										and dtDoc <= @dtCheck
								order by dtDoc desc, idDoc desc

							open CURR_Doc
							fetch next from CURR_Doc into @dt, @iddoc, @docNo, @debkred, @sum, @DocDef
							--------------------------------------------------------------------------
							WHILE @@FETCH_STATUS = 0
							BEGIN

								-- при достижении нулевого долга прекратить поиск, т.к. неоплаченных документов больше нет
								if @DEBTdoc <=0 break


									-- промежуточный итог долга на этот документ
									set @DEBTdoc = case @debkred when 1 then @DEBTdoc+@sum else @DEBTdoc-@sum end

									-- Если этот документ - расходная накладная, то добавить ее в таблицу
									if @sum >0 and @debkred=0
										Begin
											insert into #DocDebt (DTcheck, DTdoc, IDCust, IdDoc, DocSum, DocDebt, Days)
														Values(   @dtCheck, @dt, @CustID, @IdDoc, @sum,
																									case when @sum < @debtTotal then @sum else @debtTotal end ,
																												 datediff(day, @dt, @dtCheck))
											-- если док уже частично оплачен. то дальше не проверяем
											if @debtTotal < @sum Break

											-- промежуточный итог долга после документ
											set @debtTotal = @DEBTdoc

										End

								fetch next from CURR_Doc into @dt, @iddoc, @docNo, @debkred, @sum, @DocDef
							END -- цикл курсор по документам
							close CURR_Doc
							Deallocate CURR_Doc
			--------------------------------------------------------------------------
		fetch next from CURR_Cust into @custID, @custdebt
	END -- цикл курсор по клиентам

	close CURR_Cust
	Deallocate CURR_Cust
-------------------------------------------------------------

Select * from #DocDebt
order by DTdoc desc 



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