| 
    
        
     
     | 
    
  | 
v7: Упростить внешний отчет | ☑ | ||
|---|---|---|---|---|
| 
    0
    
        julia_rostov    
     28.08.12 
            ✎
    09:48 
 | 
         
        Народ помогите упростить внешний отчет, понимаю что сделала неправильно и иррационально с точки зрения программирования.
  
        Процедура Сформировать() Перем Запрос, ТекстЗапроса, Таб; Запрос = СоздатьОбъект("Запрос"); ТекстЗапроса = "//{{ЗАПРОС(Сформировать) |Период с ВыбНачПериода по ВыбКонПериода; |ОбрабатыватьДокументы НеПроведенные; |Обрабатывать НеПомеченныеНаУдаление; |Без итогов; |АктТранспортный = Документ.АктТранспортный.ТекущийДокумент; |Фирма = Документ.АктТранспортный.Фирма; |Группировка АктТранспортный; |Условие (Фирма в ВыбФирма); |"; Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда Возврат; КонецЕсли; Док = СоздатьОбъект("Документ.АктТранспортный"); СпрК = СоздатьОбъект("Справочник.Клиенты"); Клиент=СпрК; Док.ВыбратьДокументы(ВыбНачПериода, ВыбКонПериода); Таб = СоздатьОбъект("Таблица"); Таб.ИсходнаяТаблица("Печать_Акта"); Таб.ПараметрыСтраницы(2); Пока Запрос.Группировка() = 1 Цикл Док.НайтиДокумент(Запрос.АктТранспортный); Если СпрК.НайтиПоКоду(65481) = 1 Тогда Клиент = СпрК.ТекущийЭлемент(); КонецЕсли; Итого=Док.Сумма; БезНалога="00,00"; Всего=Док.Сумма; ЕДИЗМ="Км"; Ном="1"; Таб.ВывестиСекцию("Заголовок"); Таб.ВывестиСекцию("Заказчик"); Таб.ВывестиСекцию("Вод"); Таб.ВывестиСекцию("Шапка"); Таб.ВывестиСекцию("Строка"); Таб.ВывестиСекцию("Итого"); Таб.ВывестиСекцию("ИтогоБезНалога"); Таб.ВывестиСекцию("Всего"); Таб.ВывестиСекцию("СуммаПР"); Таб.ВывестиСекцию("Подвал") ; Таб.ВывестиСекцию("Пустая"); Таб.НоваяСтраница(); КонеЦЦикла; Таб.ПараметрыСтраницы(2,,, 10, 0, 0, 0,,,,,); Таб.ТолькоПросмотр(1); Таб.Показать("Печать_Акта", ""); КонецПроцедуры Процедура Реестр() Запрос = СоздатьОбъект("Запрос"); ТекстЗапроса = "//{{ЗАПРОС(Сформировать) |Период с ВыбНачПериода по ВыбКонПериода; |ОбрабатыватьДокументы НеПроведенные; |Обрабатывать НеПомеченныеНаУдаление; |Без итогов; |АктТранспортный = Документ.АктТранспортный.ТекущийДокумент; |Сумма = Документ.АктТранспортный.Сумма; |Фирма = Документ.АктТранспортный.Фирма; |Условие (Фирма в ВыбФирма); |Группировка АктТранспортный; |"; Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда Возврат; КонецЕсли; Ном=0; Таб = СоздатьОбъект("Таблица"); Таб.ИсходнаяТаблица("Реестр"); Таб.ВывестиСекцию("Шапка"); Состояние("Заполнение выходной таблицы..."); Таб.Опции(0, 0, Таб.ВысотаТаблицы(), 0); СуммаИтог = 0; Пока Запрос.Группировка() = 1 Цикл Ном = Ном + 1; СуммаИтог = СуммаИтог + Запрос.Сумма; Таб.ВывестиСекцию("Строка"); КонеЦЦикла; Таб.ВывестиСекцию("Итоги"); Таб.ТолькоПросмотр(1); Таб.Показать("Реестр", ""); КонецПроцедуры;  | 
|||
| 
    1
    
        akaBrr    
     28.08.12 
            ✎
    09:52 
 | 
         
        (0) в запросе сумму получить и убрать все упоминания о Док, это про Сформировать     
         | 
|||
| 
    2
    
        akaBrr    
     28.08.12 
            ✎
    09:54 
 | 
         
        +(1) что в Реестр() и было сделано собственно     
         | 
|||
| 
    3
    
        julia_rostov    
     28.08.12 
            ✎
    09:56 
 | 
         
        на форме две кнопочки Формирование Реестра и просто формирование документа, я имею ввиду может как упростить и избавиться от повторения запроса     
         | 
|||
| 
    4
    
        akaBrr    
     28.08.12 
            ✎
    09:57 
 | 
         
        (3) в Сформировать в таблицу данные из Док берутся?     
         | 
|||
| 
    5
    
        julia_rostov    
     28.08.12 
            ✎
    09:58 
 | 
         
        Да все береться из одного документа     
         | 
|||
| 
    6
    
        akaBrr    
     28.08.12 
            ✎
    10:00 
 | 
         
        +(4) в смысле в таблице "Печать_Акта" в формулах ячеек встречаются ссылки на атрибуты Док?     
         | 
|||
| 
    7
    
        miki    
     28.08.12 
            ✎
    10:03 
 | 
         
        (3)Разные кнопки, разные процедуры. Что упрощать?
  
        Желание сэкономить строчки кода?  | 
|||
| 
    8
    
        julia_rostov    
     28.08.12 
            ✎
    10:04 
 | 
         
        Да в таблице Печать_Акта у меня Док.Контрагент...... вот примерно так.     
         | 
|||
| 
    9
    
        julia_rostov    
     28.08.12 
            ✎
    10:06 
 | 
         
        Я имела ввиду может, можно запрос один раз, а потом просто к нему обращаться, сейчас это принципиальной роли не играет, будет играть роль когда внешний отчет будет выполняться за большой промежуток времени....ВыбНачПериода по ВыбКонПериода;     
         | 
|||
| 
    10
    
        Ork    
     28.08.12 
            ✎
    10:06 
 | 
         
        (0) Все не так и все не там.
  
        Вот это вот : Док = СоздатьОбъект("Документ.АктТранспортный"); ... Док.ВыбратьДокументы(ВыбНачПериода, ВыбКонПериода); ... Пока Запрос.Группировка() = 1 Цикл ... Док.НайтиДокумент(Запрос.АктТранспортный); все для того, чтобы иметь текущий документ? Вот это вот : Если СпрК.НайтиПоКоду(65481) = 1 Тогда Клиент = СпрК.ТекущийЭлемент(); КонецЕсли; Означает, что всегда работаем с одним клиентом, если его код есть в базе? ДляНафигаТогда все остальные? Вот это вот очем  | 
|||
| 
    11
    
        miki    
     28.08.12 
            ✎
    10:07 
 | 
         
        Навскидку:
  
        Вот это: Если СпрК.НайтиПоКоду(65481) = 1 Тогда Клиент = СпрК.ТекущийЭлемент(); КонецЕсли; вынести из цикла. Это: Док.НайтиДокумент(Запрос.АктТранспортный); никчему. А выбор макета и вывод секций в нужную таблицу, в зависимости от какая кнопа нажата решается Если/Иначе/КонецЕсли;  | 
|||
| 
    12
    
        akaBrr    
     28.08.12 
            ✎
    10:07 
 | 
         
        (8) тогда либо убираем запрос, делаем выборку за период с фильтром по фирме, либо убираем выборку и ссылки на атрибуты Док в таблице заменяем на ссылки на данные запроса.
  
        ПС Док.ВыбратьДокументы(ВыбНачПериода, ВыбКонПериода); - это лишнее в текущем коде  | 
|||
| 
    13
    
        julia_rostov    
     28.08.12 
            ✎
    10:10 
 | 
         
        Смысл в чем Если клиент выбран то выборка идет строго по периоду и по тому клиенту который выбран, если клиент не выбран то по умолчанию выборка идет по всем клиентам за выбранный период     
         | 
|||
| 
    14
    
        akaBrr    
     28.08.12 
            ✎
    10:12 
 | 
         
        (13) в коде нет фильтра по клиенту     
         | 
|||
| 
    15
    
        julia_rostov    
     28.08.12 
            ✎
    10:12 
 | 
         
        MIKI Спасибо более менее стало понятно, что лишнее, Вы тоже из Ростова?     
         | 
|||
| 
    16
    
        julia_rostov    
     28.08.12 
            ✎
    10:14 
 | 
         
        И еще последний вопрос каким методом проверить какая кнопка нажата?     
         | 
|||
| 
    17
    
        Ork    
     28.08.12 
            ✎
    10:20 
 | 
         
        (13) Вот это вот "Если клиент выбран то выборка идет строго по периоду и по тому клиенту который выбран" - из вашего кода никак не следует.
  
        Само условие нужно унести в запрос. Примерно так: ТекстЗапроса = "//{{ЗАПРОС(Сформировать) |Период с ВыбНачПериода по ВыбКонПериода; |ОбрабатыватьДокументы НеПроведенные; |Обрабатывать НеПомеченныеНаУдаление; |Без итогов; |АктТранспортный = Документ.АктТранспортный.ТекущийДокумент; |Фирма = Документ.АктТранспортный.Фирма; |//Примерно так |Клиент = Документ.АктТранспортный.Клиент; |Группировка АктТранспортный; |Условие (Фирма в ВыбФирма); |"; Если выбКлиент.Выбран() = 1 Тогда ТекстЗапроса = ТекстЗапроса + "Условие(Клиент = выбКлиент);"; КонецЕсли; ЗЫ. Выбклиент - поле на форме с типом "Справочник.Клиенты"  | 
|||
| 
    18
    
        Ork    
     28.08.12 
            ✎
    10:22 
 | 
         
        (16) В свойствах кнопки прописывается процедура, которая выполняется при нажатии.     
         | 
|||
| 
    19
    
        miki    
     28.08.12 
            ✎
    10:37 
 | 
         
        (18)+ задай для процедуры параметр, например так:
  
        Процедура Реестр(ИмяМакета="Реестр") У кнопки [Сформировать] В свойствах будет Реестр("Акт"), у кнопки [Реестр] можно или Реестр("Реестр") или просто Реестр(). А в процедуре проверять: Если ИмяМакета="Реестр" Тогда <...> Иначе <...> (15)ну, да.  | 
|||
| 
    20
    
        julia_rostov    
     28.08.12 
            ✎
    10:39 
 | 
         
        Всем Спасибо большое))))     
         | 
|||
| 
    21
    
        vladko    
     28.08.12 
            ✎
    10:57 
 | 
         
        (20) не хватает функции в запросе по сумме. С ней надёжнее работать     
         | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |