|
Запрос по остаткам регистра Взаиморасчеты | ☑ | ||
|---|---|---|---|---|
|
0
Odavid
23.07.10
✎
03:25
|
Есть задачка:
Есть регистр Взаиморасчеты. Сделать выборку с группировкой по контрагентам, остатку по контрагенту и документу, сделавшему остаток. Т.е. документы могут быть как приход-расход товаров (ПТУ, РТиУ), так и оплаты (платежки исходящие). Документ должен быть последним по дате проведения (самым ранним) для данного контрагента, контрагент - не иметь нулевых остатков. Остатки средств могут быть, соответственно, отрицательными (кредиторская задолженность - мы должны) и положительными(дебиторская - нам должны). Т.е. должно получиться в итоге так: Контрагент Документ Остаток Альфа ООО ПТУ 1000 Сигма ООО Платежка 950 Интересно, кто как решит? |
|||
|
1
Нуф-Нуф
23.07.10
✎
04:09
|
а ты как решишь? :)
|
|||
|
2
GROOVY
модератор
23.07.10
✎
04:09
|
Я решу быстро. И методически правильно.
|
|||
|
3
Нуф-Нуф
23.07.10
✎
04:12
|
ВЫБРАТЬ
ВзаиморасчетыСКонтрагентами.Контрагент, МАКСИМУМ(ВзаиморасчетыСКонтрагентами.Регистратор) КАК Регистратор ИЗ РегистрНакопления.ВзаиморасчетыСКонтрагентами КАК ВзаиморасчетыСКонтрагентами СГРУППИРОВАТЬ ПО ВзаиморасчетыСКонтрагентами.Контрагент |
|||
|
4
GROOVY
23.07.10
✎
04:22
|
(3) А это образец: "быстро, но не правильно". :)
|
|||
|
5
Нуф-Нуф
23.07.10
✎
04:33
|
(4) ну в консоли показало две колонки - контрагент - и последний документ по этому контрагенту :)
|
|||
|
6
1cnik2
23.07.10
✎
05:53
|
(3)
МАКСИМУМ(ВзаиморасчетыСКонтрагентами.Регистратор) - это точно не последний документ, у тебя скорее всего тест из 2 документов кстати, кто-нибудь знает точно, что именно возвращает МАКСИМУМ(), когда у нее документы в параметре? |
|||
|
7
1cnik2
23.07.10
✎
05:58
|
А вообще я бы решил так:
выбрать виртуальную таблицу остатки и обороты с нужными измерениями + регистраторы + период(регистра, так как период регистра не обязательно равен регистратору), у которых по регистратору ненулевой кон. ост. затем соединить что получилось таблицу с самой собой, так, чтобы выбрать те записи, для которых по измерениям нет записей с бОльшим периодом регистра затем внутренним соединением с остатками отсекаем те записи, конечный остаток по которым реально равен 0 |
|||
|
8
Нуф-Нуф
23.07.10
✎
06:01
|
груви а как все-таки будет правильно?
|
|||
|
9
Один С
23.07.10
✎
07:20
|
(8) нельзя писать "груви" - это аббревиатура.
|
|||
|
10
Нуф-Нуф
23.07.10
✎
07:26
|
(9) поздно
|
|||
|
11
Odavid
23.07.10
✎
09:55
|
(3) а где сумма по контрагентам?
И МАКИСМУМ(Регистратор) здесь возвратит из разных видов не последний документ, а последний по алфавиту (или по известному только 1С принципу) из разных видов документов, сделавших движения. (3),(6) вот здесь v8: Последний документ по каждому контрагенту одним запросом мы уже разобрали похожую задачу на нахождение последнего документа - в том числе, и все проблемы по МАКСИМУМ(Регистратор). (5) остаток-то где? |
|||
|
12
Odavid
23.07.10
✎
12:04
|
(6) вот здесь v8: Как оптимизировать запрос выборки партий? пришли к выводу, что ВТ по Регистраторам работает очень медленно.
И ВТ дает остатки только при использовании группировки по Контрагентам (т.е. без регистраторов и периодов), пример ниже, в противном случае - выбирает все записи: ВЫБРАТЬ ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.Контрагент, СУММА(ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.СуммаВзаиморасчетовОборот) КАК Остаток ИЗ РегистрНакопления.ВзаиморасчетыСКонтрагентами.ОстаткиИОбороты(, , Регистратор, , ) КАК ВзаиморасчетыСКонтрагентамиОстаткиИОбороты СГРУППИРОВАТЬ ПО ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.Контрагент |
|||
|
13
Odavid
23.07.10
✎
12:20
|
(6) если же вы хотите на выходе получить Периоды (для дальнейшего отбора по Максимуму) и Регистратор (по условию), то получается такая конструкция, которая неправильно выводит остатки (дает, естественно, остаток только отобранному по документу-регистратору, а не общий - ведь сворачиваем по Регистратору и Контрагенту, а не только по Контрагенту; МАКСИМУМ по Регистратору - чтобы выбрать последний документ из двух с одной датой):
ВЫБРАТЬ ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.Контрагент, ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.Регистратор КАК Регистратор, ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.Период, ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.СуммаВзаиморасчетовОборот КАК Остаток ПОМЕСТИТЬ тчОстаток ИЗ РегистрНакопления.ВзаиморасчетыСКонтрагентами.ОстаткиИОбороты(, , Регистратор, , ) КАК ВзаиморасчетыСКонтрагентамиОстаткиИОбороты ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ МАКСИМУМ(тчОстаток.Регистратор) КАК Документ, СУММА(тчОстаток.Остаток) КАК Остаток, тчОстаток.Контрагент КАК Контрагент ИЗ тчОстаток КАК тчОстаток ЛЕВОЕ СОЕДИНЕНИЕ тчОстаток КАК Остаток1 ПО тчОстаток.Контрагент = Остаток1.Контрагент И тчОстаток.Период < Остаток1.Период ГДЕ Остаток1.Контрагент ЕСТЬ NULL СГРУППИРОВАТЬ ПО тчОстаток.Контрагент Как здесь внутренним соединением с остатками отсечь записи с "нулевым" остатком, если у нас не остаток, а сумма по документу фактически выводится? В общем случае, ВТ по ОстаткамИОборотам здесь не подходит - выйгрыша никакого, т.к. надо все равно делать обычные отборы и соединения для поиска всего остального. У меня есть решение, где использовал ядро из v8: Последний документ по каждому контрагенту одним запросом, но тут со мной один товарищ заспорил с гнутием пальцев, что можно короче решить - в пару десятков строк запроса. Качественного решения запроса с учетом условий из ссылки выше (правильная выборка остатка между разными видами документов, повторяющиеся даты), впрочем, не последовало - только набор-отписка "на скорую руку" навроде (3) - даже без проверки результата. Вот мне и стало интересно, кто больше вопрос прорабатывал. |
|||
|
14
Odavid
23.07.10
✎
12:33
|
(2) а можно взглянуть? На быстрое и методически верное?
|
|||
|
15
Odavid
23.07.10
✎
15:08
|
Почему нет никаких вариантов? Задания слишком сложные, что ли, что много времени отнимают? Неужели никто не решал уже подобное? Не верю.
Ни здесь, ни в теме "Оптимизация запроса" - никаких вариантов, кроме моих... |
|||
|
16
Defender aka LINN
23.07.10
✎
15:11
|
Шо, опять? ©
|
|||
|
17
milan
23.07.10
✎
15:20
|
может что-то не понял, почему не соединить таблицу остатков в разрезе контрагент-договор с максимумом по документу в разрезе контрагент-договор из таблицы регистра ???
|
|||
|
18
Михаил Козлов
23.07.10
✎
16:01
|
Если вести взаиморасчеты по документам расчетов, то тогда из соответствующего регистра максимальный ДокументРасчетов с соответствующим знаком остатка.
|
|||
|
19
Odavid
23.07.10
✎
16:02
|
(16) снова, Линн, снова :)
я-то давно все понял, но есть товарищи, которые все никак не угомонятся, увидев 1С во второй раз. (17) давайте вариант, посмотрим. А то код пишу только я. |
|||
|
20
Odavid
23.07.10
✎
16:04
|
(18) больше условий нет. Есть ВзаиморасчетыСКонтрагентами.
И вариант "ВТ с регистратором" уже рассмотрели. Вы пример кода можеет привести? |
|||
|
21
Odavid
23.07.10
✎
16:06
|
(0) меня (да и остальных, надеюсь, тоже) интересуют в первую очередь уже найденные оптимальные варианты. Если такие есть, конечно.
|
|||
|
22
FIXXXL
23.07.10
✎
16:20
|
для базы с небольшим количеством юзеров катит такой вариант:
ВЫБРАТЬ ВложенныйЗапрос.Контрагент, ВложенныйЗапрос.ДоговорКонтрагента, ВложенныйЗапрос.Регистратор, ВложенныйЗапрос.СуммаВзаиморасчетовОстаток ИЗ (ВЫБРАТЬ Доки.Контрагент КАК Контрагент, Доки.ДоговорКонтрагента КАК ДоговорКонтрагента, Доки.Регистратор КАК Регистратор, Остатки.СуммаВзаиморасчетовОстаток КАК СуммаВзаиморасчетовОстаток ИЗ (ВЫБРАТЬ ВзаиморасчетыСКонтрагентамиОстатки.Контрагент КАК Контрагент, ВзаиморасчетыСКонтрагентамиОстатки.ДоговорКонтрагента КАК ДоговорКонтрагента, ВзаиморасчетыСКонтрагентамиОстатки.СуммаВзаиморасчетовОстаток КАК СуммаВзаиморасчетовОстаток ИЗ РегистрНакопления.ВзаиморасчетыСКонтрагентами.Остатки КАК ВзаиморасчетыСКонтрагентамиОстатки) КАК Остатки ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ ВзаиморасчетыСКонтрагентами.Контрагент КАК Контрагент, ВзаиморасчетыСКонтрагентами.ДоговорКонтрагента КАК ДоговорКонтрагента, ВзаиморасчетыСКонтрагентами.Регистратор КАК Регистратор ИЗ РегистрНакопления.ВзаиморасчетыСКонтрагентами КАК ВзаиморасчетыСКонтрагентами ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ ВзаиморасчетыСКонтрагентами.Контрагент КАК Контрагент, ВзаиморасчетыСКонтрагентами.ДоговорКонтрагента КАК ДоговорКонтрагента, МАКСИМУМ(ВзаиморасчетыСКонтрагентами.Период) КАК Период ИЗ РегистрНакопления.ВзаиморасчетыСКонтрагентами КАК ВзаиморасчетыСКонтрагентами СГРУППИРОВАТЬ ПО ВзаиморасчетыСКонтрагентами.Контрагент, ВзаиморасчетыСКонтрагентами.ДоговорКонтрагента) КАК ФильтрДата ПО ВзаиморасчетыСКонтрагентами.Период = ФильтрДата.Период И ВзаиморасчетыСКонтрагентами.Контрагент = ФильтрДата.Контрагент И ВзаиморасчетыСКонтрагентами.ДоговорКонтрагента = ФильтрДата.ДоговорКонтрагента) КАК Доки ПО Остатки.Контрагент = Доки.Контрагент И Остатки.ДоговорКонтрагента = Доки.ДоговорКонтрагента) КАК ВложенныйЗапрос СГРУППИРОВАТЬ ПО ВложенныйЗапрос.Контрагент, ВложенныйЗапрос.ДоговорКонтрагента, ВложенныйЗапрос.Регистратор, ВложенныйЗапрос.СуммаВзаиморасчетовОстаток УПОРЯДОЧИТЬ ПО ВложенныйЗапрос.Контрагент.Наименование |
|||
|
23
Odavid
23.07.10
✎
16:32
|
(22) Отлично! Только на пару десятков строк "пальцегнутия" упомянутого в (13) товарища точно не тянет :)
Сейчас посмотрю ваш вариант... |
|||
|
24
Odavid
23.07.10
✎
17:20
|
(22) работает, только есть недочет один - документы с одной датой выдает все, не выбирая.
В принципе, у меня такой же, только через временную таблицу и ОстаткиИОбороты. Добавил к вашему запросу "защищаемый" :) Defender aka LINN "МАКСИМУМ", в результате еще три строчки добавились: ВЫБРАТЬ ВложенныйЗапрос.Контрагент, ВложенныйЗапрос.ДоговорКонтрагента, ВложенныйЗапрос.Регистратор, ВложенныйЗапрос.СуммаВзаиморасчетовОстаток ИЗ (ВЫБРАТЬ Доки.Контрагент КАК Контрагент, Доки.ДоговорКонтрагента КАК ДоговорКонтрагента, Доки.Регистратор КАК Регистратор, Остатки.СуммаВзаиморасчетовОстаток КАК СуммаВзаиморасчетовОстаток ИЗ (ВЫБРАТЬ ВзаиморасчетыСКонтрагентамиОстатки.Контрагент КАК Контрагент, ВзаиморасчетыСКонтрагентамиОстатки.ДоговорКонтрагента КАК ДоговорКонтрагента, ВзаиморасчетыСКонтрагентамиОстатки.СуммаВзаиморасчетовОстаток КАК СуммаВзаиморасчетовОстаток ИЗ РегистрНакопления.ВзаиморасчетыСКонтрагентами.Остатки КАК ВзаиморасчетыСКонтрагентамиОстатки ) КАК Остатки ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ ВзаиморасчетыСКонтрагентами.Контрагент КАК Контрагент, ВзаиморасчетыСКонтрагентами.ДоговорКонтрагента КАК ДоговорКонтрагента, МАКСИМУМ(ВзаиморасчетыСКонтрагентами.Регистратор) КАК Регистратор ИЗ РегистрНакопления.ВзаиморасчетыСКонтрагентами КАК ВзаиморасчетыСКонтрагентами ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ ВзаиморасчетыСКонтрагентами.Контрагент КАК Контрагент, ВзаиморасчетыСКонтрагентами.ДоговорКонтрагента КАК ДоговорКонтрагента, МАКСИМУМ(ВзаиморасчетыСКонтрагентами.Период) КАК Период ИЗ РегистрНакопления.ВзаиморасчетыСКонтрагентами КАК ВзаиморасчетыСКонтрагентами СГРУППИРОВАТЬ ПО ВзаиморасчетыСКонтрагентами.Контрагент, ВзаиморасчетыСКонтрагентами.ДоговорКонтрагента ) КАК ФильтрДата ПО ВзаиморасчетыСКонтрагентами.Период = ФильтрДата.Период И ВзаиморасчетыСКонтрагентами.Контрагент = ФильтрДата.Контрагент И ВзаиморасчетыСКонтрагентами.ДоговорКонтрагента = ФильтрДата.ДоговорКонтрагента СГРУППИРОВАТЬ ПО ВзаиморасчетыСКонтрагентами.Контрагент, ВзаиморасчетыСКонтрагентами.ДоговорКонтрагента ) КАК Доки ПО Остатки.Контрагент = Доки.Контрагент И Остатки.ДоговорКонтрагента = Доки.ДоговорКонтрагента ) КАК ВложенныйЗапрос СГРУППИРОВАТЬ ПО ВложенныйЗапрос.Контрагент, ВложенныйЗапрос.ДоговорКонтрагента, ВложенныйЗапрос.Регистратор, ВложенныйЗапрос.СуммаВзаиморасчетовОстаток УПОРЯДОЧИТЬ ПО ВложенныйЗапрос.Контрагент.Наименование |
|||
|
25
FIXXXL
23.07.10
✎
17:29
|
(24) если будут несколько доков в секунду, я бы оставил как в (22), наглядней получится, сразу виден косяк. а то может получится картина: Док1 делает долг на 100 и Док2 делает на 125, в результате долг в 225 "ляжет" на один, а это уже не так прозрачно выглядит.
|
|||
|
26
Odavid
23.07.10
✎
17:29
|
Вот мой вариант без неопределенных повторяющихся "МАКСИМУМОМ"'ов и через ВрТ:
//////////////////////////////////////////////////////////////////////////////// //Отбор последнего по дате документа - выбирается последний вне зависимости от того, //какой вид документа - он должен быть только последний по времени (универсальный вариант) ВЫБРАТЬ ВзаиморасчетыСКонтрагентами.Регистратор, ВзаиморасчетыСКонтрагентами.Контрагент КАК Контрагент ПОМЕСТИТЬ тчДокументыПоследниеПоДате ИЗ РегистрНакопления.ВзаиморасчетыСКонтрагентами КАК ВзаиморасчетыСКонтрагентами ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ВзаиморасчетыСКонтрагентами КАК ВзаиморасчетыСКонтрагентами1 ПО ВзаиморасчетыСКонтрагентами.Контрагент = ВзаиморасчетыСКонтрагентами1.Контрагент И ВзаиморасчетыСКонтрагентами.МоментВремени < ВзаиморасчетыСКонтрагентами1.МоментВремени ГДЕ ВзаиморасчетыСКонтрагентами1.Регистратор.Контрагент ЕСТЬ NULL ; //////////////////////////////////////////////////////////////////////////////// //Расчет оборота по документам контрагентов, и отсев тех, у кого остаток = 0, через ВТ "ОстаткиИОбороты" ВЫБРАТЬ РАЗРЕШЕННЫЕ Оборот.Контрагент КАК Контрагент, Оборот.Регистратор КАК Документ, Оборот.Остаток ИЗ (ВЫБРАТЬ Остатки.Контрагент КАК Контрагент, Документы.Регистратор, Остатки.СуммаВзаиморасчетовОборот КАК Остаток ИЗ РегистрНакопления.ВзаиморасчетыСКонтрагентами.ОстаткиИОбороты КАК Остатки ВНУТРЕННЕЕ СОЕДИНЕНИЕ тчДокументыПоследниеПоДате КАК Документы ПО Остатки.Контрагент = Документы.Контрагент ) КАК Оборот |
|||
|
27
Odavid
23.07.10
✎
17:41
|
(25) Так так и надо - чтобы конечный остаток лег на самый последний документ. Иначе смысл условия "должен быть последний документ" вообще размазывается. Здесь v8: Последний документ по каждому контрагенту одним запросом уже мы это обсуждали.
|
|||
|
28
Odavid
23.07.10
✎
17:52
|
(26) - если б не подсказка про МоментВремени, был бы еще длиннее из-за "МАКСИМУМОВ" и СГРУППИРОВАТЬ.
Но в 20 строк "пальцегнутия" все равно не укладывается. Хотя, если убрать все переносы и пробелы - то любой запрос можно и в одну строчку написать :) По производительности, кстати, (22) и (26) - одинаковы, а использование ВТ как средство "повышения быстроты" в данном случае, мягко говоря, сомнительно (о чем я писал выше) - разве что остатки дает меньшим кодом. А если товарищ-пальцегнут не знает, что быстродействие в 1С зависит не от количества написанного кода... Что ж, увы, нынешней стране нужны кодеры, а не программисты. |
|||
|
29
Odavid
27.07.10
✎
10:11
|
А если изменить условие - только по определенным документам? Т.е. не по всему регистру, а только по определенным - пусть будут Платежка и Поступление.
У меня получился вариант в два раза длиннее предыдущего - добавилась выборка по определенным видам документов и вычисление остатка между ними. Может, у кого есть решение попроще? |
|||
|
30
FIXXXL
27.07.10
✎
13:01
|
(29) объединение на каждый вид дока, отбор через ССЫЛКА
|
|||
|
31
Odavid
27.07.10
✎
13:54
|
А как из объединения вы найдете остаток? :)
Или, не обижайтесь, вы предлагаете воспользоваться новой функций 1С - "ОБЪЕДИНИТЬ с вычитанием"? |
|||
|
32
Odavid
27.07.10
✎
13:56
|
+ (31) нет, можно, конечно, умножать на (-1), итоги, еще прилепить что-нибудь....
Интересно взглянуть все-таки на ваш код :) |
|||
|
33
Odavid
29.07.10
✎
01:40
|
(30) - раз уж вы не предоставили свой код - набросал быстренько пример:
//Выбираются последние по дате (или введению в базу) документы для каждого контрагента; считаются остатки //по каждому контрагенту (сумма сколько поступило, сумма - сколько оплатили, по каждому контрагенту соответсвенно); //результат - остатки по Контрагентам с указанием последнего проведенного документа //Основное условие - одним запросом! ВЫБРАТЬ Взаиморасчеты.Контрагент, СУММА(Взаиморасчеты.СуммаВзаиморасчетов) КАК Остаток ПОМЕСТИТЬ тчОборот ИЗ (ВЫБРАТЬ ВзаиморасчетыСКонтрагентами.Контрагент, СУММА(ВзаиморасчетыСКонтрагентами.СуммаВзаиморасчетов) КАК СуммаВзаиморасчетов ИЗ РегистрНакопления.ВзаиморасчетыСКонтрагентами КАК ВзаиморасчетыСКонтрагентами ГДЕ ВзаиморасчетыСКонтрагентами.Регистратор ССЫЛКА Документ.ПоступлениеТоваровУслуг СГРУППИРОВАТЬ ПО ВзаиморасчетыСКонтрагентами.Контрагент ОБЪЕДИНИТЬ ВЫБРАТЬ ВзаиморасчетыСКонтрагентами.Контрагент, СУММА(ВзаиморасчетыСКонтрагентами.СуммаВзаиморасчетов) * (-1) КАК СуммаВзаиморасчетов ИЗ РегистрНакопления.ВзаиморасчетыСКонтрагентами КАК ВзаиморасчетыСКонтрагентами ГДЕ ВзаиморасчетыСКонтрагентами.Регистратор ССЫЛКА Документ.ПлатежноеПоручениеИсходящее СГРУППИРОВАТЬ ПО ВзаиморасчетыСКонтрагентами.Контрагент ) КАК Взаиморасчеты //Сворачиваем суммы по контрагентам и находим остаток СГРУППИРОВАТЬ ПО Взаиморасчеты.Контрагент ; //////////////////////////////////////////////////////////////////////////////// //Отбор последнего по дате документа - выбирается последний вне зависимости от того, //какой вид документа - он должен быть только последний по времени (универсальный вариант) ВЫБРАТЬ ВзаиморасчетыСКонтрагентами.Регистратор, ВзаиморасчетыСКонтрагентами.Контрагент КАК Контрагент ПОМЕСТИТЬ ФильтрДата ИЗ РегистрНакопления.ВзаиморасчетыСКонтрагентами КАК ВзаиморасчетыСКонтрагентами ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ВзаиморасчетыСКонтрагентами КАК ВзаиморасчетыСКонтрагентами1 ПО ВзаиморасчетыСКонтрагентами.Контрагент = ВзаиморасчетыСКонтрагентами1.Контрагент И ВзаиморасчетыСКонтрагентами.МоментВремени < ВзаиморасчетыСКонтрагентами1.МоментВремени ГДЕ ВзаиморасчетыСКонтрагентами1.Регистратор.Контрагент ЕСТЬ NULL ; //////////////////////////////////////////////////////////////////////////////// //Расчет оборота по документам контрагентов, и отсев (внешний отбор) тех, у кого остаток = 0 ВЫБРАТЬ РАЗРЕШЕННЫЕ Оборот.Контрагент КАК Контрагент, Фильтр.Регистратор, Оборот.Остаток ИЗ тчОборот КАК Оборот ВНУТРЕННЕЕ СОЕДИНЕНИЕ ФильтрДата КАК Фильтр ПО Оборот.Контрагент = Фильтр.Контрагент И Оборот.Остаток <> 0 УПОРЯДОЧИТЬ ПО Контрагент Скорость от моего - за вычетом одного СОЕДИНЕНИЯ, т.е. практически незаметна разница между ними, зато заметно на большой базе время общий отбор и в том, и в дургом случае. Или вы другой предложите? Может, кто-то предложит более быстрый вариант по двум документам? |
|||
|
34
Odavid
29.07.10
✎
21:46
|
Да, активности нет...
|
|||
|
35
Morphius
29.07.10
✎
21:52
|
Велосипед изобретаете...(0)Кури УТ 10.2, Отчет "Дебиторская задолженость по интервалам". Там запрос, который тебе нужен
|
|||
|
36
Odavid
29.07.10
✎
21:57
|
(35) т.е. мне нужно еще где-то искать УТ 10.2? Спасибо, что написали, однако - было бы лучше, если б был сам запрос. А совсем хорошо - Вами придуманный :)
Но сойдет и из УТ 10.2. Правда, наищешся его еще... Может, все-таки - приведете его здесь? |
|||
|
37
Morphius
29.07.10
✎
22:15
|
(36)Любой каприз;) Запрос труднопонятен,но работает 100% верно. Для скорости можно переделать под виртуальные таблицы
ВЫБРАТЬ Остатки.ДоговорКонтрагента КАК ДоговорКонтрагента, Остатки.Сделка КАК Сделка, ОсновнаяТаблицаРегистра.Период КАК РасчетнаяДата, ОсновнаяТаблицаРегистра.Регистратор КАК РасчетныйДокумент, ВЫБОР КОГДА СУММА(ТаблицаПоследующихПриходов.СуммаВзаиморасчетов * ВЫБОР КОГДА ТаблицаПоследующихПриходов.ВидДвижения = &ВидДвиженияПриход И ТаблицаПоследующихПриходов.СуммаВзаиморасчетов > 0 И ТаблицаПоследующихПриходов.Регистратор <> ОсновнаяТаблицаРегистра.Регистратор ТОГДА -1 КОГДА ТаблицаПоследующихПриходов.ВидДвижения <> &ВидДвиженияПриход И ТаблицаПоследующихПриходов.СуммаВзаиморасчетов < 0 И ТаблицаПоследующихПриходов.Регистратор <> ОсновнаяТаблицаРегистра.Регистратор ТОГДА 1 ИНАЧЕ 0 КОНЕЦ) < Остатки.СуммаВзаиморасчетовОстаток ТОГДА 0 ИНАЧЕ ВЫБОР КОГДА СУММА(ТаблицаПоследующихПриходов.СуммаВзаиморасчетов * ВЫБОР КОГДА ТаблицаПоследующихПриходов.ВидДвижения = &ВидДвиженияПриход И ТаблицаПоследующихПриходов.СуммаВзаиморасчетов > 0 ТОГДА -1 КОГДА ТаблицаПоследующихПриходов.ВидДвижения <> &ВидДвиженияПриход И ТаблицаПоследующихПриходов.СуммаВзаиморасчетов < 0 ТОГДА 1 ИНАЧЕ 0 КОНЕЦ) < Остатки.СуммаВзаиморасчетовОстаток ТОГДА СУММА(ТаблицаПоследующихПриходов.СуммаВзаиморасчетов * ВЫБОР КОГДА ТаблицаПоследующихПриходов.ВидДвижения = &ВидДвиженияПриход И ТаблицаПоследующихПриходов.СуммаВзаиморасчетов > 0 И ТаблицаПоследующихПриходов.Регистратор <> ОсновнаяТаблицаРегистра.Регистратор ТОГДА -1 КОГДА ТаблицаПоследующихПриходов.ВидДвижения <> &ВидДвиженияПриход И ТаблицаПоследующихПриходов.СуммаВзаиморасчетов < 0 И ТаблицаПоследующихПриходов.Регистратор <> ОсновнаяТаблицаРегистра.Регистратор ТОГДА 1 ИНАЧЕ 0 КОНЕЦ) + СУММА(ВЫБОР КОГДА ОсновнаяТаблицаРегистра.Регистратор = ТаблицаПоследующихПриходов.Регистратор ТОГДА Остатки.СуммаВзаиморасчетовОстаток ИНАЧЕ 0 КОНЕЦ) ИНАЧЕ СУММА(ОсновнаяТаблицаРегистра.СуммаВзаиморасчетов * ВЫБОР КОГДА ОсновнаяТаблицаРегистра.ВидДвижения = &ВидДвиженияПриход И ОсновнаяТаблицаРегистра.СуммаВзаиморасчетов > 0 И ОсновнаяТаблицаРегистра.Регистратор = ТаблицаПоследующихПриходов.Регистратор ТОГДА -1 КОГДА ОсновнаяТаблицаРегистра.ВидДвижения <> &ВидДвиженияПриход И ОсновнаяТаблицаРегистра.СуммаВзаиморасчетов < 0 И ОсновнаяТаблицаРегистра.Регистратор = ТаблицаПоследующихПриходов.Регистратор ТОГДА 1 ИНАЧЕ 0 КОНЕЦ) КОНЕЦ КОНЕЦ КАК СуммаОстатокВВалютеВзаиморасчетов, Остатки.СуммаВзаиморасчетовОстаток КАК СуммаВзаиморасчетовОстаток ИЗ РегистрНакопления.ВзаиморасчетыПоСделкам.Остатки(&ДатаОтчета, {(ДоговорКонтрагента.Владелец).* КАК ДоговорКонтрагентаВладелец, (ДоговорКонтрагента).* КАК ДоговорКонтрагента, (Сделка).* КАК Сделка}) КАК Остатки ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ ВзаиморасчетыПоСделкам.ДоговорКонтрагента КАК ДоговорКонтрагента, ВзаиморасчетыПоСделкам.Сделка КАК Сделка, ВзаиморасчетыПоСделкам.Период КАК Период, ВзаиморасчетыПоСделкам.Регистратор КАК Регистратор, ВзаиморасчетыПоСделкам.ВидДвижения КАК ВидДвижения, СУММА(ВзаиморасчетыПоСделкам.СуммаВзаиморасчетов) КАК СуммаВзаиморасчетов ИЗ РегистрНакопления.ВзаиморасчетыПоСделкам КАК ВзаиморасчетыПоСделкам СГРУППИРОВАТЬ ПО ВзаиморасчетыПоСделкам.ДоговорКонтрагента, ВзаиморасчетыПоСделкам.Сделка, ВзаиморасчетыПоСделкам.Период, ВзаиморасчетыПоСделкам.Регистратор, ВзаиморасчетыПоСделкам.ВидДвижения) КАК ОсновнаяТаблицаРегистра ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ ВзаиморасчетыПоСделкам.ДоговорКонтрагента КАК ДоговорКонтрагента, ВзаиморасчетыПоСделкам.Сделка КАК Сделка, ВзаиморасчетыПоСделкам.Период КАК Период, ВзаиморасчетыПоСделкам.Регистратор КАК Регистратор, ВзаиморасчетыПоСделкам.ВидДвижения КАК ВидДвижения, СУММА(ВзаиморасчетыПоСделкам.СуммаВзаиморасчетов) КАК СуммаВзаиморасчетов ИЗ РегистрНакопления.ВзаиморасчетыПоСделкам КАК ВзаиморасчетыПоСделкам СГРУППИРОВАТЬ ПО ВзаиморасчетыПоСделкам.ДоговорКонтрагента, ВзаиморасчетыПоСделкам.Сделка, ВзаиморасчетыПоСделкам.Период, ВзаиморасчетыПоСделкам.Регистратор, ВзаиморасчетыПоСделкам.ВидДвижения) КАК ТаблицаПоследующихПриходов ПО (ТаблицаПоследующихПриходов.ДоговорКонтрагента = ОсновнаяТаблицаРегистра.ДоговорКонтрагента) И (ТаблицаПоследующихПриходов.Сделка = ОсновнаяТаблицаРегистра.Сделка) И (ТаблицаПоследующихПриходов.Период > ОсновнаяТаблицаРегистра.Период ИЛИ ТаблицаПоследующихПриходов.Период = ОсновнаяТаблицаРегистра.Период И ТаблицаПоследующихПриходов.Регистратор >= ОсновнаяТаблицаРегистра.Регистратор) И (ТаблицаПоследующихПриходов.Период <= &ДатаОтчета) И (ТаблицаПоследующихПриходов.ВидДвижения = &ВидДвиженияПриход И ТаблицаПоследующихПриходов.СуммаВзаиморасчетов > 0 ИЛИ ТаблицаПоследующихПриходов.ВидДвижения <> &ВидДвиженияПриход И ТаблицаПоследующихПриходов.СуммаВзаиморасчетов < 0) ПО Остатки.ДоговорКонтрагента = ОсновнаяТаблицаРегистра.ДоговорКонтрагента И Остатки.Сделка = ОсновнаяТаблицаРегистра.Сделка И (ОсновнаяТаблицаРегистра.Период <= &ДатаОтчета) И (ОсновнаяТаблицаРегистра.ВидДвижения = &ВидДвиженияПриход И ОсновнаяТаблицаРегистра.СуммаВзаиморасчетов > 0 ИЛИ ОсновнаяТаблицаРегистра.ВидДвижения <> &ВидДвиженияПриход И ОсновнаяТаблицаРегистра.СуммаВзаиморасчетов < 0) ГДЕ Остатки.СуммаВзаиморасчетовОстаток < 0 СГРУППИРОВАТЬ ПО Остатки.ДоговорКонтрагента, Остатки.Сделка, ОсновнаяТаблицаРегистра.Период, ОсновнаяТаблицаРегистра.Регистратор, Остатки.СуммаВзаиморасчетовОстаток |
|||
|
38
Morphius
29.07.10
✎
22:18
|
Я это делал примерно так:
ВЫБРАТЬ ВложенныйЗапрос.РасчетнаяДата, ВложенныйЗапрос.СуммаОстатокВВалютеВзаиморасчетов, ВложенныйЗапрос.ДоговорКонтрагента.ВидВзаиморасчетов.Наименование КАК ДоговорКонтрагентаНаименование, ВложенныйЗапрос.ДоговорКонтрагента.Владелец.Код КАК КонтрагентКод, ВложенныйЗапрос.ДоговорКонтрагента.Организация.Код КАК ОрганизацияКод, ВложенныйЗапрос.РасчетныйДокумент.Номер, ВложенныйЗапрос.РасчетныйДокумент.Дата, ВложенныйЗапрос.Контрагент.Наименование, ВложенныйЗапрос.Сделка.Ответственный.Наименование КАК Агент, ВложенныйЗапрос.Сделка.Ответственный.Код КАК АгентКод ИЗ (ВЫБРАТЬ Остатки.ДоговорКонтрагента КАК ДоговорКонтрагента, Остатки.Сделка КАК Сделка, ОсновнаяТаблицаРегистра.Период КАК РасчетнаяДата, ОсновнаяТаблицаРегистра.Регистратор КАК РасчетныйДокумент, ВЫБОР КОГДА СУММА(ТаблицаПоследующихПриходов.СуммаВзаиморасчетов * ВЫБОР КОГДА ТаблицаПоследующихПриходов.ВидДвижения = &ВидДвиженияПриход И ТаблицаПоследующихПриходов.СуммаВзаиморасчетов > 0 И ТаблицаПоследующихПриходов.Регистратор <> ОсновнаяТаблицаРегистра.Регистратор ТОГДА 1 КОГДА ТаблицаПоследующихПриходов.ВидДвижения <> &ВидДвиженияПриход И ТаблицаПоследующихПриходов.СуммаВзаиморасчетов < 0 И ТаблицаПоследующихПриходов.Регистратор <> ОсновнаяТаблицаРегистра.Регистратор ТОГДА -1 ИНАЧЕ 0 КОНЕЦ) > Остатки.СуммаВзаиморасчетовОстаток ТОГДА 0 ИНАЧЕ ВЫБОР КОГДА СУММА(ТаблицаПоследующихПриходов.СуммаВзаиморасчетов * ВЫБОР КОГДА ТаблицаПоследующихПриходов.ВидДвижения = &ВидДвиженияПриход И ТаблицаПоследующихПриходов.СуммаВзаиморасчетов > 0 ТОГДА 1 КОГДА ТаблицаПоследующихПриходов.ВидДвижения <> &ВидДвиженияПриход И ТаблицаПоследующихПриходов.СуммаВзаиморасчетов < 0 ТОГДА -1 ИНАЧЕ 0 КОНЕЦ) > Остатки.СуммаВзаиморасчетовОстаток ТОГДА СУММА(ВЫБОР КОГДА ОсновнаяТаблицаРегистра.Регистратор = ТаблицаПоследующихПриходов.Регистратор ТОГДА Остатки.СуммаВзаиморасчетовОстаток ИНАЧЕ 0 КОНЕЦ) - СУММА(ТаблицаПоследующихПриходов.СуммаВзаиморасчетов * ВЫБОР КОГДА ТаблицаПоследующихПриходов.ВидДвижения = &ВидДвиженияПриход И ТаблицаПоследующихПриходов.СуммаВзаиморасчетов > 0 И ОсновнаяТаблицаРегистра.Регистратор <> ТаблицаПоследующихПриходов.Регистратор ТОГДА 1 КОГДА ТаблицаПоследующихПриходов.ВидДвижения <> &ВидДвиженияПриход И ТаблицаПоследующихПриходов.СуммаВзаиморасчетов < 0 И ОсновнаяТаблицаРегистра.Регистратор <> ТаблицаПоследующихПриходов.Регистратор ТОГДА -1 ИНАЧЕ 0 КОНЕЦ) ИНАЧЕ СУММА(ОсновнаяТаблицаРегистра.СуммаВзаиморасчетов * ВЫБОР КОГДА ОсновнаяТаблицаРегистра.ВидДвижения = &ВидДвиженияПриход И ОсновнаяТаблицаРегистра.СуммаВзаиморасчетов > 0 И ОсновнаяТаблицаРегистра.Регистратор = ТаблицаПоследующихПриходов.Регистратор ТОГДА 1 КОГДА ОсновнаяТаблицаРегистра.ВидДвижения <> &ВидДвиженияПриход И ОсновнаяТаблицаРегистра.СуммаВзаиморасчетов < 0 И ОсновнаяТаблицаРегистра.Регистратор = ТаблицаПоследующихПриходов.Регистратор ТОГДА -1 ИНАЧЕ 0 КОНЕЦ) КОНЕЦ КОНЕЦ КАК СуммаОстатокВВалютеВзаиморасчетов, Остатки.ДоговорКонтрагента.Владелец КАК Контрагент ИЗ РегистрНакопления.ВзаиморасчетыСКонтрагентами.Остатки( &ДатаОтчета, ДоговорКонтрагента.Владелец В (&СпКА) И ДоговорКонтрагента.ВидДоговора = ЗНАЧЕНИЕ(Перечисление.ВидыДоговоровКонтрагентов.СПокупателем) И ДоговорКонтрагента.Владелец В ИЕРАРХИИ (&СпГрупп) И (НЕ ДоговорКонтрагента.ВидВзаиморасчетов.Наименование ЕСТЬ NULL ) И (НЕ ДоговорКонтрагента.ВидВзаиморасчетов.Код = "00008") И (НЕ ДоговорКонтрагента.ВидВзаиморасчетов.Код = "00007") И ВЫБОР КОГДА &КодТест ЕСТЬ NULL ТОГДА 1 = 1 ИНАЧЕ ДоговорКонтрагента.Владелец.Код = &КодТест КОНЕЦ {(ДоговорКонтрагента.Владелец).* КАК ДоговорКонтрагентаВладелец, (ДоговорКонтрагента).* КАК ДоговорКонтрагента, (Сделка).* КАК Сделка}) КАК Остатки ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ ВзаиморасчетыСКонтрагентамиОбороты.ДоговорКонтрагента КАК ДоговорКонтрагента, ВзаиморасчетыСКонтрагентамиОбороты.Сделка КАК Сделка, ВзаиморасчетыСКонтрагентамиОбороты.Период КАК Период, ВзаиморасчетыСКонтрагентамиОбороты.Регистратор КАК Регистратор, ВЫБОР КОГДА ЕСТЬNULL(ВзаиморасчетыСКонтрагентамиОбороты.СуммаВзаиморасчетовПриход, 0) <> 0 ТОГДА &ВидДвиженияПриход ИНАЧЕ &ВидДвиженияРасход КОНЕЦ КАК ВидДвижения, СУММА(ЕСТЬNULL(ВзаиморасчетыСКонтрагентамиОбороты.СуммаВзаиморасчетовПриход, 0) + ЕСТЬNULL(ВзаиморасчетыСКонтрагентамиОбороты.СуммаВзаиморасчетовРасход, 0)) КАК СуммаВзаиморасчетов ИЗ РегистрНакопления.ВзаиморасчетыСКонтрагентами.Обороты( , , Запись, ДоговорКонтрагента.Владелец В (&СпКА) И ДоговорКонтрагента.ВидДоговора = ЗНАЧЕНИЕ(Перечисление.ВидыДоговоровКонтрагентов.СПокупателем)) КАК ВзаиморасчетыСКонтрагентамиОбороты СГРУППИРОВАТЬ ПО ВзаиморасчетыСКонтрагентамиОбороты.ДоговорКонтрагента, ВзаиморасчетыСКонтрагентамиОбороты.Сделка, ВзаиморасчетыСКонтрагентамиОбороты.Период, ВзаиморасчетыСКонтрагентамиОбороты.Регистратор, ВЫБОР КОГДА ЕСТЬNULL(ВзаиморасчетыСКонтрагентамиОбороты.СуммаВзаиморасчетовПриход, 0) <> 0 ТОГДА &ВидДвиженияПриход ИНАЧЕ &ВидДвиженияРасход КОНЕЦ) КАК ОсновнаяТаблицаРегистра ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ ВзаиморасчетыСКонтрагентамиОбороты.ДоговорКонтрагента КАК ДоговорКонтрагента, ВзаиморасчетыСКонтрагентамиОбороты.Сделка КАК Сделка, ВзаиморасчетыСКонтрагентамиОбороты.Период КАК Период, ВзаиморасчетыСКонтрагентамиОбороты.Регистратор КАК Регистратор, ВЫБОР КОГДА ЕСТЬNULL(ВзаиморасчетыСКонтрагентамиОбороты.СуммаВзаиморасчетовПриход, 0) <> 0 ТОГДА &ВидДвиженияПриход ИНАЧЕ &ВидДвиженияРасход КОНЕЦ КАК ВидДвижения, ЕСТЬNULL(ВзаиморасчетыСКонтрагентамиОбороты.СуммаВзаиморасчетовПриход, 0) + ЕСТЬNULL(ВзаиморасчетыСКонтрагентамиОбороты.СуммаВзаиморасчетовРасход, 0) КАК СуммаВзаиморасчетов ИЗ РегистрНакопления.ВзаиморасчетыСКонтрагентами.Обороты( , , Запись, ДоговорКонтрагента.Владелец В (&СпКА) И ДоговорКонтрагента.ВидДоговора = ЗНАЧЕНИЕ(Перечисление.ВидыДоговоровКонтрагентов.СПокупателем)) КАК ВзаиморасчетыСКонтрагентамиОбороты СГРУППИРОВАТЬ ПО ВзаиморасчетыСКонтрагентамиОбороты.ДоговорКонтрагента, ВзаиморасчетыСКонтрагентамиОбороты.Сделка, ВзаиморасчетыСКонтрагентамиОбороты.Период, ВзаиморасчетыСКонтрагентамиОбороты.Регистратор, ВЫБОР КОГДА ЕСТЬNULL(ВзаиморасчетыСКонтрагентамиОбороты.СуммаВзаиморасчетовПриход, 0) <> 0 ТОГДА &ВидДвиженияПриход ИНАЧЕ &ВидДвиженияРасход КОНЕЦ, ЕСТЬNULL(ВзаиморасчетыСКонтрагентамиОбороты.СуммаВзаиморасчетовПриход, 0) + ЕСТЬNULL(ВзаиморасчетыСКонтрагентамиОбороты.СуммаВзаиморасчетовРасход, 0)) КАК ТаблицаПоследующихПриходов ПО (ТаблицаПоследующихПриходов.ДоговорКонтрагента = ОсновнаяТаблицаРегистра.ДоговорКонтрагента) И (ТаблицаПоследующихПриходов.Сделка = ОсновнаяТаблицаРегистра.Сделка) И (ТаблицаПоследующихПриходов.Период > ОсновнаяТаблицаРегистра.Период ИЛИ ТаблицаПоследующихПриходов.Период = ОсновнаяТаблицаРегистра.Период И ТаблицаПоследующихПриходов.Регистратор >= ОсновнаяТаблицаРегистра.Регистратор) И (ТаблицаПоследующихПриходов.Период <= &ДатаОтчета) И (ТаблицаПоследующихПриходов.ВидДвижения = &ВидДвиженияПриход И ТаблицаПоследующихПриходов.СуммаВзаиморасчетов > 0 ИЛИ ТаблицаПоследующихПриходов.ВидДвижения <> &ВидДвиженияПриход И ТаблицаПоследующихПриходов.СуммаВзаиморасчетов < 0) ПО Остатки.ДоговорКонтрагента = ОсновнаяТаблицаРегистра.ДоговорКонтрагента И Остатки.Сделка = ОсновнаяТаблицаРегистра.Сделка И (ОсновнаяТаблицаРегистра.Период <= &ДатаОтчета) И (ОсновнаяТаблицаРегистра.ВидДвижения = &ВидДвиженияПриход И ОсновнаяТаблицаРегистра.СуммаВзаиморасчетов > 0 ИЛИ ОсновнаяТаблицаРегистра.ВидДвижения <> &ВидДвиженияПриход И ОсновнаяТаблицаРегистра.СуммаВзаиморасчетов < 0) ГДЕ Остатки.СуммаВзаиморасчетовОстаток > 0 СГРУППИРОВАТЬ ПО Остатки.ДоговорКонтрагента, Остатки.Сделка, ОсновнаяТаблицаРегистра.Период, ОсновнаяТаблицаРегистра.Регистратор, Остатки.СуммаВзаиморасчетовОстаток, Остатки.ДоговорКонтрагента.Владелец) КАК ВложенныйЗапрос ГДЕ (НЕ ВложенныйЗапрос.СуммаОстатокВВалютеВзаиморасчетов ЕСТЬ NULL ) И ВложенныйЗапрос.СуммаОстатокВВалютеВзаиморасчетов <> 0 |
|||
|
39
Morphius
29.07.10
✎
22:29
|
(37) и (38) это будет только дебиторка. Кредиторка делается аналогично...
|
|||
|
40
Odavid
29.07.10
✎
23:04
|
(37) и (38) однако :)
Спасибо. Попробую его поковырять. Но задача стоит проще - только остатки по контрагенту и последний документ. Вот поэтому я и прошу СВОЙ запрос - в вашем и Договор, и Ответственный, и Владелец... Что и удлиняет и усложняет запрос немеряно. Если вы помните, - в чем вкратце механизм этого запроса? Если, конечно, не трудно. Или, другими словами, на какое задание (желательно детально) написан приведенный вами запрос? _______________________________________ "Для скорости можно переделать под виртуальные таблицы" - а смысл? ОПять же уже разбирали - отбор по Регистратору в ВТ очень не быстрый, отличия минимальны.... |
|||
|
41
Odavid
29.07.10
✎
23:05
|
Кстати, Morphius, вы Специалиста-то сдали? Как впечатления? :)
|
|||
|
42
Odavid
29.07.10
✎
23:27
|
(40) - Сделок у меня тоже нет. Какова же первооснова запроса (37)?
|
|||
|
43
Odavid
30.07.10
✎
00:07
|
(37) Нельзя сравнивать поля неограниченной длины и поля несовместимых типов:
ТаблицаПоследующихПриходов.ВидДвижения = &ВидДвиженияПриход И ОсновнаяТаблицаРегистра.ВидДвижения <> &ВидДвиженияПриход Параметр: &ВидДвиженияПриход = Приход Запрос мало того "труднопонятен", он еще и не работает в УПП :( (заменил для УПП регистр "ВзаиморасчетыПоСделкам" на "РегистрНакопления.ВзаиморасчетыСКонтрагентами") Ваш доработанный - опять же по каким-то владельцам из списка и по коду отбирает. Как-то за лесом не видно тропинки... Начинаю удалять "лишнее" - каша получается. Morphius, можно как-то ближе к условиям (0)? Или условия вашего запроса. |
|||
|
44
Morphius
30.07.10
✎
11:44
|
(41)На Специалиста сдал, даже 2 раза;)
(40)На виртуальные таблицы переводить смысл есть-если нужно удет фильтровать по контрагенту-запрос будет быстрее на порядок, в отличие от варианта с реальными таблицами Суть запроса такова: Допустим есть контрагент Пупкин ЧП Движение: Реализация1-1000 руб Реализация2-2000 руб ПКО(оплата)-1500 руб Реализация3-800 руб. Запрос выведет:Контрагент|Кредитовый документ|Остаток задолженности Пупкин ЧП|Рееализация2|500 руб. Пупкин ЧП|Реализация3|800 руб. Насколько я понял(0) тебе нужно именно это Насчет каши и сделок-я не говорил, что будет легко;) |
|||
|
45
Odavid
30.07.10
✎
13:56
|
(43) пока конструкция (где "ТаблицаПоследующихПриходов.ВидДвижения" - значение вида движения из вложенного запроса ТаблицаПоследующихПриходов):
ТаблицаПоследующихПриходов.ВидДвижения = ЗНАЧЕНИЕ(Перечисление.ВидыДвиженийПриходРасход.Приход) не работает ни под каким соусом (хотя "ДоговорКонтрагента.ВидДоговора = ЗНАЧЕНИЕ(Перечисление.ВидыДоговоровКонтрагентов.СПокупателем)" - работает успешно. _________________________ (38) - должна выбирать последние на выбранную дату остатки (и документ) для контрагента по договору и по сделке. Непонятно назначение конструкции: СУММА(ЕСТЬNULL(ВзаиморасчетыСКонтрагентамиОбороты.СуммаВзаиморасчетовПриход, 0) + ЕСТЬNULL(ВзаиморасчетыСКонтрагентамиОбороты.СуммаВзаиморасчетовРасход, 0)) - если Приход И/ИЛИ Расход ноль - то он так по сотатукам и пройдет (как "0"), зачем его еще раз через ЕСТЬNULL прогонять? Отбор последнего документа: ТаблицаПоследующихПриходов.Период > ОсновнаяТаблицаРегистра.Период ИЛИ ТаблицаПоследующихПриходов.Период = ОсновнаяТаблицаРегистра.Период И ТаблицаПоследующихПриходов.Регистратор >= ОсновнаяТаблицаРегистра.Регистратор - если Период больше, берется регситратор с большим периодом, если преиоды равны (даты проведения одинаковы), то выбирается больший Регситратор. Тогда вопрос: как определяется "большесть" одного регистратора перед другим, если периоды у них равны? (44) - с учетом новой информации - может и я где ошибся, но пока твой адаптированный запрос (я убрал Сделку и ДатуОтчета, отборы по видам Договора "СПокупателем" и по выбранным договорам в списке) работает неправильно: документы - не последние по контрагенту, суммы - неправильные. Смотрю дальше твой запрос. УТ-шный не работает в принципе из-за невозможности сравнить с перечислением "ВидыДвижений" (а без этого вся структура запроса смысл теряет). |
|||
|
46
Morphius
30.07.10
✎
14:19
|
Надо сравнивать не с перечислением, а с "ВидДвиженияНакопления.Приход", т.е.
Запрос.УстановитьПараметр("ВидДвиженияПриход",ВидДвиженияНакопления.Приход) |
|||
|
47
Morphius
30.07.10
✎
14:24
|
(45) Может быть и неправильно. Я с этим заданием работал сполгода назад, не знаю, какой из вариантов тебе выложил(рабочий или нет). Это показать, как виртуальные таблицы использовать вместо реальных. У меня была задача перевести фирму на учет по расчетным документам, т.е. была 10.2, переходили на 10.3 , в которой есть регистр "Взаиморасчеты по расчетным документам" . Вот я этим запросом вычислял расчетные документы для ввода нач. остатков в разрезе расчетных доков. Задача была решена. Хотя запрос конечно ппц, что курил автар неизвестно;)
|
|||
|
48
Odavid
30.07.10
✎
19:48
|
(47) - а выбор всех полей в ВТ для построителя - они что, все выводятся в отчете? Тут и все поля договора, и контрагента, и регистратора-документа...
Это же в разы замедляет выполнение запроса при формировании отчета: {(ДоговорКонтрагента.Владелец).* КАК ДоговорКонтрагентаВладелец, (ДоговорКонтрагента).* КАК ДоговорКонтрагента, (Сделка).* КАК Сделка} |
|||
|
49
Odavid
30.07.10
✎
19:50
|
Morphius, кстати, не поделишься материалами к Специалисту, по каким сам готовился? Сколько готовился, и как впечатление от экзамена, трудно было?
|
|||
|
50
Morphius
31.07.10
✎
00:25
|
(48)Может я что-то упустил, конечно....;)Насколькоя знаю, построитель-это построитель, а запрос, который выполняется в итоге, это запрос.Они МОГУТ выводиться.
(49)Тебя спец по платформе или упп интересует? |
|||
|
51
Odavid
31.07.10
✎
01:58
|
(48) так я и спрашиваю - зачем все поля выбирать они в отчете будут выводиться не все? Ведь что получается - построитель получает запрос, находит свои {}. а там - "взять все поля". Он их все берет, а нужно для отчета - по одному полю от каждого владельца.
(49) по УПП, если можно. Сдавать через 5 месяцев нужно. |
|||
|
52
Morphius
31.07.10
✎
16:37
|
(51)Ну а с запросом-то разобрался,работает?По упп иди на насф.ру,там есть бесплатная книжка '5 шагов к себестоимости',я по ней готовился
|
|||
|
53
disk-2008
31.07.10
✎
19:34
|
(0)А задача для своей или для типовой конфигурации?
|
|||
|
54
Odavid
01.08.10
✎
14:42
|
(52) если честно - он дает непонятно как обыкновенный давно здесь полученный результат (и уж совсем далеко от задачи в (0) ) - т.к. там результат это просто остаток по Контрагенту (который можно получить из запроса по ВТ Остатки и наложенным условиям), получаемый через одно место :)
Сначала некая невнятная выборка по Левому Соединению из ОсновнаяТаблицаРегистра и ТаблицаПоследующихПриходов (по сути - выбирается вся ОсновнаяТаблицаРегистра и соединяется с ТаблицаПоследующихПриходов с дублированием тех строк по совершенно невообразимому условию). Вот что может выбираться этим условием: ЛЕВОЕ СОЕДИНЕНИЕ ... ПО (ТаблицаПоследующихПриходов.ДоговорКонтрагента = ОсновнаяТаблицаРегистра.ДоговорКонтрагента) И (ТаблицаПоследующихПриходов.Период > ОсновнаяТаблицаРегистра.Период ИЛИ ТаблицаПоследующихПриходов.Период = ОсновнаяТаблицаРегистра.Период И ТаблицаПоследующихПриходов.Регистратор >= ОсновнаяТаблицаРегистра.Регистратор)? Далее, выборка из ВТ ВзаиморасчетыСКонтрагентами.Остатки всех контрагентов с ненулевым остатком на данный момент (положительный остаток или дебиторка - т.е. "они должны") с присоединением из подтаблиц данных по документам (задвоенность еще в выборке ЛЕВОЕ СОЕДИНЕНИЕ ОсновнаяТаблицаРегистра и ТаблицаПоследующихПриходов), а "задвоенность" исправляется новым расчетом остатка, для чего здесб же всунут невообразимый трехэтажный ИНАЧЕ ВЫБОР, не поддающийся никакому логическому объяснению - т.е. берется документ Прихода (ППИ), если по нему сумма больше Расхода - пишется остаток по Приходу и остатки по оставшимся (незадействованным) Приходам; если Расход больше - пишется ноль, уменьшается Расход на величину этого Прихода, а остаток по Расходу - вычитается из следующего. Окончательно - выбираются все Приходы с ненулевыми остатками (никак не последние, а "несписанные"). А в условии - должен быть последний документ, сделавший изменение остатка (хоть Приход, хоть Расход). Совершенно нечитаемый ВЫБОР...КОГДА я пока не рассматривал еще. _____________________ ВЫБОР в подзапросах ОсновнаяТаблицаРегистра и ТаблицаПоследующихПриходов составлен, мягко говоря, нелогично, если не сказать - безграмотно: 1) ВЫБРАТЬ ... ВЫБОР КОГДА ЕСТЬNULL(ВзаиморасчетыСКонтрагентамиОбороты.СуммаВзаиморасчетовПриход, 0) <> 0 ТОГДА &ВидДвиженияПриход ИНАЧЕ &ВидДвиженияРасход КОНЕЦ КАК ВидДвижения, СУММА(ЕСТЬNULL(ВзаиморасчетыСКонтрагентамиОбороты.СуммаВзаиморасчетовПриход, 0) + ЕСТЬNULL(ВзаиморасчетыСКонтрагентамиОбороты.СуммаВзаиморасчетовРасход, 0)) КАК СуммаВзаиморасчетов ИЗ .... Вместо логически верного и интуитивно более понятного в данном контексте (раз уж с 0 сравнение по Приходу) "больше "0" - значит, ПРИХОД; пусто ("ноль" - все остальные варианты данного поля) - значит документ Расход": ВЫБРАТЬ ... ВЫБОР КОГДА ЕСТЬNULL(ВзаиморасчетыСКонтрагентамиОбороты.СуммаВзаиморасчетовПриход, 0) > 0 ТОГДА &ВидДвиженияПриход ИНАЧЕ &ВидДвиженияРасход КОНЕЦ КАК ВидДвижения, СУММА(ЕСТЬNULL(ВзаиморасчетыСКонтрагентамиОбороты.СуммаВзаиморасчетовПриход, 0) + ЕСТЬNULL(ВзаиморасчетыСКонтрагентамиОбороты.СуммаВзаиморасчетовРасход, 0)) КАК СуммаВзаиморасчетов ИЗ .... - т.к. сравнение, примененное здесь "не равно 0" (<>) не имеет смысла - поля СуммаВзаиморасчетовПриход и СуммаВзаиморасчетовРасход сами по себе НИКОГДА не могут иметь знаячения меньше нуля (только 0 или сумму соответвующего ПРИХОДА-РАСХОДА). 2) Или, зачем нужна вот эта конструкция: СУММА(ЕСТЬNULL(ВзаиморасчетыСКонтрагентамиОбороты.СуммаВзаиморасчетовПриход, 0) + ЕСТЬNULL(ВзаиморасчетыСКонтрагентамиОбороты.СуммаВзаиморасчетовРасход, 0)) КАК СуммаВзаиморасчетов - что, в одном и том же документе могет быть как приход, так и расход?! Т.е. одним Поступлением - кроме увеличения кредиторки (поставка товаров - Расход) Поставщик еще и забрал какие-то товары со склада (Реализация - Приход)? Или в исходящей платежке (оплата за посталенный товар/услуги Поставщику, делает уменьшение кредиторки - Приход) вписан еще и встречный перевод денег от Поставщика (увеличение кредиторки - Расход)? ______________________________ (39) Кредиторка в этом запросе делается не просто аналогично, а заменой одного знака в условии выборки из ВТ Остатки: ГДЕ Остатки.СуммаВзаиморасчетовОстаток > 0 на ГДЕ Остатки.СуммаВзаиморасчетовОстаток < 0 - и заменой условия соединения во ВНУТРЕННЕМ СОДИНЕНИИ на &ВидДвиженияРасход (выбрать документы, создающие расход - т.е. кредиторскую задолженность): ПО Остатки.ДоговорКонтрагента = ОсновнаяТаблицаРегистра.ДоговорКонтрагента И (ОсновнаяТаблицаРегистра.ВидДвижения = &ВидДвиженияРасход И ОсновнаяТаблицаРегистра.СуммаВзаиморасчетов > 0) Хотя выше я уже расписал, что совершенно не ясен результат выборки (т.е. остаток-то находится (многоуровневым запросом со множеством ненужных преобразований - вместо просто запроса по ВТ Остатки Регистратор и Контрагент), и подсоединяется соответствующий движению документ-регистратор в качестве "иллюстрации"; мне же нужно - именно последний, сделавший изменение (неважно какой - Приход или Расход, а в усложненном условии - еще и только по определенным видам документов, а не по всем регистраторам, пишущим данные в выбранный регистр). ______________________________ (53) Основной вариант для типовой, где по определенными документам - самописка. |
|||
|
55
Morphius
01.08.10
✎
14:54
|
Суть запроса-вычислить кредитовые документы, в общем случае их может быть несколько, и задолженность на каждый документ."давно здесь полученный"-в каком посте получен тот же результат более простым запросом? Если тебе нужен просто последний документ движения-все гораздо проще конечно
|
|||
|
56
Odavid
01.08.10
✎
23:28
|
(55) Морфиус, а как вы получите задолженность на каждый документ, если нет отслеживания, КАКОЙ документ оплаты и на ЧТО проплачено? :)
У вас просто последовательно списываются некие документы-приходы, что можно и не отслеживать - а анализировать общий Остаток (дебетовый он или кредитовый) по всем документам, раз все равно без разницы, какие из документов Прихода "оплачивают" Расход. "Где получено" - выше мы уже разобрали получение общего остатка по контрагенту. С непосредственной привязкой к последнему документу, сделавшему движение. _______________________ (52) - книгу "5 шагов" нашел, но там только сокращенный вводный курс. Это он? _______________________ Запрос из УТ работает (в плане нахождения остатка и списывания Прихода) - но критика сама собой напрашивается :) |
|||
|
57
Morphius
02.08.10
✎
15:52
|
(56)Да, все работает именно так. Считается, что оплата идет по фифо. Если у вас не так, нужно реализовывать взаиморасчеты по расчетным документам, как в УТ 10.3, где есть измерение "Расчетный документ".
Это именно он. Из него возникает понимание, что к чему. Это основа, вкупе со стандартной документацией реально сдать(у меня получилось, по крайней мере;)) |
|||
|
58
Odavid
03.08.10
✎
09:20
|
(57) а по ЗУП Проф у тебя ничего нет? Может, получится и его тоже сдать одновременно. А то с материалами по зарплате сложновато.
|
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |