Имя: Пароль:
1C
1C 7.7
v7: Сделал универсальную процедуру обработки таблицы запроса или что-то прозевал?
,
0 tgu82
 
21.09.17
13:34
Запрос выгружается в таблицу значений. Одна колонка у него "период" и по ней идет разворот по горизонтали.
Старался чтобы получилось универсально.
С показателями пока не работал (жестко выбираю их)
Саму таблицу отчета сформировать пара пустяков когда есть уже таблица значений, развернутая по периодам
Вроде правильно, но может я что-то прозевал?

Процедура Сформировать()
    Перем Запрос, ТекстЗапроса;
    //Создание объекта типа Запрос
    Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса =
    "//{{ЗАПРОС(Сформировать)
    |Период с (НачДата) по (КонДата);
    |Без итогов;            
    |Фирма=Регистр.Продажи.Фирма;
    |Покупатель = Регистр.Продажи.Покупатель;
    |Номенклатура = Регистр.Продажи.Номенклатура;
    |ПродСтоимость = Регистр.Продажи.ПродСтоимость;
    |Количество = Регистр.Продажи.Количество;
    |Функция ПродСтоимостьСумма = Сумма(ПродСтоимость);
    |Функция КоличествоСумма = Сумма(Количество);
    |Группировка Покупатель без групп;
    |Группировка Номенклатура без групп;    
    |Группировка Месяц;
    |Условие(Номенклатура в ВыбНом);        
    |Условие(Фирма=ВыбФирма);          
    |Условие(Покупатель.ЮрФизЛицо.Вид()<>""СвоиЮрЛица"");
    |"//}}ЗАПРОС
    ;
    // Если ошибка в запросе, то выход из процедуры
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
        Возврат;
    КонецЕсли;
    
    ЗначПериода="Месяц";
    
    ТЗ=СоздатьОбъект("ТаблицаЗначений");
    Запрос.Выгрузить(ТЗ);
    //ТЗ.ВыбратьСтроку();
    
    СписокИзмерений=СоздатьОбъект("СписокЗначений");
    
    Типус="";
    Для СчКол=1 По ТЗ.КоличествоКолонок() Цикл
        Пар=ТЗ.ПолучитьПараметрыКолонки(СчКол,Типус);    
        Если (Типус<>"Число") И  (ТЗ.ПолучитьПараметрыКолонки(СчКол)<>ЗначПериода) Тогда      
         СписокИзмерений.ДобавитьЗначение(Пар);     
        КонецЕсли;                 
    КонецЦикла;                 
    ТЗИ=СоздатьОбъект("ТаблицаЗначений");
    ТЗИ.НоваяКолонка("Параметр");
    ТЗИ.НоваяКолонка("Группа");
    ТЗИ.НоваяКолонка("Поиск");
    
    ТП=СоздатьОбъект("ТаблицаЗначений");
    
    ТП.НоваяКолонка("Параметр");
    ТП.НоваяКолонка("Поиск");
    
    
    ТЗП=СоздатьОбъект("ТаблицаЗначений");
    ТЗ.Выгрузить(ТЗП);
    ТЗП.Свернуть(ЗначПериода,"");
    
    ТЗП.ВыбратьСтроки();
    Пока ТЗП.ПолучитьСтроку()=1 Цикл
     ТП.НоваяКолонка(,"Число");            
    КонецЦикла;    
    //ТЗИ.ВыбратьСтроку();
    //
    //Теперь надо так заполнить ТЗИ, чтобы попали значения в нужные колонки
    ТЗ.ВыбратьСтроки();
    Пока ТЗ.ПолучитьСтроку()=1 Цикл
     //проверяюд первое - если есть, то второе и т.д.    
     СтрПров="";                              
     Спис=создатьОбъект("СписокЗначений");
     Спис.УдалитьВсе();
     Для СчИзм=1 По СписокИзмерений.РазмерСписка() Цикл
         Измерение=СписокИзмерений.ПолучитьЗначение(СчИзм);
         Если СчИзм=1 Тогда
         СтрПров=СтрПров+ТЗ.ПолучитьЗначение(ТЗ.НомерСтроки,Измерение);
         Иначе             
         СтрПров=СтрПров+"-"+ТЗ.ПолучитьЗначение(ТЗ.НомерСтроки,Измерение);
        КонецЕсли;
        НомТп=0;
        Если ТП.НайтиЗначение(СтрПров,НомТП,"Поиск")=0 Тогда
         ТП.НоваяСтрока();        
         ТП.Параметр=ТЗ.ПолучитьЗначение(ТЗ.НомерСтроки,Измерение);
         ТП.Поиск=СтрПров;                        
         Период=ТЗ.ПолучитьЗначение(ТЗ.НомерСтроки,ЗначПериода);
         Номпер=0;                          
         Если ТЗП.НайтиЗначение(Период,Номпер,ЗначПериода)=1 Тогда
           ТП.УстановитьЗначение(ТП.НомерСтроки,2+НомПер,ТП.ПолучитьЗначение(ТП.НомерСтроки,2+НомПер)+ТЗ.ПродСтоимостьСумма);    
         КонецЕсли;
             
        Иначе
         //надо пройти назад по цепочке и прибавить все значения по нужному месяцу
         ТП.ПолучитьСтрокуПоНомеру(НомТП);
         Период=ТЗ.ПолучитьЗначение(ТЗ.НомерСтроки,ЗначПериода);
         Номпер=0;                          
         Если ТЗП.НайтиЗначение(Период,Номпер,ЗначПериода)=1 Тогда
           ТП.УстановитьЗначение(ТП.НомерСтроки,2+НомПер,ТП.ПолучитьЗначение(ТП.НомерСтроки,2+НомПер)+ТЗ.ПродСтоимостьСумма);    
         КонецЕсли;
    
        //     
        //    
        КонецЕсли;    
     КонецЦикла;                            
    КонецЦикла;    
    
    ТП.ВыбратьСтроку();
1 aka AMIGO
 
21.09.17
13:37
Хоть какой-нибудь результат есть?
2 tgu82
 
21.09.17
13:39
(1) Да вроде правильный. Просто я видел кучу отчетов подобного рода но там как-то все было сложнее
3 Ёпрст
 
21.09.17
13:41
(0) как бэ, универсальностью тут и не пахнет
4 tgu82
 
21.09.17
13:42
(1) Так можно переделать и стандартный отчет "Анализ продаж" например, да и вообще задал готовую таблицу значений, указал какое поле по вертикали разворачивать и Все.
5 tgu82
 
21.09.17
13:42
(3) Критикуй. Я поэтому и выложил.
6 Ёпрст
 
21.09.17
13:42
универсальность, это ИТЗ, класс.ИтогиПоГруппировкам, универсальныйОтчетПоТЗ с группировками и измерениями
7 tgu82
 
21.09.17
13:45
(6) Ну это по сути то же самое. Единственное, что показатели придется разворачивать несколько если надо. Но это уже дело техники. Передал в отчет ТЗ и поле для разворота - на выходе готовая таблица
8 tgu82
 
21.09.17
13:46
(6) Я про саму логику. Насколько она верна? Говорю же что видел подобное но там как-то все замороченнее
9 romix
 
21.09.17
13:50
(0) В конструкторе запросов 7.7 помнится есть галка для формирования прямоугольных таблиц: ВошедшиеВЗапрос или иже с ней.
10 tgu82
 
21.09.17
13:51
(6) Даже если сюда группы добавить по номенклатуре - все равно должно сработать
11 tgu82
 
21.09.17
13:52
(9) Таблица она как бы всегда прямоугольная ). Речь идет о динамике показателей по периодам (разворот по горизонтали)
12 tgu82
 
21.09.17
13:54
(6) Даже сортировать не нужно. Хотя наверное здесь придется использовать полноенаименование. Да в ИТЗ это как я читал - сделано по умолчанию
13 Ёпрст
 
21.09.17
13:58
(8) ну как тебе сказать ?
Делать поиск по представлению - моветон. Разным элементам справочника с одинаковым наименованием, например, и усё - твой алгоритм коту под хвост
14 Ёпрст
 
21.09.17
14:00
а для некоторых справочнико, у которых, например, нет наименования или кода, так вообще веселье. Пример -
единицы измерения..
Они все будут шт. и кг. к примеру, в основном представлении. Только вот беда - всё это разные элементы с разными владельцами
15 tgu82
 
21.09.17
14:13
(13) Ну в-общем согласен, хотя вопрос формирования ТЗ отделяется от формирования самого отчета по этой ТЗ
16 tgu82
 
21.09.17
14:15
(13) Есть универсальный отчет по ТЗ. классная вещь, но блин добавить туда что-то свое очень сложно. А так я владею ситуацией
17 Ёпрст
 
21.09.17
14:23
Всё ЭТО, можно сделать без ТЗ.
Достаточно ВсеВошедшиеВЗапрос+ прямое позиционирование в выборке методом Получить()
18 Ёпрст
 
21.09.17
14:24
Но, всё это давно ужо не интересно.
В разы быстрее взять готовый класс или воспользоваться ИТЗ.
19 Ёпрст
 
21.09.17
14:25
20 Ёпрст
 
21.09.17
14:25
бери это
21 tgu82
 
21.09.17
14:28
(20) Спасибо. Попробую
22 tgu82
 
21.09.17
14:31
(20) Насчет Все вошедшие в запрос - это действительно здорово, ну а если речь идет о получении ТЗ не через запрос а например из внешних файлов? Вот тут мне и пригодится рыбка которую я создал
23 Ёпрст
 
21.09.17
14:34
(22) хотя бы это смотри
http://catalog.mista.ru/public/14794/

выложено на проклабе еще лет 15 назад.
24 tgu82
 
21.09.17
14:39
(23) Ну я им и пользуюсь давно, но понадобилось сделать свое потому что туда что-то встроить дополнительное - очень сложно.
25 Злопчинский
 
21.09.17
20:17
(24) ты бы привёл скриншоты примеров вывода того что у тебя
26 2S
 
21.09.17
20:18
Хрень какая-то.
Напиши на 1с++ и потом выкладывай
27 ADirks
 
22.09.17
06:20
(26) одобряю :))
и с функциональщиной ещё желательно
28 Злопчинский
 
22.09.17
08:06
Вы все какие-то злопы. Нет чтобы восхититься самоотверженность юнната...
2 + 2 = 3.9999999999999999999999999999999...