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