Имя: Пароль:
1C
1C 7.7
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) не хватает функции в запросе по сумме. С ней надёжнее работать