Имя: Пароль:
1C
1C 7.7
v7: Отчет по расходам (без НДС)
0 YurAnt
 
18.12.13
15:40
Доброго времени суток, господа-форумчане.
Проблема вот такого характера:
1) v7.7 Компоненты: Бух. учет, Опер. учет, Расчет, Управление распред. ИБ.;
2) Есть "отчет по расходам за период" http://savepic.su/3960903.png

Поступила задача выдать "такойже только без НДС"? стал разбираться.
Пришел к тому, что он собирается на основании СчетовНаОплату.
http://savepic.su/3981382.png
которые собираются в свою очередь из Распоряжений.

Поскольку отчет собирается на основании уже имеющихся значений (а там могут быть как значения с НДС так и без него), то "взять и поделить" просто так я не могу.
Значит надобно перебирать всё с "самых истоков"
(поправьте если я чего-то недопонимаю)

Код отчета.

Перем Расшифровка;
Функция РасшифровкаСчет(Парам)
    если парам=1 тогда
        Расшифровка.Установить("Счет",СчетПоКоду("44.1"));
    иначе
        Расшифровка.Установить("Счет",СчетПоКоду("44.2"));
    конецесли;
    возврат Расшифровка;    
КонецФункции

//*******************************************
Процедура Сформировать()
    Расшифровка = СоздатьОбъект("СписокЗначений");
    Расшифровка.Установить("Дата1", ДатаНач);
    Расшифровка.Установить("Дата2", ДатаКон);
       Расшифровка.Установить("Отчет", "ГруппыЗатратПоСчету");
       Расшифровка.Установить("НеВыводитьПустые", НеВыводитьПустые);
    Расшифровка.Установить("Обновить",2);
       
    Табл=создатьобъект("Таблица");
    Табл.ИсходнаяТаблица("Таблица");
    Табл.ВывестиСекцию("Шапка");
    
      Ит = СоздатьОбъект("БухгалтерскиеИтоги");
    Ит.ИспользоватьСубконто("Отделы",,1,1);
    Ит.ВыполнитьЗапрос(ДатаНач,ДатаКон,"44.1,44.2",,,,,);
    Ит.ВыбратьСубконто(1,,,,,"Код",);
    Итог1=0;Итог2=0;
    пока Ит.ПолучитьСубконто()=1 цикл
        Расх1=0;Расх2=0;
        Ит.ВыбратьСчета();
        если Ит.ПолучитьСчет(,"44.1")=1 тогда
            Расх1=Ит.До()-Ит.Ко();
        конецесли;    
        если Ит.ПолучитьСчет(,"44.2")=1 тогда
            Расх2=Ит.До()-Ит.Ко();
        конецесли;    
        Итог1=Итог1+Расх1;
        Итог2=Итог2+Расх2;
        Если(НеВыводитьПустые=1)И(Расх1=0)И(Расх2=0)тогда продолжить конецесли;
           Расшифровка.Установить("Отдел",Ит.Субконто());
        Табл.ВывестиСекцию("Строка");
    конеццикла;
    Табл.ВывестиСекцию("Итог");
    Табл.ТолькоПросмотр(1);
    Табл.Показать("Отчет по расходам");
КонецПроцедуры
ДатаНач=НачМесяца(ТекущаяДата());
ДатаКон=ТекущаяДата();

Итак, в общем покурив код часа два пришел к выводу что мне придется запросом выгребать список всех счетов оплаты на дату, по ним выгребать  все распоряжения
http://savepic.su/3994713.png
в них вычислять суммы, и собирать это все обратно в кучу...

Действительно ли все так туго? Или я изобретаю велосипед?

Благодарен за любые советы, С ув. YurAnt.
1 zak555
 
18.12.13
15:41
это что за конфа ?
2 YurAnt
 
18.12.13
15:46
(1) смахивает на какой-то кастрат бухии
http://savepic.su/3972185.png
3 YurAnt
 
18.12.13
15:48
этакая база расходов
4 zak555
 
18.12.13
15:48
удалить всё и перейти на типовую конфу
5 YurAnt
 
18.12.13
15:50
ладно, и на том спасибо...
буду значицц копать дальше(
6 YurAnt
 
18.12.13
15:51
просто надеялся что нечто подобное есть в типовых
7 YurAnt
 
19.12.13
10:26
Итак... вроде получилось, но цих мне с гвоздями пожизненный за такое.
(с 7кой знаком относительно недавно, и при одном только взгляде на структуру запросов и (!!!) конструктор - руки опускаются.)

Конечная цель - отчет вида: Отдел СуммаПо76_1 СуммаПо76_2
где СуммаПо76_1 = ТабРаспоряжений.Сумма - ТабРаспоряжений.НДС;

Прошу помочь оптимизировать запрос (в 8ке даже бы проблем не возникло, прицепил бы левым соединением распоряжения, отсортировал и посчитал бы, а тут тыкаюсь из стороны в сторону)...

//*******************************************
// Процедура генерации запроса Сформировать.
//
Процедура Сформировать()
    Перем Запрос, ТекстЗапроса, ТабЗнач, Запрос2, ТекстЗапроса2;
    //Создание объекта типа Запрос
    Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса =
    "//{{ЗАПРОС(Сформировать)
    |Период с ВыбНачПериода по ВыбКонПериода;
    |НомерДок = Документ.СчетОплаты.НомерДок;
    |ДатаДок = Документ.СчетОплаты.ДатаДок;
    |Основание = Документ.СчетОплаты.Основание;
    |Группировка НомерДок;
    |"//}}ЗАПРОС
    ;
    // Если ошибка в запросе, то выход из процедуры
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
        Возврат;
    КонецЕсли;

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

    Запрос.Выгрузить(ТабЗнач,1,0);

    Для НомерСтроки = 1 По ТабЗнач.КоличествоСтрок() Цикл
        ТабЗнач.ПолучитьСтрокуПоНомеру(НомерСтроки);
        //******************************************  
        //Счет761 = СчетПоКоду("76.1");
        //Счет762 = СчетПоКоду("76.2");
        Запрос2 = СоздатьОбъект("Запрос");
        ТекстЗапроса2 =
        "//{{ЗАПРОС(Сформировать)
        |НомерДок = Документ.РаспоряжениеНаОплату.НомерДок;
        |ДатаДок = Документ.РаспоряжениеНаОплату.ДатаДок;
        |ТекущийДокумент = Документ.РаспоряжениеНаОплату.ТекущийДокумент;
        |Отдел = Документ.РаспоряжениеНаОплату.Отдел;
        |Сумма = Документ.РаспоряжениеНаОплату.Сумма;
        |НДС = Документ.РаспоряжениеНаОплату.НДС;
        |ТекущийСчет = Документ.РаспоряжениеНаОплату.Счет76.ТекущийСчет;
        |Код = Документ.РаспоряжениеНаОплату.Счет76.Код;
        |Наименование = Документ.РаспоряжениеНаОплату.Счет76.Наименование;
        |Группировка Отдел упорядочить по Отдел.Наименование;
        |Группировка ТекущийСчет упорядочить по ТекущийСчет.Код;
        |Условие((ТекущийСчет.Код = ""76.1"") ИЛИ (ТекущийСчет.Код = ""76.2""));    
        |Условие(НомерДок = ТабЗнач.Основание.НомерДок);
        |"//}}ЗАПРОС
        ;
        // Если ошибка в запросе, то выход из процедуры
        Если Запрос2.Выполнить(ТекстЗапроса2) = 0 Тогда
            Возврат;
        КонецЕсли;
        
        ТабРаспоряжений = СоздатьОбъект("ТаблицаЗначений");  
        ТабРаспоряжений.НоваяКолонка("НомерДок");
        ТабРаспоряжений.НоваяКолонка("ДатаДок");
        ТабРаспоряжений.НоваяКолонка("ТекущийДокумент");
        ТабРаспоряжений.НоваяКолонка("Отдел");
        ТабРаспоряжений.НоваяКолонка("Сумма");
        ТабРаспоряжений.НоваяКолонка("НДС");
        ТабРаспоряжений.НоваяКолонка("ТекущийСчет");
        ТабРаспоряжений.НоваяКолонка("Код");
        ТабРаспоряжений.НоваяКолонка("Наименование");
        Запрос2.Выгрузить(ТабРаспоряжений,1,0);    
        
        Для НомерСтроки = 1 По ТабРаспоряжений.КоличествоСтрок() Цикл
            ТабРаспоряжений.ПолучитьСтрокуПоНомеру(НомерСтроки);
            Сообщить(ТабРаспоряжений.Отдел);
            Сообщить(ТабРаспоряжений.ТекущийСчет);
            Сообщить(ТабРаспоряжений.Сумма);
            Сообщить(ТабРаспоряжений.НДС);
        КонецЦикла;
        //******************************************
        //Сообщить(ТабЗнач.Основание);
        //ТабЗнач.ВывестиСекцию("НомерДок");
    КонецЦикла;
КонецПроцедуры

В общем сижу разбираюсь как обстоят дела с "left join" и временными таблицами...

// Я посвящаю весь свой код, всю работу своей жене Дарлин, которой
// придётся содержать меня, наших троих детей и собаку, когда
// это пойдет в паблик. (с)

С ув. YurAnt.
8 YurAnt
 
19.12.13
10:31
так, если правильно понимаю "левое соединение" в 7 выглядит как-то так

|Док = Документ.СчетОплаты.Основание,Документ.РаспоряжениеНаОплату;

поправьте если ошибаюсь...
9 YurAnt
 
19.12.13
10:41
//*******************************************
// Процедура генерации запроса Сформировать.
//
Процедура Сформировать()
    Перем Запрос, ТекстЗапроса;
    //Создание объекта типа Запрос
    Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса =
    "//{{ЗАПРОС(Сформировать)
    |Период с ВыбНачПериода по ВыбКонПериода;
    |НомерДок = Документ.СчетОплаты.НомерДок;
    |ДатаДок = Документ.СчетОплаты.ДатаДок;
    |Основание = Документ.СчетОплаты.Основание, Документ.РаспоряжениеНаОплату;  
    |Отдел = Документ.РаспоряжениеНаОплату.Отдел;
    |Сумма = Документ.РаспоряжениеНаОплату.Сумма;
    |НДС = Документ.РаспоряжениеНаОплату.НДС;
    |Код = Документ.РаспоряжениеНаОплату.Счет76.Код;
    |Группировка Отдел упорядочить по Отдел.Наименование;
    |Условие((ТекущийСчет.Код = ""76.1"") ИЛИ (ТекущийСчет.Код = ""76.2""));    
    |Группировка НомерДок;
    |"//}}ЗАПРОС
    ;
    // Если ошибка в запросе, то выход из процедуры
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
        Возврат;
    КонецЕсли;

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

    Запрос.Выгрузить(ТабРаспоряжений,1,0);

    Для НомерСтроки = 1 По ТабРаспоряжений.КоличествоСтрок() Цикл
        ТабРаспоряжений.ПолучитьСтрокуПоНомеру(НомерСтроки);
            Сообщить(ТабРаспоряжений.НомерДок);
            Сообщить(ТабРаспоряжений.ДатаДок);
            Сообщить(ТабРаспоряжений.Основание);
            Сообщить(ТабРаспоряжений.Отдел);
            Сообщить(ТабРаспоряжений.Сумма);
            Сообщить(ТабРаспоряжений.НДС);
            Сообщить(ТабРаспоряжений.Код);
    КонецЦикла;
КонецПроцедуры

Выдает
{Отчет.ОтчетПорасходамБезНДС.Форма.Модуль(24)}: Основание = Документ.СчетОплаты.Основание, Документ.РаспоряжениеНаОплату <<?>> ;  
Запрос[5] : Переменную описывают различные типы данных
10 YurAnt
 
19.12.13
10:42
ЧЯДНТ ?
11 YurAnt
 
19.12.13
10:46
Возвращает без ошибок, но пусто...

Процедура Сформировать()
    Перем Запрос, ТекстЗапроса;
    //Создание объекта типа Запрос
    Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса =
    "//{{ЗАПРОС(Сформировать)
    |Период с ВыбНачПериода по ВыбКонПериода;
    |НомерДок = Документ.СчетОплаты.НомерДок;
    |ДатаДок = Документ.СчетОплаты.ДатаДок;
    |Основание = Документ.СчетОплаты.Основание.НомерДок, Документ.РаспоряжениеНаОплату.НомерДок;  
    |Отдел = Документ.РаспоряжениеНаОплату.Отдел;
    |Сумма = Документ.РаспоряжениеНаОплату.Сумма;
    |НДС = Документ.РаспоряжениеНаОплату.НДС;
    |Код = Документ.РаспоряжениеНаОплату.Счет76.Код;
    |Группировка Отдел упорядочить по Отдел.Наименование;
//    |Условие((Код = ""76.1"") ИЛИ (Код = ""76.2""));    
    |Группировка НомерДок;
    |"//}}ЗАПРОС
    ;
    // Если ошибка в запросе, то выход из процедуры
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
        Возврат;
    КонецЕсли;

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

    Запрос.Выгрузить(ТабРаспоряжений,1,0);

    Для НомерСтроки = 1 По ТабРаспоряжений.КоличествоСтрок() Цикл
        ТабРаспоряжений.ПолучитьСтрокуПоНомеру(НомерСтроки);
            Сообщить(ТабРаспоряжений.НомерДок);
            Сообщить(ТабРаспоряжений.ДатаДок);
            Сообщить(ТабРаспоряжений.Основание);
            Сообщить(ТабРаспоряжений.Отдел);
            Сообщить(ТабРаспоряжений.Сумма);
            Сообщить(ТабРаспоряжений.НДС);
            Сообщить(ТабРаспоряжений.Код);
    КонецЦикла;
КонецПроцедуры
12 YurAnt
 
19.12.13
10:50
вот подскажите, господа, каким образом мне левым соединением выцепить распоряжения ?
Т.е. строка в запросе Основание = Документ.СчетОплаты.Основание
это и есть Документ.РаспоряжениеНаОплату, значение там может быть только одно.

    ТекстЗапроса =
    "//{{ЗАПРОС(Сформировать)
    |Период с ВыбНачПериода по ВыбКонПериода;
    |НомерДок = Документ.СчетОплаты.НомерДок;
    |ДатаДок = Документ.СчетОплаты.ДатаДок;
    |Основание = Документ.СчетОплаты.Основание.НомерДок, Документ.РаспоряжениеНаОплату.НомерДок;  
    |Отдел = Документ.РаспоряжениеНаОплату.Отдел;
    |Сумма = Документ.РаспоряжениеНаОплату.Сумма;
    |НДС = Документ.РаспоряжениеНаОплату.НДС;
    |Код = Документ.РаспоряжениеНаОплату.Счет76.Код;
    |Группировка Отдел упорядочить по Отдел.Наименование;
//    |Условие((Код = ""76.1"") ИЛИ (Код = ""76.2""));    
    |Группировка НомерДок;
    |"//}}ЗАПРОС

В общем в раздумьях...:(
13 YurAnt
 
19.12.13
11:01
В последнем запросе, может ли проблема заключаться в том что запрос выбирает Документ.СчетОплаты за указанный период и пытается выбирать Документ.РаспоряжениеНаОплату "ЗА ТОТ ЖЕ ПЕРИОД" ?
14 YurAnt
 
19.12.13
11:13
nope, период тут ни при чем(( специально брал диапазоны в к-е попадают одновременно и счет и основание...
15 YurAnt
 
19.12.13
11:18
неужели действительно нельзя одним запросом выбрать список документов за дату, по каждому из них в свою очередь выбрать основание и с ними уже работать ?
"запросы в цикле писать" - у меня волосы на спине от этого шевелятся(( перебор таких таблиц идет минут по 5
16 YurAnt
 
19.12.13
13:43
выгрузил список счетов в СЗ, передал СЗ во 2й запрос,
и через Условие(РасчетныйДок В СЗ) выгрузил.
Всем спасибо за участие)
Тема закрыта)
Как приятно порой пообщаться с умными людьми :)
17 Злопчинский
 
19.12.13
13:48
915) что, расставлятель галочек в снеговике - не выходит каменный цветок...? - тут надо данилой-мастером быть... ;-)