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


1С:Предприятие :: 1С:Предприятие 7.7 и ранее

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

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 человек.
Рекламное место пустует