Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) Оптимизация последовательных остатков в 1С (число прочтений - 5363 )
Var
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 21
Зарегистрирован: 12. Июля 2006
Оптимизация последовательных остатков в 1С
27. Июля 2006 :: 08:18
Печать  
всем привет Улыбка

Есть две таблицы (вернее результат запроса)
с колонками "Фирма склад товар Кво Сум"

нада получить Т1=Т1+Т2
причем так что если столбцы ФИРМА СКЛАД ТОВАР совподают то сумировать Кво и Сумму
иначе в Т1 добовлять новые строки из Т2
Как? ))

можно наверно зделать так:
select т1.кво+т2.кво т1.сумма+т2.сумма where т1.фирма = т2.фирма и т1.товар = т2.товар и т1.склад = т2.склад

а потом точно также INSERTтока с NOT
но это будет 2 действия а это наверно плохо?

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

но дело в том что мне нада оперировать сразу с несколькими фирмами складами и товарами которые задаются в условии

тоесть курсором наверно неполучится да и медленно

подскажите как сделать чтобы работало наиболее быстро )))



и еще вопрос:
оптимизировано ли в последовательное проведение документов задним числом
или всегда остатки считаются от границы итогов + движения?

мне интересно в какой компаненте оптимизировано последовательное проведение причем с разными филтрами ) так как в следующем документе могут появится товары которых небыло в прошлом документе )
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Оптимизация последовательных остатков в 1С
Ответ #1 - 27. Июля 2006 :: 08:54
Печать  
В компоненте это вряд ли будет реализовано, т.к. нужно хранить результат предыдущего расчета. На клиенте это реализовать не очень трудно (IMHO).
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
Var
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 21
Зарегистрирован: 12. Июля 2006
Re: Оптимизация последовательных остатков в 1С
Ответ #2 - 27. Июля 2006 :: 09:00
Печать  
Почему бы в компаненте не сделать "временую" (или не временую) таблицу(ы) и использовать для хранения остатков на нужный "момент(ы) времени", может какой нибудь объект забабахать специалный, конечно можно вручную, но помоему можно и в функционал запихнуть так как этои методы универсальны (imho)
  
Наверх
 
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Оптимизация последовательных остатков в 1С
Ответ #3 - 27. Июля 2006 :: 09:06
Печать  
Var писал(а) 27. Июля 2006 :: 09:00:
Почему бы в компаненте не сделать "временую" (или не временую) таблицу(ы) и использовать для хранения остатков на нужный "момент(ы) времени", может какой нибудь объект забабахать специалный, конечно можно вручную, но помоему можно и в функционал запихнуть так как этои методы универсальны (imho)

А что, скулёвые таблицы уже не канают для временного хранения чего-то там? Пишем что-нить типа
Код
Выбрать все
SELECT ... FROM ... WHERE ...
INTO #ВременнаяТаблица 

и пользуемся сколько влезет

По первому вопросу, сделай запрос к любому регистру не на ТА, включи отладку в рекордсете, и посмотри как там объединяются таблица итогов с таблицей движений.  Есть такое волшебное слово GROUP BY. А ещё есть UNION ALL.
  
Наверх
 
IP записан
 
Var
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 21
Зарегистрирован: 12. Июля 2006
Re: Оптимизация последовательных остатков в 1С
Ответ #4 - 27. Июля 2006 :: 11:08
Печать  
ADirks писал(а) 27. Июля 2006 :: 09:06:
Var писал(а) 27. Июля 2006 :: 09:00:
Почему бы в компаненте не сделать "временую" (или не временую) таблицу(ы) и использовать для хранения остатков на нужный "момент(ы) времени", может какой нибудь объект забабахать специалный, конечно можно вручную, но помоему можно и в функционал запихнуть так как этои методы универсальны (imho)

А что, скулёвые таблицы уже не канают для временного хранения чего-то там? Пишем что-нить типа
Код
Выбрать все
SELECT ... FROM ... WHERE ...  
INTO #ВременнаяТаблица 

и пользуемся сколько влезет

По первому вопросу, сделай запрос к любому регистру не на ТА, включи отладку в рекордсете, и посмотри как там объединяются таблица итогов с таблицей движений.  Есть такое волшебное слово GROUP BY. А ещё есть UNION ALL.


спасибки, дело в том что небыло уверености что UNION ALL оптимальный способ Улыбка
  
Наверх
 
IP записан
 
Var
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 21
Зарегистрирован: 12. Июля 2006
Re: Оптимизация последовательных остатков в 1С
Ответ #5 - 27. Июля 2006 :: 14:05
Печать  
ADirks писал(а) 27. Июля 2006 :: 09:06:
Var писал(а) 27. Июля 2006 :: 09:00:
Почему бы в компаненте не сделать "временую" (или не временую) таблицу(ы) и использовать для хранения остатков на нужный "момент(ы) времени", может какой нибудь объект забабахать специалный, конечно можно вручную, но помоему можно и в функционал запихнуть так как этои методы универсальны (imho)

А что, скулёвые таблицы уже не канают для временного хранения чего-то там? Пишем что-нить типа
Код
Выбрать все
SELECT ... FROM ... WHERE ...  
INTO #ВременнаяТаблица 

и пользуемся сколько влезет

По первому вопросу, сделай запрос к любому регистру не на ТА, включи отладку в рекордсете, и посмотри как там объединяются таблица итогов с таблицей движений.  Есть такое волшебное слово GROUP BY. А ещё есть UNION ALL.


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

целых 3 действия

может можно както скомбинировать UPDATE и INSERT в одно действие?
  
Наверх
 
IP записан
 
Var
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 21
Зарегистрирован: 12. Июля 2006
Re: Оптимизация последовательных остатков в 1С
Ответ #6 - 27. Июля 2006 :: 14:39
Печать  
UPDATE Остатки

SET Кво = Кво+ДВИЖЕНИЯ.КВо

WHERE СКЛАД = Движения.СКЛАД AND ТОВАР = Движения.ТОВАР;




INSERT INTO Остатки
                     SELECT склад товар кво
                     FROM ДВИЖЕНИЯ
                     WHERE Остатки.товар <> движения.товар AND Остатки.СКЛАД <> движения.Склад





так правильно ???

тоесть то что совпадает плюсую то что несовпадает (тоесть является новым набором значений) добовляю в таблицу
  
Наверх
 
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Оптимизация последовательных остатков в 1С
Ответ #7 - 28. Июля 2006 :: 03:25
Печать  
Правильно, только непонятно зачем. Тащить чего-то из таблицы движений в таблицу остатков только для того, чтобы иметь этот самый остаток всегда актуальным - мне представляется лишним. Лучше объединять таблицу начальных остатков с таблицей движений.  Быстрее будет. Операции записи в таблицу гораздо более трудоёмки чем извлечения.
  
Наверх
 
IP записан
 
Var
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 21
Зарегистрирован: 12. Июля 2006
Re: Оптимизация последовательных остатков в 1С
Ответ #8 - 29. Июля 2006 :: 07:25
Печать  
ADirks писал(а) 28. Июля 2006 :: 03:25:
Правильно, только непонятно зачем. Тащить чего-то из таблицы движений в таблицу остатков только для того, чтобы иметь этот самый остаток всегда актуальным - мне представляется лишним. Лучше объединять таблицу начальных остатков с таблицей движений.  Быстрее будет. Операции записи в таблицу гораздо более трудоёмки чем извлечения.


вот зачем:
http://1csql.ru/materials/articles/develop.html~c1e4f6d5-fcaf-d47d-2ac0-7be4cf7d...
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Оптимизация последовательных остатков в 1С
Ответ #9 - 29. Июля 2006 :: 11:08
Печать  
По указанной ссылке есть и описание алгоритма, и примеры.

Пример для 1С++
Дано:
 Регистр ОстаткиТоваров
   Измерения: Фирма, Товар, Склад
   Ресурс: ОстатокТовара
 Документ РасходнаяНакладная
От документа к документу меняются склад и товарный состав.

Этап № 1 (первый документ):
Код
Выбрать все
ТекстЗапроса = "
|SELECT ОстаткиТоваровОстатки.Товар Тов
|	, :ВыбСклад Скл
|	, ОстаткиТоваровОстатки.ОстатокТовараОстаток Ост
|INTO #TempTable
|FROM $РегистрОстатки.ОстаткиТоваров(:ВыбМомент ~,
|		INNER JOIN $ДокументСтроки.РасходнаяНакладная AS РасходнаяНакладнаяСтроки ON Товар = $РасходнаяНакладнаяСтроки.Товар,
|		(РасходнаяНакладнаяСтроки.IDDOC = :ВыбДок)
|		AND (Фирма = :ВыбФирма) AND (Склад = :ВыбСклад),
|		Товар,) AS ОстаткиТоваровОстатки
|";
рс.УстановитьТекстовыйПараметр("ВыбМомент", СформироватьПозициюДокумента(ВыбДок, -1));
рс.УстановитьТекстовыйПараметр("ВыбДок",    ВыбДок);
рс.УстановитьТекстовыйПараметр("ВыбФирма",  ВыбДок.Фирма);
рс.УстановитьТекстовыйПараметр("ВыбСклад",  ВыбДок.Склад);
рс.ВыполнитьСкалярный(ТекстЗапроса); 



Этап № 2 (последующие документы):
Код
Выбрать все
ТекстЗапроса = "
|UPDATE #TempTable
|	SET Ост = Ост + (CASE WHEN ОстаткиТоваров.DEBKRED = 0 THEN $ОстаткиТоваров.ОстатокТовара ELSE -$ОстаткиТоваров.ОстатокТовара END)
|FROM #TempTable
|	INNER JOIN $Регистр.ОстаткиТоваров AS ОстаткиТоваров ON #TempTable.Тов = $ОстаткиТоваров.Товар AND #TempTable.Скл = $ОстаткиТоваров.Склад
|	INNER JOIN _1SJOURN AS Журнал ON ОстаткиТоваров.IDDOC = Журнал.IDDOC
|WHERE ($ОстаткиТоваров.Фирма = :ВыбФирма)
|	AND (Журнал.DATE_TIME_IDDOC Between :ПредМомент~ AND :ВыбМомент~)
|";
рс.УстановитьТекстовыйПараметр("ПредМомент", СформироватьПозициюДокумента(ПредДок, -1));
рс.УстановитьТекстовыйПараметр("ВыбМомент",  СформироватьПозициюДокумента(ВыбДок,  -1));
рс.УстановитьТекстовыйПараметр("ВыбФирма",   ВыбДок.Фирма);
рс.ВыполнитьСкалярный(ТекстЗапроса);

ТекстЗапроса = "
|INSERT INTO #TempTable
|SELECT ОстаткиТоваровОстатки.Товар Тов
|	, :ВыбСклад Скл
|	, ОстаткиТоваровОстатки.ОстатокТовараОстаток Ост
|FROM $РегистрОстатки.ОстаткиТоваров(:ВыбМомент ~,
|		INNER JOIN (SELECT $РасходнаяНакладнаяСтроки.Товар Тов
|					FROM $ДокументСтроки.РасходнаяНакладная AS РасходнаяНакладнаяСтроки
|					WHERE (NOT $РасходнаяНакладнаяСтроки.Товар IN (SELECT #TempTable.Тов FROM #TempTable WHERE #TempTable.Скл = :ВыбСклад))
|						AND (РасходнаяНакладнаяСтроки.IDDOC = :ВыбДок)
|			) Подзапрос ON Товар = Подзапрос.Тов,
|		(Фирма = :ВыбФирма) AND (Склад = :ВыбСклад),
|		Товар,) AS ОстаткиТоваровОстатки
|";
рс.УстановитьТекстовыйПараметр("ВыбМомент", СформироватьПозициюДокумента(ВыбДок, -1));
рс.УстановитьТекстовыйПараметр("ВыбДок",    ВыбДок);
рс.УстановитьТекстовыйПараметр("ВыбФирма",  ВыбДок.Фирма);
рс.УстановитьТекстовыйПараметр("ВыбСклад",  ВыбДок.Склад);
рс.ВыполнитьСкалярный(ТекстЗапроса); 



Получение остатков:
Код
Выбрать все
ТекстЗапроса = "
|SELECT #TempTable.Тов [Товар $Справочник.Номенклатура]
|	, #TempTable.Ост Остаток
|FROM $ДокументСтроки.РасходнаяНакладная AS РасходнаяНакладнаяСтроки
|		INNER JOIN #TempTable ON #TempTable.Тов = $РасходнаяНакладнаяСтроки.Товар
|WHERE (РасходнаяНакладнаяСтроки.IDDOC = :ВыбДок)
|	AND (#TempTable.Скл = :ВыбСклад)
|";
рс.УстановитьТекстовыйПараметр("ВыбДок",    ВыбДок);
рс.УстановитьТекстовыйПараметр("ВыбСклад",  ВыбДок.Склад);
тз = рс.ВыполнитьИнструкцию(ТекстЗапроса);
 



P.S. Код не оптимален - для наглядности. Алгоритм исходит из того, что интервал между ПредДок и ВыбДок значительно меньше периодичности сохранения остатков.
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
Var
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 21
Зарегистрирован: 12. Июля 2006
Re: Оптимизация последовательных остатков в 1С
Ответ #10 - 01. Августа 2006 :: 13:20
Печать  
Спосибо )
Да, по идее если востанавливаешь ФИФО по последовательности, то расчет партий должен быть очень быстр
вообщето в монополном режиме тоже быстро, но я не представляю зачем SQL поднимать для баз из которых можно выкидывать пользователей )
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать