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


I Love YaBB 2!

Сообщений: 38
Зарегистрирован: 13. Сентября 2007
Re: СводныйОстаток()
Ответ #15 - 25. Апреля 2008 :: 10:46
Печать  
Ага, меня напугаешь....
Таки получилось. Но для ускорения всю музыку выполняю в одном запросе. В результате: время выполнения обработки  с определением остатков и запретов по сериям увеличилось только секунд на 15 по сравнению с временем без опредеделения остатков по сериям. ПРОСТО КЛАСС!!! Кстати, и в раза 4 быстрее чем Регистр.Остатки.СводныйОстаток(). Итак: после простого применения обработки заточенной под ДБФ в скуле врнмя - в районе получаса; оптимизация только по выборке товарных остатков - время 8-9 минут (плюс-минус 2 минуты от загрузки сервера), оптимизация выборки остатков по сериям -  время формирования отчета 2 минуты 15 секунд (при этом в отчете формируется печатная форма в две колонки на лист и два ДБФ файла разной структуры под капризы разных покупателей).  Ну разве не чудо?!
И вообще - 1С++ потрясающая вещь! Огромное спасибо авторам - сделали отличную штукойовину.
И это я только начал въезжать эту тему! И уже весь в восторге...
  
Наверх
 
IP записан
 
VasilyKushnir
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 38
Зарегистрирован: 13. Сентября 2007
Re: СводныйОстаток()
Ответ #16 - 25. Апреля 2008 :: 12:09
Печать  
Правда, запрос получился еще тот... (пришлось изрядно поковырятся).  Я сам оббалдел, когда распечатал конечный вариант.
Если кому будет интересно приведу текст. Хотя.... Я только начинающий. Так что врят ли эта "музыка" потянет на новизну идеи.
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: СводныйОстаток()
Ответ #17 - 25. Апреля 2008 :: 12:13
Печать  
ты положи, тебе может ещё чего посоветуют.  Подмигивание
  
Наверх
 
IP записан
 
Jkey
Full Member
***
Отсутствует


Вникаю ... 1С++ : )

Сообщений: 106
Местоположение: Орск
Зарегистрирован: 26. Июня 2006
Пол: Мужской
Re: СводныйОстаток()
Ответ #18 - 25. Апреля 2008 :: 12:13
Печать  
VasilyKushnir писал(а) 25. Апреля 2008 :: 12:09:
Правда, запрос получился еще тот... (пришлось изрядно поковырятся).  Я сам оббалдел, когда распечатал конечный вариант.
Если кому будет интересно приведу текст. Хотя.... Я только начинающий. Так что врят ли эта "музыка" потянет на новизну идеи.

Текст в студию Улыбка
  
Наверх
ICQ  
IP записан
 
VasilyKushnir
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 38
Зарегистрирован: 13. Сентября 2007
Re: СводныйОстаток()
Ответ #19 - 25. Апреля 2008 :: 12:25
Печать  
Код
Выбрать все
	ТекстЗапроса = "-- qryMaker:ШаблонПрайс.2008.04.17.13.28.04
		|SELECT $ОстаткиИтоги.Товар [Товар $Справочник.Товары]
		|	, MAX($ОстаткиИтоги.ЦенаЗавода) ЦенаЗавода
		|	, Sum($ОстаткиИтоги.Кво) Кво
		|
    |		, MAX(case  when $Товары.РегДатаОкончания = '01.01.1753' then 0
		|				when $Товары.ПродаватьБезРегистрации = 1 then 0
		|				when $Товары.РегДатаОкончания<:выбДатаПериодики then 1
		|			else 0
		|			end) ВидЗапретаТовара
		|		, SUM(case
		|				when $Серии.ЗапретТоргОтдела=1 then $ОстаткиИтоги.Кво
		|				when ($Товары.ТребуетсяСертификат - $Серии.ЕстьСертификат) = 1 then $ОстаткиИтоги.Кво
		|				when $Серии.ЗапретПродажи = 1 then $ОстаткиИтоги.Кво
		|				when $Серии.ЗапретКонтролераКачества=1 then $ОстаткиИтоги.Кво
		|				when ($Серии.СрокГодности<:выбДатаПериодики)and($Серии.СрокГодности<>'01.01.1753') then $ОстаткиИтоги.Кво
		|				else 0
		|				end) ОстатокНаЗапрете
		|		, MAX((case
		|				when $Серии.ЗапретТоргОтдела=1 then 5
		|				when ($Товары.ТребуетсяСертификат - $Серии.ЕстьСертификат) = 1 then 2
		|				when $Серии.ЗапретПродажи = 1 then 3
		|				when $Серии.ЗапретКонтролераКачества=1 then 4
		|				when ($Серии.СрокГодности<:выбДатаПериодики)and($Серии.СрокГодности<>'01.01.1753') then 6
		|				else 0
		|			end)) ВидЗапретаСерий
		|		, COUNT(Серии.ID) as КвоСерий
		|		, SUM((case
		|				when $Серии.ЗапретТоргОтдела=1 then 1
		|				when ($Товары.ТребуетсяСертификат - $Серии.ЕстьСертификат) = 1 then 1
		|				when $Серии.ЗапретПродажи = 1 then 1
		|				when $Серии.ЗапретКонтролераКачества=1 then 1
		|				when ($Серии.СрокГодности<:выбДатаПериодики)and($Серии.СрокГодности<>'01.01.1753') then 1
		|				else 0
		|			end)) КвоСерийЗапретов
		|
		|	, Max($Товары.НеВключатьВПрайс) МаксимумНеВключатьВПрайс
		|	, Max(Категория.ID) [КатегорияУчета $Справочник.КатегорииУчета]
		|	, Max($Категория.Форма2) Форма2
		|	, Max($Категория.СписокА) СписокА
		|	, $ПоследнееЗначение.ВидыНалогов.Ставка(MAX(Налоги.ID), :выбДатаПериодики) СтавкаНдс
		|	, $ПоследнееЗначение.Товары.БазоваяЦена($ОстаткиИтоги.Товар, :выбДатаПериодики) БазоваяЦена
		|FROM $РегистрИтоги.Остатки AS ОстаткиИтоги With (NOLOCK)
		|	LEFT OUTER JOIN $Справочник.Товары AS Товары With (NOLOCK) ON Товары.ID = $ОстаткиИтоги.Товар
    |	LEFT OUTER JOIN $Справочник.Серии as Серии on Серии.ID = $ОстаткиИтоги.Серия
		|	LEFT OUTER JOIN $Справочник.ВидыНалогов AS Налоги With (NOLOCK) ON Налоги.ID = $ПоследнееЗначение.Товары.СтавкаНДС(Товары.ID, :выбДатаПериодики)
		|	LEFT OUTER JOIN $Справочник.КатегорииУчета AS Категория With (NOLOCK) ON Категория.ID = $Товары.КатегорияУчета
		|WHERE (ОстаткиИтоги.PERIOD = :выбПериод)";

 

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


I Love YaBB 2!

Сообщений: 38
Зарегистрирован: 13. Сентября 2007
Re: СводныйОстаток()
Ответ #20 - 25. Апреля 2008 :: 12:26
Печать  
Код
Выбрать все
	Если НеВПрайс = 0 Тогда
		ТекстЗапроса = ТекстЗапроса+"
	|				and $Товары.НеВключатьВПрайс = 0";
	Иначе
		ТекстЗапроса = ТекстЗапроса+"
	|				and $Товары.НеВключатьВПрайс = 1";
	КонецЕсли;

	ТекстЗапроса = ТекстЗапроса+"
	|				and isNull($Категория.Форма2,0) = 0
	|				and isNull($Категория.СписокА,0) = 0";

	Если ПрайсВид = 2 Тогда
		ТекстЗапроса = ТекстЗапроса+"
		|				and LTRIM(RTRIM(isNull(Категория.CODE,'0'))) = '3'";
	Иначе
		ТекстЗапроса = ТекстЗапроса+"
		|				and LTRIM(RTRIM(isNull(Категория.CODE,'0'))) <> '3'";
	КонецЕсли;

	Если выбСклад.Выбран() = 1 Тогда
		ТекстЗапроса = ТекстЗапроса+"
		|				and $ОстаткиИтоги.Склад = :выбСклад";
		рс.УстановитьТекстовыйПараметр("выбСклад", ВыбСклад);
	Иначе
		ТекстЗапроса = ТекстЗапроса+"
		|				and $ОстаткиИтоги.Склад = $Товары.Отдел";
	КонецЕсли;

	Если ВыбПоставщик.Выбран() = 1 Тогда
		ТекстЗапроса = ТекстЗапроса+"
		|				and $ОстаткиИтоги.Поставщик = :выбПоставщик";
		рс.УстановитьТекстовыйПараметр("выбПоставщик", выбПоставщик);
	КонецЕсли;

	Если выбНДС = 1 Тогда
		ТекстЗапроса = ТекстЗапроса + "
		| and isNull($ПоследнееЗначение.ВидыНалогов.Ставка(Налоги.ID, :выбДатаПериодики),0) > 0";
	ИначеЕсли выбНДС = 2 Тогда
		ТекстЗапроса = ТекстЗапроса + "
		| and isNull($ПоследнееЗначение.ВидыНалогов.Ставка(Налоги.ID, :выбДатаПериодики),0) = 0";
	КонецЕсли;

	Если ВыбТовар.Выбран() = 1 Тогда
		Если выбТовар.ЭтоГруппа() = 1 Тогда
			рс.УложитьСписокОбъектов(ВыбТовар,"#GrpTov","Товары");
			ТекстЗапроса = ТекстЗапроса + "
				| and $ОстаткиИтоги.Товар IN (SELECT VAL FROM #GrpTov)";
		Иначе
			// элемент
			ТекстЗапроса = ТекстЗапроса + "
			| and $ОстаткиИтоги.Товар = :выбТовар";
		КонецЕсли;
	КонецЕсли;

	ТекстЗапроса = ТекстЗапроса+"
	|GROUP BY $ОстаткиИтоги.Товар";

	ТекстЗапроса = ТекстЗапроса+"
	|HAVING Sum($ОстаткиИтоги.Кво)>"+?(ПоОстатку=1,СокрЛП(Минимум),"0")+"
	|";

	рс.УстановитьТекстовыйПараметр("выбПериод", НачМесяца(ПолучитьДатуТА()));
	рс.УстановитьТекстовыйПараметр("выбДатаПериодики", ТекущаяДата());
	тз = рс.ВыполнитьИнструкцию(ТекстЗапроса);
	тз.Сортировать("Товар");
	//тз.ВыбратьСтроку();
	Возврат тз;
 

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


0x1c = 28

Сообщений: 166
Местоположение: Chelyabinsk
Зарегистрирован: 01. Ноября 2007
Пол: Мужской
Re: СводныйОстаток()
Ответ #21 - 28. Апреля 2008 :: 07:11
Печать  
Лучше куда-нибудь http://www.irc1c.ru/pastebin/ все выложить, imho.... тут нечитабельно даже 8-O
  
Наверх
ICQ  
IP записан
 
villy
Senior Member
****
Отсутствует



Сообщений: 287
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: СводныйОстаток()
Ответ #22 - 29. Апреля 2008 :: 19:35
Печать  
unnamed писал(а) 28. Апреля 2008 :: 07:11:
Лучше куда-нибудь http://www.irc1c.ru/pastebin/ все выложить, imho.... тут нечитабельно даже 8-O

наверное твое "imho...." очень сугубо очень субъективно.
  
Наверх
IP записан
 
VasilyKushnir
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 38
Зарегистрирован: 13. Сентября 2007
Re: СводныйОстаток()
Ответ #23 - 30. Апреля 2008 :: 13:24
Печать  
Странно... Никто по самому запросу не поругал... А ведь есть за что!

Код
Выбрать все
	Если ПрайсВид = 2 Тогда
		ТекстЗапроса = ТекстЗапроса+"
		|				and LTRIM(RTRIM(isNull(Категория.CODE,'0'))) = '3'";
	Иначе
		ТекстЗапроса = ТекстЗапроса+"
		|				and LTRIM(RTRIM(isNull(Категория.CODE,'0'))) <> '3'";
	КонецЕсли;

 



Категория.CODE = анализирую по категории товара (ссылка на справочник КатегорииУчета), а именно - код категории. А это уже не есть зашибись. Вопросс:
Код категории может изменится со всеми вытекающими. А задача состоит в том, чтобы Включить/НеВключить в выборку товары скажем категории "Реактивы" то бишь по Наименование.
  
Наверх
 
IP записан
 
Вадимко
God Member
*****
Отсутствует


Нам бы чего про ОдноЦэ...

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: СводныйОстаток()
Ответ #24 - 02. Мая 2008 :: 23:36
Печать  
За наименование тож поругать могут... даже еще сильнее  Смех
Зачем столько when если возвращается одно значение по сути?

Судя по всему медикаментами приторговываешь?
Могу продать всякие реализованные идеи...
  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
Переключение на Главную Страницу Страницы: 1 [2] 
ОтправитьПечать