Вход | Регистрация


1С:Предприятие ::

Метки: 

v7: Сделал универсальную процедуру обработки таблицы запроса или что-то прозевал?

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

Процедура Сформировать()
    Перем Запрос, ТекстЗапроса;
    //Создание объекта типа Запрос

    Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса = 
    "//{{ЗАПРОС(Сформировать)

    |Период с (НачДата) по (КонДата);
    |Без итогов;             
    |Фирма=Регистр.Продажи.Фирма;
    |Покупатель = Регистр.Продажи.Покупатель;
    |Номенклатура = Регистр.Продажи.Номенклатура;
    |ПродСтоимость = Регистр.Продажи.ПродСтоимость;
    |Количество = Регистр.Продажи.Количество;
    |Функция ПродСтоимостьСумма = Сумма(ПродСтоимость);
    |Функция КоличествоСумма = Сумма(Количество);
    |Группировка Покупатель без групп;
    |Группировка Номенклатура без групп;    
    |Группировка Месяц;
    |Условие(Номенклатура в ВыбНом);         
    |Условие(Фирма=ВыбФирма);           
    |Условие(Покупатель.ЮрФизЛицо.Вид()<>""СвоиЮрЛица"");
    |"//}}ЗАПРОС

    ;
    // Если ошибка в запросе, то выход из процедуры

    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
        Возврат;
    КонецЕсли;
    
    ЗначПериода="Месяц";
    
    ТЗ=СоздатьОбъект("ТаблицаЗначений");
    Запрос.Выгрузить(ТЗ);
    //ТЗ.ВыбратьСтроку();

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

    //

    //Теперь надо так заполнить ТЗИ, чтобы попали значения в нужные колонки

    ТЗ.ВыбратьСтроки();
    Пока ТЗ.ПолучитьСтроку()=1 Цикл
    //проверяюд первое - если есть, то второе и т.д.     

     СтрПров="";                               
     Спис=создатьОбъект("СписокЗначений");
     Спис.УдалитьВсе();
     Для СчИзм=1 По СписокИзмерений.РазмерСписка() Цикл
         Измерение=СписокИзмерений.ПолучитьЗначение(СчИзм);
         Если СчИзм=1 Тогда
         СтрПров=СтрПров+ТЗ.ПолучитьЗначение(ТЗ.НомерСтроки,Измерение);
         Иначе             
         СтрПров=СтрПров+"-"+ТЗ.ПолучитьЗначение(ТЗ.НомерСтроки,Измерение);
        КонецЕсли;
        НомТп=0;
        Если ТП.НайтиЗначение(СтрПров,НомТП,"Поиск")=0 Тогда
         ТП.НоваяСтрока();         
         ТП.Параметр=ТЗ.ПолучитьЗначение(ТЗ.НомерСтроки,Измерение);
         ТП.Поиск=СтрПров;                         
         Период=ТЗ.ПолучитьЗначение(ТЗ.НомерСтроки,ЗначПериода);
         Номпер=0;                           
         Если ТЗП.НайтиЗначение(Период,Номпер,ЗначПериода)=1 Тогда
           ТП.УстановитьЗначение(ТП.НомерСтроки,2+НомПер,ТП.ПолучитьЗначение(ТП.НомерСтроки,2+НомПер)+ТЗ.ПродСтоимостьСумма);    
         КонецЕсли; 
             
        Иначе
        //надо пройти назад по цепочке и прибавить все значения по нужному месяцу

         ТП.ПолучитьСтрокуПоНомеру(НомТП);
         Период=ТЗ.ПолучитьЗначение(ТЗ.НомерСтроки,ЗначПериода);
         Номпер=0;                           
         Если ТЗП.НайтиЗначение(Период,Номпер,ЗначПериода)=1 Тогда
           ТП.УстановитьЗначение(ТП.НомерСтроки,2+НомПер,ТП.ПолучитьЗначение(ТП.НомерСтроки,2+НомПер)+ТЗ.ПродСтоимостьСумма);    
         КонецЕсли; 
     
        //     

        //    

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

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



Список тем форума
Рекламное место пустует  
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует