|   |   | 
| 
 | 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) не хватает функции в запросе по сумме. С ней надёжнее работать     | 
 
 | Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |