Имя: Пароль:
1C
1C 7.7
v7: Нужно сжать таблицу значений
,
0 oslokot
 
19.09.12
09:52
Пока Запрос.Группировка(1) = 1 Цикл
   ТаблЗнач.НоваяСтрока();
   ТаблЗнач.Идентификатор    = Запрос.Идентификатор;   // Текст
   ТаблЗнач.Номенклатура    = Запрос.Номенклатура;    // Справочник
   ТаблЗнач.Примечание    = Запрос.Примечание;      // Текст
   ТаблЗнач.Количество    = Запрос.КоличествоСумма; // Число
КонецЦикла;

Нужно сжать ТаблЗнач по количеству, если совпадают "Номенклатура" и "Примечание" но при этом сложить в строку "Идентификатор", например через разделитель ";"
1 Нуф-Нуф
 
19.09.12
09:52
цикл ептыть
2 Нуф-Нуф
 
19.09.12
09:53
или ком соединение к 8ке и в ней выполнить скд, которое вернет новую тз
3 Ненавижу 1С
 
гуру
19.09.12
09:53
(1) ну ты сказал, этож код писать САМОМУ!
4 oslokot
 
19.09.12
10:20
Покрасивее бы сделать... :)
5 Voronve
 
19.09.12
10:21
(4) " ... но при этом сложить в строку "Идентификатор" ... " - цикл
6 Морозов Александр
 
19.09.12
10:22
я чет ниче не понял...
7 Азат
 
19.09.12
10:23
ну пздц школоло пошло
8 Прохожий
 
19.09.12
10:24
Примечание - строка. Один символ влево-вправо и таблица не сложится. "Ваша программа не работает...За что мы платим вам аж 700 рублей в час?!"
9 Азат
 
19.09.12
10:26
НовТЗ = СОздатьОбъект("ТаблицаЗначений");
НовТЗ.НоваяКолонка("ПримариКей");
НовТЗ.НоваяКолонка("СтрокаИден");

Пока Запрос.Группировка(1) = 1 Цикл
   ТаблЗнач.НоваяСтрока();
   ТаблЗнач.Номенклатура     = Запрос.Номенклатура;    // Справочник
   ТаблЗнач.Примечание     = Запрос.Примечание;      // Текст
   ТаблЗнач.Количество     = Запрос.КоличествоСумма; // Число
   
   Кей = ЗначениеВСтрокуВнутр(Запрос.Номенклатура) + "@" + ЗначениеВСтрокуВнутр(Запрос.Примечание);
   Стр = 0;
   Если НовТЗ.НайтиЗначение(Кей, Стр, "ПримариКей") = 0 Тогда
       НовТЗ.НоваяСтрока();
       НовТЗ.ПримариКей = Кей;
       НовТЗ.СтрокаИден = Запрос.Идентификатор;
   Иначе
       НовТЗ.УстановитьЗначение(Стр, "Идентификатор", НовТЗ.ПолучитьЗначение(Стр, "Идентификатор") + "," + Запрос.Идентификатор);
   КонецЕсли;
КонецЦикла;

Ну и потом ТЗ.Свернуть("Номенклатура, Примечание", "Количество");

а при выводе - получаешь строку иденов из НовТЗ
10 Азат
 
19.09.12
10:27
+ (9) давай косарик на киви
11 oslokot
 
19.09.12
10:27
(8) Согласен. Но разговор сейчас не об этом.

Вот так я сделал:

   Для НомерСтрокиЦикла = 1 По ТаблЗнач.КоличествоСтрок() Цикл
       Попытка
           ПоискНоменклатура = ТаблЗнач.ПолучитьЗначение(НомерСтрокиЦикла,"Номенклатура");    
       Исключение
           Продолжить;
       КонецПопытки;
       ПоискПримечание = ТаблЗнач.ПолучитьЗначение(НомерСтрокиЦикла,"Примечание");    
       ИтогоКоличество = ТаблЗнач.ПолучитьЗначение(НомерСтрокиЦикла,"Количество");
       СтрокаИдентификаторов = СокрЛП(ТаблЗнач.ПолучитьЗначение(НомерСтрокиЦикла,"Идентификатор"));
       ТаблЗнач.ВыбратьСтроки();
       Пока ТаблЗнач.ПолучитьСтроку() = 1 Цикл
           Если (ПоискНоменклатура = ТаблЗнач.Номенклатура) и (ПоискПримечание = ТаблЗнач.Примечание) и (ТаблЗнач.НомерСтроки <> НомерСтрокиЦикла) Тогда
               ИтогоКоличество = ИтогоКоличество +  ТаблЗнач.Количество;  
               СтрокаИдентификаторов = СтрокаИдентификаторов + " " + ТаблЗнач.Идентификатор;
               ТаблЗнач.УдалитьСтроку();
               ТаблЗнач.ВыбратьСтроки();
           КонецЕсли;
       КонецЦикла;
       СтрокаИдентификаторов = СтрЗаменить(СокрЛП(СтрокаИдентификаторов)," ",";");
       ТаблЗнач.УстановитьЗначение(НомерСтрокиЦикла,"Идентификатор",СтрокаИдентификаторов);
       ТаблЗнач.УстановитьЗначение(НомерСтрокиЦикла,"Количество",ИтогоКоличество);
   КонецЦикла;

Кто хочет, может посмеяцца:)
Работает конечно... но как красивее сделать?
12 oslokot
 
19.09.12
10:28
(9) опередил :)
13 Азат
 
19.09.12
10:29
(12) я еще и красивее сделал такто
14 oslokot
 
19.09.12
10:30
(13) да-да!
эх, я точно, школота :(
15 Азат
 
19.09.12
10:34
(14) за цикл в цикле ссаной тряпочкой по ипальничку
16 oslokot
 
19.09.12
10:37
(15) а че, низя?
17 Нуф-Нуф
 
19.09.12
10:39
(15) пацааан
18 ЧеловекДуши
 
19.09.12
10:41
(16)Медленно и считается гоуно кодом.
ПК, конечно стали сильными, но это не значит, что не нужно оптимизировать код.
19 Mikeware
 
19.09.12
10:42
взять ИндексированнуюТаблицу, Ггруппировать(), добавить колонку и заполнить из тзПотомки циклом. 9 строк.
20 Alexor
 
19.09.12
10:45
Я бы сделал:
В запросе группировки по
Идентификатор,Номенклатура,Примечание

Потом

Пока Запрос.Группировка(1) = 1 Цикл
Пока Запрос.Группировка(2) = 1 Цикл
   ТаблЗнач.НоваяСтрока();
   ТаблЗнач.Идентификатор     = Запрос.Идентификатор;   // Текст

   ТаблЗнач.Номенклатура     = Запрос.Номенклатура;    // Справочник

Примечание="";
Колво=0;
Пока Запрос.Группировка(3) = 1 Цикл


   Примечание     = Примечание+","+СокрЛП(Запрос.Примечание);      // Текст

   Колво=Колво+ Запрос.КоличествоСумма; // Число
КонецЦикла;


   ТаблЗнач.Примечание     = Примечание;

   ТаблЗнач.Количество     = Колво;

КонецЦикла;
КонецЦикла;
21 alex74
 
19.09.12
10:47
(0) интересный у тебя запрос...
22 Нуф-Нуф
 
19.09.12
10:48
юзайте скд и неипите мозги честным людям
23 Alexor
 
19.09.12
10:49
+20 Ошибся с реквизитом

Групипровать
Номенклатура,Примечание,Идентификатор

Потом

Пока Запрос.Группировка(1) = 1 Цикл
Пока Запрос.Группировка(2) = 1 Цикл
   ТаблЗнач.НоваяСтрока();
   ТаблЗнач.Примечание     = Запрос.Примечание;   // Текст


   ТаблЗнач.Номенклатура     = Запрос.Номенклатура;    // Справочник


Идентификатор="";
Колво=0;
Пока Запрос.Группировка(3) = 1 Цикл


   Идентификатор     = Идентификатор+?(ПустоеЗначение(Идентификатор)=1,"",",")+СокрЛП(Запрос.Идентификатор);      // Текст


   Колво=Колво+ Запрос.КоличествоСумма; // Число

КонецЦикла;


   ТаблЗнач.Идентификатор     = Идентификатор;

   ТаблЗнач.Количество     = Колво;

КонецЦикла;
КонецЦикла;
24 oslokot
 
19.09.12
11:21
(23) так не получится, пробовал уже. Не любит она группировки по текстовым переменным

Err: "Длина индекса превышает максимальную длину и не может быть уменьшена."
25 antoneus
 
19.09.12
11:53
как уже говорили, взять индексированную таблицу. Или даже две.

ИТ1 = СоздатьОбъект("ИндексированнаяТаблица");
ИТ1.Загрузить(ТаблЗнач);
ИТ1.Свернуть("Идентификатор, Номенклатура, Примечание", "КоличествоСумма");
ИТ1.ДобавитьИндекс("НомПрим", "Номенклатура, Примечание");
ИТ2 = СоздатьОбъект("ИндексированнаяТаблица");
ИТ1.Выгрузить(ИТ2, "НомПрим", "Номенклатура, Примечание", 1);
ИТ2.НоваяКолонка("Идентификаторы");
ИТ2.НоваяКолонка("Сумма");
Ключ = СоздатьОбъект("СписокЗначений");
спИдентификаторы = СоздатьОбъект("СписокЗначений");
ИТ2.ВыбратьСтроки();
Пока ИТ2.ПолучитьСтроку() = 1 Цикл
   Ключ.УдалитьВсе();
   ИТ2.ВыгрузитьСтроку(Ключ, ИТ2.НомерСтроки(), "Номенклатура, Примечание");
   ИТ1.УстановитьФильтр(Ключ, Ключ, "НомПрим");
   ИТ2.Сумма = ИТ1.Итог("КоличествоСумма", "НомПрим");
   ИТ1.Выгрузить(спИдентификаторы, "НомПрим", "Идентификатор");
   ИТ2.Идентификаторы = СтрЗаменить(спИдентификаторы.ВСтрокуСРазделителями(), """", "");
КонецЦикла;
26 oslokot
 
19.09.12
12:02
Спасибо всем! сделал как (9)
27 Азат
 
19.09.12
12:12
(26) давай косарик в благодарность
28 orefkov
 
19.09.12
12:35
Примерно так:

база = СоздатьОбъект("SQLIteBase");
база.Открыть(":memory:");
база.УложитьТЗ(тз, "tab");
тз = база.НовыйЗапрос().ВыполнитьЗапрос("select Номенклатура [Номенклатура :Справочник.Номенклатура],
   |Примечание, group_concat(Идентификатор, ',') from tab group by Номенклатура, Примечание");
29 Ёпрст
 
19.09.12
12:38
(28) жалко, что group_concat нет в фоксе, к примеру :(
30 orefkov
 
19.09.12
12:38
(29)
Да, group_concat рулит, много раз уже помогал.
31 oslokot
 
19.09.12
13:04
(27) Держи косарь )
2 + 2 = 3.9999999999999999999999999999999...