Имя: Пароль:
1C
 
Не группируются наименования в запросе
0 SHUSHU
 
16.02.06
22:48
Построила модуль отчета конструктором запроса. Суть - сгруппировать наименования справочника, а цены наименований усреднить. Проблема: выводит упорядоченные наименования, но группировать никак не хочет. Одинаковые наименования просто друг за дружкой стоят. В чём причина?
1 Diter
 
16.02.06
22:50
Наверное в том что это строки?
2 SHUSHU
 
16.02.06
22:56
А разве строки не группируютя? Что же тогда группируется?
3 baer
 
16.02.06
23:01
А что вы вкладываете в понятие "группируются"?
4 SHUSHU
 
16.02.06
23:09
Я до этого писала на Accesse, и там группировка по какому-либо полю означала объединение одинаковых наименований или чисел, а числовые значения, которые им соответствовали, м. б. складывать, получать среднее и т. д. Мне в 1С надо тоже получить сводный отчет. Т. е. Получить все наименования справочника, а цены (они м. б. разными у одних и тех же наименований) усреднить, т. е. проставить среднюю цену. И вот никак не пойму, чего надо.
5 baer
 
16.02.06
23:11
Жаль вас разочаровывать, но в 1С так просто не получится...
6 insider
 
16.02.06
23:12
(4) объясни конкретнее: у тебя у разных элементов справочника одни и те же наименования и нужно сгруппировать одинаковые? а цены периодические или как?
код в студию, так будет проще, телепатировать сложнее
7 6pak
 
16.02.06
23:15
мона быть это не самый лучший вариант, но я на такой случай написал, обработку по принципу:сначала все сортировалось, т.е. одинаковые выстраивались в очередь, а потом они перебирались друг за другом, сравнивались и переносились в новую таблицу, и соотоветственно 1=2, то новый элемент не создавался, если 1<>2 то создавался новый, только у меня фишка была такая, что если цена одинаковая - одна позиция, а если разная, то две, но смысл в том же - обработка одинаковых елементов.
8 SHUSHU
 
16.02.06
23:16
Я уже начала догадываться, что не все так просто. Цены не периодические и действительно нужно сгруппировать одинаковые наименования. Похоже мне самой придётся эту задачу программировать?
9 insider
 
16.02.06
23:17
(7) здесь имхо и в ТЗ результаты запроса выкинуть можно
10 insider
 
16.02.06
23:17
(8) а тебе код накидать? :)
11 avm-nn
 
16.02.06
23:21
(0)А код запроса можно посмотреть?
12 SHUSHU
 
16.02.06
23:23
Интересно, если не сложно
13 у лю 427
 
16.02.06
23:24
(0) делай через ТЗ...
14 MikleV
 
16.02.06
23:25
(13) - верняк, только вот потом его к построителю хрен присобачишь..
15 insider
 
16.02.06
23:25
(12) та не жалко:

Процедура Сформировать()
   Перем Запрос, ТекстЗапроса, Таб;
   //Создание объекта типа Запрос
   Запрос = СоздатьОбъект("Запрос");
   ТекстЗапроса =
   "//{{ЗАПРОС(Сформировать)
   |Наименование = Справочник.Номенклатура.Наименование;
   |УчетнаяЦена = Справочник.Номенклатура.УчетнаяЦена;
   |Функция Счётчик = Счётчик();
   |Функция УчетнаяЦенаСумма = Сумма(УчетнаяЦена);
   |Группировка Наименование;
   |"//}}ЗАПРОС
   ;
   // Если ошибка в запросе, то выход из процедуры
   Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
       Возврат;
   КонецЕсли;

   // Подготовка к заполнению выходных форм данными запроса
   Таб = СоздатьОбъект("Таблица");
   Таб.ИсходнаяТаблица("Сформировать");
   // Заполнение полей "Заголовок"
   Таб.ВывестиСекцию("Заголовок");
   Состояние("Заполнение выходной таблицы...");
   Таб.Опции(0, 0, Таб.ВысотаТаблицы(), 0);
   Пока Запрос.Группировка(1) = 1 Цикл
       // Заполнение полей Наименование
       Таб.ВывестиСекцию("Наименование");
   КонецЦикла;
   // Заполнение полей "Итого"
   Таб.ВывестиСекцию("Итого");
   // Вывод заполненной формы
   Таб.ТолькоПросмотр(1);
   Таб.Показать("Сформировать", "");
КонецПроцедуры


осталось поделить сумму цен на счетчик и будет средняя, но это тупняк, построенный конструктором, если сложнее надо, пиши
16 у лю 427
 
16.02.06
23:26
результат запроса выгрузить в ТЗ
добавить колонку для условий суммирования
Свернуть ТЗ по колонке...
17 avm-nn
 
16.02.06
23:28
Не очень понятно, почему не катит группировка. Длина текстового поля "Наименование" одинаковая, пробелы не путаются под ногами. Странно.
18 SHUSHU
 
16.02.06
23:29
Огромное спасибо, никогда не забуду.
19 insider
 
16.02.06
23:30
(18) та ладно, не за что, только текст отформатируй, а то движок форума чуть накосячил с ним
20 avm-nn
 
16.02.06
23:33
(16) Это уж на крайняк, если не получится по-нормальному разобраться. Непонятно, почему так не работает.
21 insider
 
16.02.06
23:34
(20) ну если в контексте задачи, то (15) работает
22 у лю 427
 
16.02.06
23:34
интересно, что получится, если одинаковые наименования находятся в разных группах справочника...  

Или такого нет?
Обычно группировать надо находящиеся в одной группе...
23 insider
 
16.02.06
23:36
(22) добавляем в запрос Родителя и группировку по нему первой
24 у лю 427
 
16.02.06
23:38
лень спорить... но это тоже не всегда работает...
хотя в контексте задачи вполне...


P.S. я обычно более универсально делаю...
25 insider
 
16.02.06
23:39
(24) ну так кто ж спорит :)
кстати действительно свернет наименования, если по родителю не группировать, все верно
26 у лю 427
 
16.02.06
23:44
это не полное условие...
27 insider
 
16.02.06
23:56
(26) т.е.? тогда уже и задача наверное немного другая? :)
28 Diter
 
16.02.06
23:59
Если задача стоит в том, чтобы отловить дубли - есть простое решение в 15 строк без запроса ;))
29 insider
 
17.02.06
00:02
(28) отловить и усреднить цену по ним, а че за решение?
впрочем мое без каментов и то короче, стареешь :)
30 Diter
 
17.02.06
00:02
(+38) ошибся - 45 строк с селекторам как ловить дубли - по полному совпадению имени или по первым символам
31 Diter
 
17.02.06
00:02
//*****************************************
Процедура ВернутьСписокДублей(ТекЭл,СписокДублей)
   ТекИмяЭл=ТекЭл.Наименование;
   Спр=СоздатьОбъект("Справочник."+ТекСпр);
   Спр_=СоздатьОбъект("Справочник."+ТекСпр);
   Спр.НайтиЭлемент(ТекЭл);
   Спр.Удалить(1);                        
   Если ИмяТочно=1 Тогда
       Если Спр_.НайтиПоНаименованию(ТекИмяЭл,0,1)=0 Тогда
           // нет дубля
           Возврат;
       Иначе  
           СписокДублей.ДобавитьЗначение(Спр_.ТекущийЭлемент());
           ВернутьСписокДублей(Спр_.ТекущийЭлемент(),СписокДублей);
       КонецЕсли;    
   Иначе
       Если Спр_.НайтиПоНаименованию(ТекИмяЭл,0,0)=0 Тогда
           // нет дубля
           Возврат;
       Иначе
           СписокДублей.ДобавитьЗначение(Спр_.ТекущийЭлемент());
           ВернутьСписокДублей(Спр_.ТекущийЭлемент(),СписокДублей);
       КонецЕсли;    
   КонецЕсли;    
КонецПроцедуры
//*****************************************
Процедура ВыполнитьПоискДублей()
   Спр=СоздатьОбъект("Справочник."+ТекСпр);
   Спр.ВыбратьЭлементы();
   Пока Спр.ПолучитьЭлемент()<>0 Цикл
       Если Спр.ЭтоГруппа()=1 Тогда
           Продолжить;
       КонецЕсли;
       ТекЭл=Спр.ТекущийЭлемент();
       СписокДублей=СоздатьОбъект("СписокЗначений");
       СписокДублей.ДобавитьЗначение(Спр.ТекущийЭлемент());
       НачатьТранзакцию();
       ВернутьСписокДублей(ТекЭл,СписокДублей);
       ОтменитьТранзакцию();
   КонецЦикла;    
КонецПроцедуры
32 Diter
 
17.02.06
00:03
Может чего и лишнего написАл для перестраховки ;))
33 insider
 
17.02.06
00:07
(32) э... зачем так? имхо отсортировать по наименованию, найти первое и выборкой до тех пор, пока наименование не станет другим и без всяких рекурсий....
34 Diter
 
17.02.06
00:09
(33) А я захотел сделать так ;))

Ну нравятся мне рекурсии. Есть в них что то... мистическое ;)
35 Diter
 
17.02.06
00:10
(34) Кроме того - это маленький кусочек кода, по отлову дублей, поиску ссылок на них, определение элемента, который останется, замена дублей на этот элемент и удаление лишних дублей
36 insider
 
17.02.06
00:13
(34) эт я поторопился, по-моему не получится, точнее долго может быть, так что оставим пока твой вариант :)
37 Diter
 
17.02.06
00:14
(36) да бога ради.. мне не жалко ;))

могу кинуть переделанный REPLVAL.ERT который делает то, что я сказал в 35
38 insider
 
17.02.06
00:20
(37) пасиб, но я по IDD ищу при обменах (как правило), ну и для особо одаренных юзеров, или в случае, если юзеру физически трудно быстро определить, делает ли он сейчас дубль (например списки рассылки, там ФИО, адрес и т.п.) - обработка при вводе нового эл-та, ищу как правило прямыми запросами, т.е. ошибка исключена при вводе.
P.S. не смейся, но почему-то не помню что это за ерт. может и не видел или склероз...
39 Diter
 
17.02.06
00:22
(38) Поиск ссылок и замена значения с одного на другой. Идёт на ИТС...

речь не об обмене идёт. Там я ищу по ключу и соответствиям. Речь идёт об отлове дублей в уже заполненном справочнике. Мне например пришлось искать дубли в справочнике "Товары" после неудачного использования юзером ТранРефа
40 Diter
 
17.02.06
00:23
(38) Прямые запросы к таблицам? А можешь пример такого запроса привести. Только не голый текст запроса а пример в коде 1С с выборкой результатов. Простенький
41 insider
 
17.02.06
00:24
(39) ага, помню, была такая тема... ну как-то не сталкиваюсь с такими задачами (может везет?)
(40) э... щас подумаю что показать лучше
42 insider
 
17.02.06
00:28
+41 на например фрагмент обработки поиска двойников по фамилии и почт. индексу в справочнике по первым символам, т.е. ты вводишь и она в динамике ищет, пожалуй примитивнее некуда:

Функция Изм()
   Если СтрДлина(СокрЛП(ВыбФамилия))<2 Тогда
       Возврат "";
   КонецЕсли;
   //
   Если (ВыбФамилия=СтФамилия)и(ВыбИндекс=СтИндекс) Тогда
       Возврат "";
   КонецЕсли;
   
   Query=CreateObject("ODBCRecordSet");
   QText="--
   |select s.code as code, s.descr as fio, i.code as ind, s.sp20 as address
   |from sc12 s inner join sc309 i on i.id=s.sp306
   |where s.sp14 like '"+trimall(ВыбФамилия)+"%'"+?(ВыбИндекс.Выбран()=1,"and s.sp306='"+_IdToStr(глПолучитьИД(ВыбИндекс))+"'","")+"
   |order by s.descr, i.code";
   //
   Query.Open(Qtext);
   Query.GetResultsInVT(тбРез,1);
   тбРез.УстановитьПараметрыКолонки("code",,,,"Код",3);  
   тбРез.УстановитьПараметрыКолонки("fio",,,,"Ф.И.О.",15);
   тбРез.УстановитьПараметрыКолонки("ind",,,,"Индекс",5);
   тбРез.УстановитьПараметрыКолонки("address",,,,"Адрес",20);
   
   СтФамилия=ВыбФамилия; СтИндекс=ВыбИндекс;
   
   Возврат "";
КонецФункции

функция подвешена на текстовый реквизит
43 Diter
 
17.02.06
00:30
напоминает запросы из Access'а... я писАл когда то такие.. спасибо.
44 Diter
 
17.02.06
00:31
Ладно.. всем бай бай.

Удачи и процветания
45 insider
 
17.02.06
00:31
(43) дык это ж скуль и есть, т.е. не MS SQL, а язык sql, он почти одинаков, разве что диалекты под разные СУБД
(44) и тебе :)
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.