Имя: Пароль:
1C
1C 7.7
v7: Выборка остатков из регистра. sql
,
0 Последняя_
Надежда
 
19.07.12
10:37
ТиС 7.7 Внешняя обработка на выборку остатков из регистра.
В представленном виде работает. НО надо добавить в итоговую таблицу еще и колонку с артикулом, чтобы потом отсортировать по ней. Пока попытки это сделать не увенчались успехом.

   ТабОстатков = СоздатьОбъект("ТаблицаЗначений");  
   ТабОстатков.НоваяКолонка("Код");
   ТабОстатков.НоваяКолонка("ВсегоОст");
   ТабОстатков.НоваяКолонка("Наименование");
   тзОст = "
   |SELECT    
   | Код = :Преф + Спр.Code ,
   | Рег.КоличествоОстаток as ВсегоОст,      
   | Спр.Descr as Наименование
   |FROM
   | $РегистрОстатки.ОстаткиТМЦ(:ГрРасч~, ,
   |    ,
   |    (Номенклатура),(Количество) ) as Рег
   |JOIN $Справочник.Номенклатура as Спр on Рег.Номенклатура = Спр.ID  
   |JOIN #vr as vr ON vr.code=Спр.code";  
   РС.Выполнить("DROP TABLE #vr");
   РС.Выполнить("CREATE TABLE #vr (code char(10))");                      
   спНомН =  ПолучитьНоменклатуруПоН(ВидБазы);  
   Для н=1 по спНомН.РазмерСписка() Цикл          
       тКод = СокрЛП(спНомН.ПолучитьЗначение(н)) ;  
       тКод = Прав(тКод,СтрДлина(тКод)-1) ;
       РС.Выполнить("INSERT INTO #vr (code) VALUES ('"+тКод+"')") ;
   КонецЦикла;
   ТТ = СоздатьОбъект("ТаблицаЗначений");
   РС.УстановитьТекстовыйПараметр("ГрРасч",ТекущаяДата());
   РС.УстановитьТекстовыйПараметр("Преф",?(ВидБазы="Р","р","о"));  
   Сообщить(тзОст);
   РС.ВыполнитьИнструкцию(тзОст,ТТ,1);
   РС.Выполнить("DROP TABLE #vr");
   Возврат ТабОстатков;
1 Ёпрст
 
19.07.12
10:41
(0) весьма забавное условие на код

А так,

| ,$Спр.Артикул as Артикул
2 Последняя_
Надежда
 
19.07.12
10:44
(1) в select ?
3 Ёпрст
 
19.07.12
10:45
да
4 Ёпрст
 
19.07.12
10:46
И это, почему фильтрацию по коду делаешь? Еще и через инсерт во временную табличку ?
К чужой базе запрос что ли ?
5 Последняя_
Надежда
 
19.07.12
10:48
(4) да. запрос и к своей и к чужой базе.
это я еще переделываю. надо отловить двойные позиции, т.е. с одинаковыми Артикулами.
Вроде выполняется, но колонка Артикула пустая.
6 Mikeware
 
19.07.12
10:49
А почему Чар(10)?
Почему бы не УложитьСписокОбъектов() ?
Почему бы не использовать автогенерируемые имена временных таблиц?
7 Ёпрст
 
19.07.12
10:50
(6) >>>Почему бы не УложитьСписокОбъектов() ?

для строк не выйдет - будет строку к char(9) приводить...
8 Последняя_
Надежда
 
19.07.12
10:51
(6) это для меня сложно... да и это не мой код, я просто дорабатываю.
9 Ёпрст
 
19.07.12
10:51
(5) дык а сам артикул у данной номенклатуры заполнен хоть в базе ?
10 Последняя_
Надежда
 
19.07.12
10:55
(9) упс. на старой копии делаю.
а как сделать чтобы сортировал по Артикулу?
11 Ёпрст
 
19.07.12
10:56
(10) в конец  текста запроса воткни
order by $Спр.Артикул
12 Mikeware
 
19.07.12
10:56
(10) order by $спр.Артикул
13 Последняя_
Надежда
 
19.07.12
10:58
а потом простым перебором в цикле перебрать на поиск одинаковых. А нет никакого метода, который бы искал одинаковые значения в таблице значений?
14 Ёпрст
 
19.07.12
11:08
(13) дык в запросе и ищи сразу одинаковые.

Хотя и в ТЗ можно, заполнить единичками служебную колонку и свернуть по ней, потом отсортировать по убыванию.
Там где >1 - дубель
15 Ёпрст
 
19.07.12
11:08
но проще в запросе
:)
16 Последняя_
Надежда
 
19.07.12
11:10
(15) Мне не просто найти надо. мне еще количество просуммировать надо у двойных.
а каким образом в ТЗ или запросе искать? с помощью какие методов?
17 Ёпрст
 
19.07.12
11:12
(16) дык суммируй..

group by в тексте запроса + having count(*)>1
18 Mikeware
 
19.07.12
11:13
(16) добавь колонку, заполни единичками, и сверни по ратикулу - в добавленной получишь количество дублей
19 Mikeware
 
19.07.12
11:13
(17) Сейчас ей еще про группировочные поля объяснять придется...
она ж Бол читать не будет....
20 Последняя_
Надежда
 
19.07.12
11:20
(17)поняла что для чего. а куда именно (после чего) поставить эти конструкции?
(19) Уже нашла, читаю.
21 Ёпрст
 
19.07.12
11:22
(20) гроуп бай перед ордер, только учти, если сворачивать будешь по артикулу - то само наименование номенклатуры ужо не увидишь.. если нужна еще и номенклатура - нужно будет подзапрос писать, в котором найти дубли и уже по этой табличке фильтровать основной запрос
22 Последняя_
Надежда
 
19.07.12
11:25
(21) не совсем поняла. если свернуть по артикулу, то другие столбцы пропадут?
23 Ёпрст
 
19.07.12
11:26
(22) яя-натюрлих, останется только сумма (количество)
24 Последняя_
Надежда
 
19.07.12
11:32
(23) так не пойдет. мне надо еще и Код сохранить.
25 Ёпрст
 
19.07.12
11:36
(24) тогда .... общую сумму кому лепить ?
26 Ёпрст
 
19.07.12
11:36
к примеру у тебя 3 номенклатуры с одинаковым артикулом будет
27 Ёпрст
 
19.07.12
11:37
но с разными наименованиями
28 Последняя_
Надежда
 
19.07.12
11:39
(26) можно эту сумму во все прописать или последнему в списке
29 Ёпрст
 
19.07.12
11:47
тзОст = "
   |SELECT    
   | Преф + Спр.Code as Код ,
   | Рег.КоличествоОстаток as ВсегоОст,      
   | Спр.Descr as Наименование ,
   | $Спр.Артикул as Артикул
   |
   |FROM
   | $РегистрОстатки.ОстаткиТМЦ(:ГрРасч~, ,
   |    ,
   |    (Номенклатура),(Количество) ) as Рег
   |inner  JOIN $Справочник.Номенклатура as Спр on Рег.Номенклатура = Спр.ID  
   |inner JOIN #vr as vr ON vr.code=Спр.code
   |where $Спр.Артикул in
   |    (select $С.Артикул from $Справочник.Номенклатура as С group by $С.Артикул having Count($С.Артикул)>1)
   |
   |
   |";
30 Ёпрст
 
19.07.12
11:47
где Преф, там : добавь спереди
31 also
 
19.07.12
12:00
Ёпрст4 , ответь в почте, плз.
32 Последняя_
Надежда
 
19.07.12
13:04
(29) Как-то оно очень сильно сворачивает. Табличка раза в 4 меньше стала, хотя по факту двойных-тройных очень мало. Может дело в том что артикулы все разных форматов? Например, 1 , 209-01, 306-2, 456-ПП, 432С3 и т.п.
33 Ёпрст
 
19.07.12
13:06
(32) дык проверить то просто
34 Последняя_
Надежда
 
19.07.12
13:21
(33) что-то не могу сообразить на каком этапе проверить.
35 sapphire
 
19.07.12
13:25
(34) select $С.Артикул, Count($С.Артикул) ВсегоЗаписей from $Справочник.Номенклатура as С group by $С.Артикул having Count($С.Артикул)>1

Как думаешь, зачем и что покажет?
36 sapphire
 
19.07.12
13:26
select $С.Артикул, Count(*) ВсегоЗаписей from $Справочник.Номенклатура as С group by $С.Артикул having Count(*)>1
37 Ёпрст
 
19.07.12
13:29
(35) у ё..
:)
38 sapphire
 
19.07.12
13:39
ТабОстатков = СоздатьОбъект("ТаблицаЗначений");  
   ТабОстатков.НоваяКолонка("Код");
   ТабОстатков.НоваяКолонка("ВсегоОст");
   ТабОстатков.НоваяКолонка("Наименование");
   тзОст = "
   |SELECT    
   | Код = :Преф + Спр.Code ,
   | Рег.КоличествоОстаток as ВсегоОст,      
   | Спр.Descr as Наименование,
   | Спр.$Артикул Артикул
   |FROM
   | $РегистрОстатки.ОстаткиТМЦ(:ГрРасч~, ,
   |    ,
   |    (Номенклатура),(Количество) ) as Рег
   |JOIN $Справочник.Номенклатура as Спр on Рег.Номенклатура = Спр.ID  
   |JOIN #vr as vr ON vr.code=Спр.code
   |ORDER BY Спр.$Артикул
   |";  

   РС.Выполнить("DROP TABLE #vr");

   РС.Выполнить("CREATE TABLE #vr (code char(10))");                      

   спНомН =  ПолучитьНоменклатуруПоН(ВидБазы);  
   Для н=1 по спНомН.РазмерСписка() Цикл          
       тКод = СокрЛП(спНомН.ПолучитьЗначение(н)) ;  
       тКод = Прав(тКод,СтрДлина(тКод)-1) ;
       РС.Выполнить("INSERT INTO #vr (code) VALUES ('"+тКод+"')") ;

   КонецЦикла;
   ТТ = СоздатьОбъект("ТаблицаЗначений");
   РС.УстановитьТекстовыйПараметр("ГрРасч",ТекущаяДата());
   РС.УстановитьТекстовыйПараметр("Преф",?(ВидБазы="Р","р","о"));  
   Сообщить(тзОст);
   РС.ВыполнитьИнструкцию(тзОст,ТТ,1);
   РС.Выполнить("DROP TABLE #vr");

   Возврат ТабОстатков;
39 Конфигуратор1с
 
19.07.12
13:43
надо и себе поставить такую прекрасную фотку в личку, что бы  и мне помогали так активно )))
40 sapphire
 
19.07.12
13:46
(39) Не помогают?
41 Конфигуратор1с
 
19.07.12
13:47
(40)неа
42 sapphire
 
19.07.12
13:48
(41) Может просто ответ настолько очевиден, что лень писать?
43 Конфигуратор1с
 
19.07.12
13:50
44 Последняя_
Надежда
 
19.07.12
14:02
(35)-(38) Ничего не поняла.
45 sapphire
 
19.07.12
14:04
// А так Понятно?
   ТабОстатков = СоздатьОбъект("ТаблицаЗначений");  
   ТабОстатков.НоваяКолонка("Код");
   ТабОстатков.НоваяКолонка("ВсегоОст");
   ТабОстатков.НоваяКолонка("Наименование");
   ТабОстатков.НоваяКолонка("Артикул");
   тзОст = "
   |SELECT    
   | Код = :Преф + Спр.Code ,
   | Рег.КоличествоОстаток as ВсегоОст,      
   | Спр.Descr as Наименование,
   | Спр.$Артикул Артикул
   |FROM
   | $РегистрОстатки.ОстаткиТМЦ(:ГрРасч~, ,
   |    ,
   |    (Номенклатура),(Количество) ) as Рег
   |JOIN $Справочник.Номенклатура as Спр on Рег.Номенклатура = Спр.ID  
   |JOIN #vr as vr ON vr.code=Спр.code
   |ORDER BY Спр.$Артикул
   |";  

   РС.Выполнить("DROP TABLE #vr");


   РС.Выполнить("CREATE TABLE #vr (code char(10))");                      


   спНомН =  ПолучитьНоменклатуруПоН(ВидБазы);  
   Для н=1 по спНомН.РазмерСписка() Цикл          
       тКод = СокрЛП(спНомН.ПолучитьЗначение(н)) ;  
       тКод = Прав(тКод,СтрДлина(тКод)-1) ;
       РС.Выполнить("INSERT INTO #vr (code) VALUES ('"+тКод+"')") ;


   КонецЦикла;
   ТТ = СоздатьОбъект("ТаблицаЗначений");
   РС.УстановитьТекстовыйПараметр("ГрРасч",ТекущаяДата());
   РС.УстановитьТекстовыйПараметр("Преф",?(ВидБазы="Р","р","о"));  
   Сообщить(тзОст);
   РС.ВыполнитьИнструкцию(тзОст,ТТ,1);
   РС.Выполнить("DROP TABLE #vr");


   Возврат ТабОстатков;
46 sapphire
 
19.07.12
14:04
(44) Что именно непонятно?
47 Ёпрст
 
19.07.12
14:05
(46) да всё.. к чему этот не рабочий код ?
48 sapphire
 
19.07.12
14:06
(47)?
49 sapphire
 
19.07.12
14:06
(47) Неть семерки под рукой, но с запросом вроде должно канать
50 Последняя_
Надежда
 
19.07.12
14:07
(45) максимум что этот код сделает. так это выведет номенклатуру с остатком отсортированную по артикулу. это уже сделано. Вопрос стоит в сложении остатков по позициям с одинаковыми артикулами.
51 sapphire
 
19.07.12
14:08
(50) И? Что сложного-то?!
52 sapphire
 
19.07.12
14:09
ТабОстатков = СоздатьОбъект("ТаблицаЗначений");  
   ТабОстатков.НоваяКолонка("Код");
   ТабОстатков.НоваяКолонка("ВсегоОст");
   ТабОстатков.НоваяКолонка("Наименование");
   ТабОстатков.НоваяКолонка("Артикул");
   тзОст = "
   |SELECT    
   | Код = :Преф + MAX(Спр.Code) ,
   | SUM(Рег.КоличествоОстаток) as ВсегоОст,      
   | MAX(Спр.Descr) as Наименование,
   | Спр.$Артикул Артикул
   |FROM
   | $РегистрОстатки.ОстаткиТМЦ(:ГрРасч~, ,
   |    ,
   |    (Номенклатура),(Количество) ) as Рег
   |JOIN $Справочник.Номенклатура as Спр on Рег.Номенклатура = Спр.ID  
   |JOIN #vr as vr ON vr.code=Спр.code
   |GROUP BY Спр.$Артикул
   |ORDER BY Спр.$Артикул
   |";  

   РС.Выполнить("DROP TABLE #vr");



   РС.Выполнить("CREATE TABLE #vr (code char(10))");                      



   спНомН =  ПолучитьНоменклатуруПоН(ВидБазы);  
   Для н=1 по спНомН.РазмерСписка() Цикл          
       тКод = СокрЛП(спНомН.ПолучитьЗначение(н)) ;  
       тКод = Прав(тКод,СтрДлина(тКод)-1) ;
       РС.Выполнить("INSERT INTO #vr (code) VALUES ('"+тКод+"')") ;



   КонецЦикла;
   ТТ = СоздатьОбъект("ТаблицаЗначений");
   РС.УстановитьТекстовыйПараметр("ГрРасч",ТекущаяДата());
   РС.УстановитьТекстовыйПараметр("Преф",?(ВидБазы="Р","р","о"));  
   Сообщить(тзОст);
   РС.ВыполнитьИнструкцию(тзОст,ТТ,1);
   РС.Выполнить("DROP TABLE #vr");



   Возврат ТабОстатков;
53 sapphire
 
19.07.12
14:11
ну для вящей красоты можно и по-другому из(ъе../врати)ться
54 Ёпрст
 
19.07.12
14:12
(52) дык это же не верно. Одинаковый артикул может быть у разных наименований.
55 sapphire
 
19.07.12
14:13
(54) Конечно :)
А коли подумать :)))
56 sapphire
 
19.07.12
14:14
(54) А код и наименование тогда вообще зачем?
57 sapphire
 
19.07.12
14:16
(54) Если нужны остатки артикулов тогда:
ТабОстатков = СоздатьОбъект("ТаблицаЗначений");  
   ТабОстатков.НоваяКолонка("Код");
//    ТабОстатков.НоваяКолонка("ВсегоОст");
//    ТабОстатков.НоваяКолонка("Наименование");
   ТабОстатков.НоваяКолонка("Артикул");
   тзОст = "
   |SELECT    
//   | Код = :Преф + MAX(Спр.Code) ,
   | SUM(Рег.КоличествоОстаток) as ВсегоОст,      
//   | MAX(Спр.Descr) as Наименование,
   | Спр.$Артикул Артикул
   |FROM
   | $РегистрОстатки.ОстаткиТМЦ(:ГрРасч~, ,
   |    ,
   |    (Номенклатура),(Количество) ) as Рег
   |JOIN $Справочник.Номенклатура as Спр on Рег.Номенклатура = Спр.ID  
   |JOIN #vr as vr ON vr.code=Спр.code
   |GROUP BY Спр.$Артикул
   |ORDER BY Спр.$Артикул
   |";  

   РС.Выполнить("DROP TABLE #vr");




   РС.Выполнить("CREATE TABLE #vr (code char(10))");                      




   спНомН =  ПолучитьНоменклатуруПоН(ВидБазы);  
   Для н=1 по спНомН.РазмерСписка() Цикл          
       тКод = СокрЛП(спНомН.ПолучитьЗначение(н)) ;  
       тКод = Прав(тКод,СтрДлина(тКод)-1) ;
       РС.Выполнить("INSERT INTO #vr (code) VALUES ('"+тКод+"')") ;




   КонецЦикла;
   ТТ = СоздатьОбъект("ТаблицаЗначений");
   РС.УстановитьТекстовыйПараметр("ГрРасч",ТекущаяДата());
//   РС.УстановитьТекстовыйПараметр("Преф",?(ВидБазы="Р","р","о"));  
   Сообщить(тзОст);
   РС.ВыполнитьИнструкцию(тзОст,ТТ,1);
   РС.Выполнить("DROP TABLE #vr");




   Возврат ТабОстатков;
58 sapphire
 
19.07.12
14:16
ТабОстатков = СоздатьОбъект("ТаблицаЗначений");  
//    ТабОстатков.НоваяКолонка("Код");
   ТабОстатков.НоваяКолонка("ВсегоОст");

//    ТабОстатков.НоваяКолонка("Наименование");

   ТабОстатков.НоваяКолонка("Артикул");
   тзОст = "
   |SELECT    
//   | Код = :Преф + MAX(Спр.Code) ,

   | SUM(Рег.КоличествоОстаток) as ВсегоОст,      
//   | MAX(Спр.Descr) as Наименование,

   | Спр.$Артикул Артикул
   |FROM
   | $РегистрОстатки.ОстаткиТМЦ(:ГрРасч~, ,
   |    ,
   |    (Номенклатура),(Количество) ) as Рег
   |JOIN $Справочник.Номенклатура as Спр on Рег.Номенклатура = Спр.ID  
   |JOIN #vr as vr ON vr.code=Спр.code
   |GROUP BY Спр.$Артикул
   |ORDER BY Спр.$Артикул
   |";  

   РС.Выполнить("DROP TABLE #vr");





   РС.Выполнить("CREATE TABLE #vr (code char(10))");                      





   спНомН =  ПолучитьНоменклатуруПоН(ВидБазы);  
   Для н=1 по спНомН.РазмерСписка() Цикл          
       тКод = СокрЛП(спНомН.ПолучитьЗначение(н)) ;  
       тКод = Прав(тКод,СтрДлина(тКод)-1) ;
       РС.Выполнить("INSERT INTO #vr (code) VALUES ('"+тКод+"')") ;





   КонецЦикла;
   ТТ = СоздатьОбъект("ТаблицаЗначений");
   РС.УстановитьТекстовыйПараметр("ГрРасч",ТекущаяДата());
//   РС.УстановитьТекстовыйПараметр("Преф",?(ВидБазы="Р","р","о"));  

   Сообщить(тзОст);
   РС.ВыполнитьИнструкцию(тзОст,ТТ,1);
   РС.Выполнить("DROP TABLE #vr");





   Возврат ТабОстатков;
59 Последняя_
Надежда
 
19.07.12
14:32
(58) не то. Коды и наименования тоже нужны! Артикулы нужны лишь для группировки двойных позиций...
запутали меня еще больше. лучше простым циклом переберу.
60 Ёпрст
 
19.07.12
14:39
(32) как в (29) чем не устроило ?
Покажет только те записи, где с одинаковым артикулом >1
61 Последняя_
Надежда
 
19.07.12
14:47
(60) эм... а остальные?
62 Последняя_
Надежда
 
19.07.12
14:48
в общем надо еще доскональнее тестировать.
63 Ёпрст
 
19.07.12
14:50
(61) тебе же только дубли нужны, не ?
64 Последняя_
Надежда
 
19.07.12
14:51
мне дубли надо просуммировать и все остальные оставить.
65 viktor_vv
 
19.07.12
14:52
(61) Ну так к своей таблице с несвернутыми остатками приджойни подзапрос с задвоенными артикулами по полю артикул.
66 Ёпрст
 
19.07.12
14:52
(64) это как ?
если есть номенклатура с разным наименованием, но артикул у неё одинаковый, или отсутствует, к примеру, тогда чего ?
Сумму по ним куда писать ?
67 sapphire
 
19.07.12
14:53
(64) Ты можешь внятно сказать что именно нужно?
Остатки по номенклатуре и остатки по артикулам одновременно?
68 sapphire
 
19.07.12
14:54
(65) Маразм
69 viktor_vv
 
19.07.12
14:56
(68) Че это? Как раз получится (28) "можно эту сумму во все прописать или последнему в списке". В этом подзапросе заодно и просуммировать по одинаковым артикулам.
70 sapphire
 
19.07.12
15:15
(69) Таблицу с остатками во времянку надо, а не рассчитывать одно и то же дважды.
71 viktor_vv
 
19.07.12
15:20
(70) Ну это согласен.
72 Mikeware
 
20.07.12
11:09
(61) получи все записи с артикулами и остатками (и колонка с единичкой), выгрузи в ИТЗ, сгруппируй по артикулу (суммируя единички и остатки), проиндексируй по счетчику, и смотри: в счетчике будет число дублей, в потомках получищь развернутые остатки по всем товарам с совпадающими артикулами.
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший