Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) Прошу выпрямить руки - отчёт (число прочтений - 7199 )
green
Junior Member
**
Отсутствует



Сообщений: 29
Местоположение: Астрахань
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Прошу выпрямить руки - отчёт
12. Июня 2006 :: 15:17
Печать  
Решил попробовать пописать на 1с++ - в частности очень уж захватило дух от увеличения скорости работы отчётов в 10-ки раз - решил взять реальную задачу и переложить на 1с++ - вот что получилось, но там есть ошибка в запросе - при джойне со справочником цен надо бы, чтобы бралось только одно первое попавшееся значение - как сделать? (Конечно, можно и порыться в скл, но если кто знает - будет быстрее и правильнее). Ну, а во-вторых, уверен на 100%, что хоть и работает, но далеко не оптимально - вот и хочу чтоб если у кого появтся мысли направили - как правильно переписать........
  

FastOst.rar ( 22 KB | Загрузки )
Наверх
 
IP записан
 
Славко
Senior Member
****
Отсутствует



Сообщений: 467
Местоположение: Украина, г. Днепропетровск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Прошу выпрямить руки - отчёт
Ответ #1 - 12. Июня 2006 :: 16:58
Печать  
видел видел, но такого я еще не видел, шобы давали удаленную работу, да еще и на шарка...  Подмигивание
ЗЫ умно...
  

Ламер, самый обычный ламер...    сначала мы ...   а потом мы ...
Наверх
wwwICQ  
IP записан
 
green
Junior Member
**
Отсутствует



Сообщений: 29
Местоположение: Астрахань
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Прошу выпрямить руки - отчёт
Ответ #2 - 13. Июня 2006 :: 05:14
Печать  
СЛАВКО - какая работа? - если откроешь, то увидишь, что там всё сделано и в принципе работает..... А интерисует критика того, что там написано.
  
Наверх
 
IP записан
 
green
Junior Member
**
Отсутствует



Сообщений: 29
Местоположение: Астрахань
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Прошу выпрямить руки - отчёт
Ответ #3 - 19. Июня 2006 :: 08:53
Печать  
блин, неужто никому не охота поумничать, покритиковать? Странно...... Обычно много желающих бывает...... Подмигивание
отчёт тот работает на любой стандартной комплексной/ТиС для РФ.
А выводит он следующую информацию - береёт остатки количественные по складу в соответсвии с фильтром и умножает на цену из справочика цен (тип выбирается в диалоге). Отчёт работает как с использованием стандартных средств, так и при помощи 1с++ - в диалоге выбирается - разници процентов на 30 в среднем.......
Так же там есть группировки по группам товара с суммами - тоже может кто что красивее подскажет....
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: Прошу выпрямить руки - отчёт
Ответ #4 - 19. Июня 2006 :: 09:12
Печать  
Обычно принять приводить текст проблемных мест, так сказать выжимку.
У многих доброхотство не простирается так далеко, чтобы скачивать файл и ковырятся в нем.
  
Наверх
 
IP записан
 
green
Junior Member
**
Отсутствует



Сообщений: 29
Местоположение: Астрахань
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Прошу выпрямить руки - отчёт
Ответ #5 - 19. Июня 2006 :: 09:13
Печать  
ок понял - щас исправлюсь :О)
  
Наверх
 
IP записан
 
green
Junior Member
**
Отсутствует



Сообщений: 29
Местоположение: Астрахань
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Прошу выпрямить руки - отчёт
Ответ #6 - 19. Июня 2006 :: 09:21
Печать  
[code]            ТекстЗапроса = "
                 |SELECT
                 |спрНомен.ParentID AS ВКодРод,
                 |Выборка.Номен AS [Номенклатура $Справочник.Номенклатура],
                 |Выборка.КоличествоКонОст as КоличествоКонОст,
                 |$ПоследнееЗначение.Цены.Цена(СпрЦ.ID, :ВыбДата) as Цена
                 |FROM
                       |(SELECT
                       |  Рег.Номенклатура as Номен,
                       |  Рег.КоличествоОстаток as КоличествоКонОст
                       
                       |FROM
                       |  $РегистрОстатки.ОстаткиТМЦ(:ВыбДата~,
                       |               ,
                       |                               ,
                       |        (Склад,Номенклатура)                       , (Количество)) as Рег
                       |";
                       

           //Обработка условий запроса
           перв=1;
           ТаблицаМФ.ВыбратьСтроки();
           Пока ТаблицаМФ.ПолучитьСтроку()=1 Цикл
                 Если (ТаблицаМФ.СписокЭлементов.РазмерСписка()>0) и
                 //(ТаблицаМФ.ИмяПеременной=ИмяПеремЗапроса) и
                 (ТаблицаМФ.ФлВкл=2) Тогда
                       Если перв=1 Тогда
                             ТекстЗапроса = ТекстЗапроса+"
                             |WHERE (";
                             перв=0;
                       Иначе
                             ТекстЗапроса = ТекстЗапроса+"
                             |AND (";
                       КонецЕсли;
                       
                       СписокСвойств = СоздатьОбъект("СписокЗначений");
                       ТаблицаМФ.СписокЭлементов.Выгрузить(СписокСвойств);
                       RS.УложитьСписокОбъектов(СписокСвойств, "#Группа"+СоКРЛП(ТаблицаМФ.Вид), СоКРЛП(ТаблицаМФ.Вид));
                       
                       ТекстЗапроса = ТекстЗапроса+
                             ТаблицаМФ.ИмяПеременной+" in (SELECT Val FROM #Группа"+СоКРЛП(ТаблицаМФ.Вид)+"))";
                       
                 КонецЕсли;
           КонецЦикла;
           ТекстЗапроса = ТекстЗапроса+ "
           |)as Выборка
                 |LEFT JOIN
                 |  $Справочник.Цены as СпрЦ ON (СпрЦ.ParentExt=Номен) AND
                 |  ($СпрЦ.ТипЦен = :ТипЦен) and (СпрЦ.IsMark=0)
                 |
                 |LEFT JOIN
                 |  $Справочник.Номенклатура as спрНомен ON (спрНомен.ID=Номен)
                 |";
           //(конец)Обработка условий запроса
[/code]

вот текст запроса по регистру остатков - ещё раз повторю, что всё работает, но думается, что можно сделать ПРАВИЛЬНЕЕ и ОПТИМАЛЬНЕЕ, единственная здесь проблема, только в том, что по хорошему надо бы чтобы джойн делался только по первому эменту из справочника цен для каждой номенклатуры(т.е. сейчас в случае ниличия двух элементов с одним и тем же типом цен в справочнике цен в запросе получим две строки).

Далее делается второй запрос по справочнику номенклатуры для того, чтобы впоследствии можно было собрать итоги по группам:
[code]ТекстЗапроса = "
                 |SELECT
                 |  Спр.ID as Вкод,
                 |  Спр.ParentID as ВкодРод,
                 |  Спр.ID as [Номенклатура $Справочник.Номенклатура]
                 |FROM
                 |  $Справочник.Номенклатура as Спр
                 |WHERE
                 |  Спр.IsFolder = 1
                 |";
[/code]
Ну и далее получаю суммы по группам:
[code]      тзГРупп = RS.ВыполнитьИнструкцию(ТекстЗапроса);
           тзГРуппИнд = СоздатьОбъект("ИндексированнаяТаблица");
           тзГРуппИнд.Загрузить(тзГРупп);
           тзГРуппИнд.ДобавитьИндекс("ВКодИнд","ВКод");
           //тзГРуппИнд.ДобавитьИндекс("ВКодИндРод","ВКодРод");
           //тзГРуппИнд.ВыбРатьСтроку();
           
           тзГрупп=СоздатьОбъект("ИндексированнаяТаблица");
           тзГрупп.НоваяКолонка("Номенклатура");
           тзГрупп.НоваяКолонка("КоличествоКонОст");
           тзГрупп.НоваяКолонка("ПолноеНаименование");
           тзГрупп.НоваяКолонка("ПолныйКод");
           //тзГрупп.НоваяКолонка("Цена");
           тзГрупп.НоваяКолонка("Сумма");
           
           тзЗапроса.НоваяКолонка("ПолноеНаименование");
           тзЗапроса.НоваяКолонка("ПолныйКод");
           тзЗапроса.НоваяКолонка("Сумма");
           Сообщить("Количество строк - "+тзЗапроса.КоличествоСтрок());
           СуммаВсего=0;
           КоличествоВсего=0;
           тзЗапроса.ВыбратьСтроки();
           Пока тзЗапроса.ПОлучитьСтроку()=1 Цикл
                 Состояние(""+тзЗапроса.НомерСтроки);
                 Если тзЗапроса.КоличествоКонОст<0.001 Тогда
                       Продолжить;
                 КонеЦЕсли;
                 тзЗапроса.ПолноеНаименование=тзЗапроса.Номенклатура.ПОлноеНаименование();
                 тзЗапроса.ПолныйКод=тзЗапроса.Номенклатура.ПолныйКод();
                 тзЗапроса.Сумма=тзЗапроса.КоличествоКонОст*тзЗапроса.Цена;
                 КоличествоВсего=КоличествоВсего+тзЗапроса.КоличествоКонОст;
                 СуммаВсего=СуммаВсего+тзЗапроса.Сумма;
                 Если СОКРЛП(тзЗапроса.ВКодРод)<>"0" Тогда
                       тзГРуппИнд.Найтистроку("ВКодИнд",тзЗапроса.ВКодРод,,1);
                       тзГрупп.НоваяСтрока();
                       тзГрупп.Номенклатура=тзГРуппИнд.Номенклатура;
                       тзГрупп.КоличествоКонОст=тзЗапроса.КоличествоКонОст;
                       тзГрупп.ПолноеНаименование=тзГРуппИнд.Номенклатура.ПолноеНаименование();
                       тзГрупп.ПолныйКод=тзГРуппИнд.Номенклатура.ПолныйКод();
                       тзГрупп.Сумма=тзЗапроса.Сумма;
                       Пока СОКРЛП(тзГРуппИнд.ВКодРод)<>"0" Цикл
                             тзГРуппИнд.Найтистроку("ВКодИнд",тзГРуппИнд.ВКодРод,,1);
                             тзГрупп.НоваяСтрока();
                             тзГрупп.Номенклатура=тзГРуппИнд.Номенклатура;
                             тзГрупп.КоличествоКонОст=тзЗапроса.КоличествоКонОст;
                             тзГрупп.ПолноеНаименование=тзГРуппИнд.Номенклатура.ПолноеНаименование();
                             тзГрупп.ПолныйКод=тзГРуппИнд.Номенклатура.ПолныйКод();
                             тзГрупп.Сумма=тзЗапроса.Сумма;
                       КонецЦикла;
                 КонецЕсли;
           Конеццикла;
           //тзГрупп.ВыбратьСтроку();
           умма");[/code]
Может есть более красивый/оптимальный способ?
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3050
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Прошу выпрямить руки - отчёт
Ответ #7 - 19. Июня 2006 :: 09:30
Печать  
фильтры по измерениям регистра лучше (гораздо) делать внутри ВТ Остатков
  

1&&2&&3
Наверх
 
IP записан
 
villy
Senior Member
****
Отсутствует



Сообщений: 287
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Прошу выпрямить руки - отчёт
Ответ #8 - 20. Июня 2006 :: 07:58
Печать  
у тебя присутствует: ТаблицаМФ.ИмяПеременной. какое там значение хранится?
зачем в ВТ РегистрОстатки ты указываешь измерение склад, исли им дальше не пользуешься? это не есть правильно, т.к. в ВТ происходит группировка по указанным измерениям.
  
Наверх
IP записан
 
green
Junior Member
**
Отсутствует



Сообщений: 29
Местоположение: Астрахань
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Прошу выпрямить руки - отчёт
Ответ #9 - 21. Июня 2006 :: 09:04
Печать  
transbublik
trad - спасибо за комментарии - надеюсь ближе к выходным доберусь сюда - тогда и отвечу подумав и проанализировав - в рабочие дни времени на самообучение нет :О(((((((((((
  
Наверх
 
IP записан
 
green
Junior Member
**
Отсутствует



Сообщений: 29
Местоположение: Астрахань
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Прошу выпрямить руки - отчёт
Ответ #10 - 25. Июня 2006 :: 18:19
Печать  
transbublik
Цитата:
у тебя присутствует: ТаблицаМФ.ИмяПеременной. какое там значение хранится?
Строка. Это стандартная таблица множественного отбора. К чему вопрос?

trad
Изменил немного запрос - "втащил" условие в ВТ, а заодно это позволило избавиться от лишнего измерения в остатках - "Склад":
Код
Выбрать все
ТекстЗапроса = "
			|SELECT
			|спрНомен.ParentID AS ВКодРод,
			|Выборка.Номен AS [Номенклатура $Справочник.Номенклатура],
			|Выборка.КоличествоКонОст as КоличествоКонОст,
			|$ПоследнееЗначение.Цены.Цена(СпрЦ.ID, :ВыбДата) as Цена
			|FROM
				|(SELECT
				|  Рег.Номенклатура as Номен,
				|  Рег.КоличествоОстаток as КоличествоКонОст

				|FROM
				|  $РегистрОстатки.ОстаткиТМЦ(:ВыбДата~,
				|		   , ";
				//Обработка условий запроса
				перв=1;
				ТаблицаМФ.ВыбратьСтроки();
				Пока ТаблицаМФ.ПолучитьСтроку()=1 Цикл
					Если (ТаблицаМФ.СписокЭлементов.РазмерСписка()>0) и
						(ТаблицаМФ.ФлВкл=2) Тогда
						Если перв=1 Тогда
							ТекстЗапроса = ТекстЗапроса+"(";
							перв=0;
						Иначе
							ТекстЗапроса = ТекстЗапроса+" AND (";
						КонецЕсли;

						СписокСвойств = СоздатьОбъект("СписокЗначений");
						ТаблицаМФ.СписокЭлементов.Выгрузить(СписокСвойств);
						RS.УложитьСписокОбъектов(СписокСвойств, "#Группа"+СоКРЛП(ТаблицаМФ.Вид), СоКРЛП(ТаблицаМФ.Вид));

						ТекстЗапроса = ТекстЗапроса+
							ТаблицаМФ.ИмяПеременной+" in (SELECT Val FROM #Группа"+СоКРЛП(ТаблицаМФ.Вид)+"))";
					  
					КонецЕсли;
				КонецЦикла;

		ТекстЗапроса = ТекстЗапроса+",
				|	  (Номенклатура)			     , (Количество)) as Рег";


		ТекстЗапроса = ТекстЗапроса+ "
		|)as Выборка
			|LEFT JOIN
			|  $Справочник.Цены as СпрЦ ON (СпрЦ.ParentExt=Номен) AND
			|  ($СпрЦ.ТипЦен = :ТипЦен) and (СпрЦ.IsMark=0)
			|
			|LEFT JOIN
			|  $Справочник.Номенклатура as спрНомен ON (спрНомен.ID=Номен)
			|";
 



Что ещё можно улучшить? Кстати - насчет группировки по группам - есть идеи?


А насчёт цен никто ничего не подскажет (пока книжка не помогла - топ 1 использовать не могу - так ка он для селекта, различные юнионы вроде тоже не подходят)?
  
Наверх
 
IP записан
 
villy
Senior Member
****
Отсутствует



Сообщений: 287
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Прошу выпрямить руки - отчёт
Ответ #11 - 26. Июня 2006 :: 09:36
Печать  
green писал(а) 25. Июня 2006 :: 18:19:
Кстати - насчет группировки по группам - есть идеи?


я строю таблицу вида (относительно полученых элементов по регистру):
id элемента, id гр1(группа 1-го уровня), id гр2, ... ,id грN

а затем к этой таблице джойню таблицу с остатками и группирую ее по группам, в итоге получаю остатки по группам и элементам

green писал(а) 25. Июня 2006 :: 18:19:
А насчёт цен никто ничего не подскажет (пока книжка не помогла - топ 1 использовать не могу - так ка он для селекта, различные юнионы вроде тоже не подходят)?

Ты можешь и не использовать $ПоследнееЗначение, но тогда напиши свою выборку из табл _1sconst относительно твоего реквизита.
  
Наверх
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать