Имя: Пароль:
1C
1С v8
Как обойтись без запроса в цикле?
0 Mary01
 
07.08.13
10:59
Нужно сделать простой отчет в БП 8, заранее извинюсь за банальные вопросы, но пока работала на нетиповой конфе, некоторые основы забылись.
Итак, нужен отчет: по контрагентам вывести сальдо на нач. и кон. периода и обороты между сч. 62 и 51, 62 и 50. Это верхняя группировка. А при ее раскрытии нужно показать счета, которые выставлены за этот период.
1. По таблице Хозрасчетный.ОстаткиИОбороты мы не можем понять, с какими счетами были обороты. поэтому придется присоединять Хозрасчетный.ОборотыДтКт. Вопрос - какое соединение правильное: левое или "объединить все"? Другой вопрос: если в Хозрасчетный.ОборотыДтКт задать условие СчетДт=50,51, СчетКт=62, то как получить обратное - Дт50,51Кт62? Присоединить еще один Хозрасчетный.ОборотыДтКт?
2. Не понимаю как собрать все данные в одном запросе. Допустим, один подзапрос будет содержать данные из регистра БУ, а второй подзапрос - из документов "Счет". Как их соединять? Левое, "объединить все"? В любом случае в каждой строке будут лишние данные, которые при группировке еще и суммируются. А делать запрос к бухитогам, а потом в цикле выборки делать запрос к документам каждого контрагента как-то неправильно.
13 samozvanec
 
07.08.13
11:39
(12) + и заявки на закрытие неоплаченных счетов, и РН для учета необработанных заявок на закрытие неоплаченных счетов. отличный отчет получится)
14 Mary01
 
07.08.13
11:43
(11) да, вот именно, мы увидим, что сальдо есть, а счет даже не выставлен, а значит надо срочно выставлять.
почему обороты не нужны? а как мы поймем, по банку или кассе оплачен счет? В разрезе регистратора?
15 Mary01
 
07.08.13
11:47
12,13 - красиво, но нужно обойтись без изменений в конфигурации. кроме того, даже если такой РН сделать, все равно в отчет требуется выводить сальдо по регистру бухгалтерии
16 Peltzer
 
07.08.13
11:53
Как у вас заполняется поле Оплачено в счете?
Документ ПлПорВходящее изменяет Счета на оплату?
17 Mary01
 
07.08.13
11:59
(16) Вручную. Нет.
18 samozvanec
 
07.08.13
12:01
(14) а как это понять по оборотам таблицы ОстаткиИОбороты? я говорил не про ОборотыДтКт
19 mzelensky
 
07.08.13
12:07
(17) Клевая система автоматизации бизнес-процесса :)
20 Mary01
 
07.08.13
12:08
(19)  не требуют - не делаем!
21 Peltzer
 
07.08.13
12:10
"раскрытии нужно показать счета, которые выставлены за этот период"
Т.е. если выставлен счет прошлым месяцем - то он не должен попадать?
22 samozvanec
 
07.08.13
12:10
(19) давно не видел типовые. что, сейчас уже документы изменяют документы?
23 Mary01
 
07.08.13
12:10
(18) не, по  ОстаткиИОбороты - никак, отсюда только остатки вытянуть
24 samozvanec
 
07.08.13
12:10
(23) вот поэтому лучше возьми 2 таблицы Остатки и таблицу ОстаткиДтКт
25 mzelensky
 
07.08.13
12:10
(20) продолжайте наблюдения....
26 mzelensky
 
07.08.13
12:11
(22) бывает и такое, но обычно документы делают движения, которые в последствии могу влиять на работу других документов.
27 Mary01
 
07.08.13
12:12
(21) нет. но сальдо на начало периода мы должны увидеть, их брать из Остатков по регистру БУ
28 Mary01
 
07.08.13
12:13
(24) запуталась. можно подробнее - что откуда брать
29 samozvanec
 
07.08.13
12:15
(28) очепятка). ты хотела брать ОстаткиИОбороты и ОборотыДтКт. я предложил взять 2 таблицы Остатки и, как и в твоем варианте, ОборотыДтКт.
30 Mary01
 
07.08.13
12:16
(29) а зачем вторая табл. Остатки?
31 samozvanec
 
07.08.13
12:17
(30) тебе же и на начало и на конец надо?
32 Mary01
 
07.08.13
12:22
(31) а ну точно! а почему тогда нельзя взять 1 раз ОстаткиИОбороты, там остатки на начало и конец есть
33 samozvanec
 
07.08.13
12:26
(32) это тяжелая таблица. даже если ты возьмешь по отдельности 2 таблицы остатков и 1 таблицу оборотов и их соединишь, будет работать быстрее, чем если взять просто ОстаткиИОбороты
34 Mary01
 
07.08.13
12:28
(33) спасибо! очень полезно это знать.
35 Mary01
 
07.08.13
12:29
(29) то есть, верно я понимаю, берем эти 3 таблицы и соединяем через "объединить все"?
36 samozvanec
 
07.08.13
12:30
(35) неверно. возьми консоль и поэкспериментируй, так проще понять. возьми любые пару таблиц, и соедини сначала так, а потом по-другому
37 Peltzer
 
07.08.13
12:37
ВЫБРАТЬ
    ХозрасчетныйОборотыДтКт.СуммаОборот,
    ХозрасчетныйОборотыДтКт.СубконтоКт1 КАК СубконтоКт1,
    0 КАК Ссылка,
    ХозрасчетныйОборотыДтКт.СуммаОборот - ВложенныйЗапрос.СуммаДокумента КАК СуммаДокумента
ИЗ
    (ВЫБРАТЬ
        СчетНаОплатуПокупателю.Контрагент КАК Контрагент,
        СУММА(СчетНаОплатуПокупателю.СуммаДокумента) КАК СуммаДокумента
    ИЗ
        Документ.СчетНаОплатуПокупателю КАК СчетНаОплатуПокупателю
    ГДЕ
        СчетНаОплатуПокупателю.Дата >= &НачалоПериода
        И СчетНаОплатуПокупателю.Дата <= &КонецПериода
    
    СГРУППИРОВАТЬ ПО
        СчетНаОплатуПокупателю.Контрагент) КАК ВложенныйЗапрос
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Хозрасчетный.ОборотыДтКт(
                &НачалоПериода,
                &КонецПериода,
                Авто,
                СчетДт = &Счет50
                    ИЛИ СчетДт = &Счет51,
                ,
                СчетКт В ИЕРАРХИИ (&Счет62),
                ,
                ) КАК ХозрасчетныйОборотыДтКт
        ПО ВложенныйЗапрос.Контрагент = ХозрасчетныйОборотыДтКт.СубконтоКт1
ГДЕ
    ХозрасчетныйОборотыДтКт.СуммаОборот - ВложенныйЗапрос.СуммаДокумента > 0

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    ХозрасчетныйОборотыДтКт.СуммаОборот,
    ХозрасчетныйОборотыДтКт.СубконтоКт1,
    СчетНаОплатуПокупателю.Ссылка,
    СчетНаОплатуПокупателю.СуммаДокумента
ИЗ
    РегистрБухгалтерии.Хозрасчетный.ОборотыДтКт(
            &НачалоПериода,
            &КонецПериода,
            Авто,
            СчетДт = &Счет50
                ИЛИ СчетДт = &Счет51,
            ,
            СчетКт В ИЕРАРХИИ (&Счет62),
            ,
            ) КАК ХозрасчетныйОборотыДтКт
        ЛЕВОЕ СОЕДИНЕНИЕ Документ.СчетНаОплатуПокупателю КАК СчетНаОплатуПокупателю
        ПО ХозрасчетныйОборотыДтКт.СубконтоКт1 = СчетНаОплатуПокупателю.Контрагент
ГДЕ
    СчетНаОплатуПокупателю.Дата >= &НачалоПериода
    И СчетНаОплатуПокупателю.Дата <= &КонецПериода

УПОРЯДОЧИТЬ ПО
    СубконтоКт1
38 Peltzer
 
07.08.13
12:37
Осталось присобачить остатки на начало и конец.
39 Mary01
 
07.08.13
12:52
(38) ого, вы даже код написали. спасибо, сейчас попробую
40 Mary01
 
07.08.13
14:33
(36) попробовала. лучше всего "объединить все".
если взять 2 таблицы Остатки, чтобы получить из одной ост. на начало. а из др. - на конец, то при правом или левом соединении мы можем не получить часть  данных из присоединяемой таблицы. а при полном соединении придется брать контрагентов из обеих таблиц (будет 2 колонки с контрагентами), что меня смущает.
при "объединить все" получим все как надо: одна колонка контрагент, колонка нач. ост. и колонка кон. ост.  я права?
41 Mary01
 
07.08.13
14:41
samozvanec, вы где?
42 Beduin
 
07.08.13
14:43
(0) Пойдешь ко мне работать?
43 Mary01
 
07.08.13
14:45
(42) если буду искать вакансию, обязательно вспомню про вас!
44 Sorm
 
07.08.13
14:46
(40) Неверно. При полном соединении возьмутся данные из двух таблиц, но столбец контрагентов останется один. Просто в начальном(или конечном) остатке и некоторых записей будет Null
45 Shurjk2
 
07.08.13
14:48
Судя по темам и фото, это бородатый админ который подъедается 1с-ком:)
46 Beduin
 
07.08.13
14:50
(45) Разнообразия тоже важны)
47 Mary01
 
07.08.13
14:54
(44) да, разумеется это так, но мне же надо вывести наименование к-агента, а как я его выведу, если оно Null?
48 Mary01
 
07.08.13
14:54
(45) как понять "подъедается"?
49 Shurjk2
 
07.08.13
14:57
(48) Подрабатывает.
50 samozvanec
 
07.08.13
14:58
(40) что в каких колонках не зависит от того, соединяешь ты, или объединяешь. важно то, что при объединении ты получишь начальное и конечное сальдо в разных строках, и я даже не представляю, как ты их будешь выводить потом. поэтому именно здесь - соединение.
хороший пример объединения в (37), это как раз твоя таблица оборотов. в одних строках - с кассой, в других - с банком. вот берешь ее и 2 таблицы остатков, и все это соединяешь. я думаю, полное соединение тебе подойдет.
51 Shurjk2
 
07.08.13
14:59
(46) Экий вы затейник.
52 samozvanec
 
07.08.13
15:01
+(50) и везде суешь isnull().
например, поле контрагент вполне себе выбирается в одну колонку
isnull(ОстаткиНаНачало.КакойТамНомерУСубконтоКонтрагент, ОстаткиНаКонец.КакойТамНомерУСубконтоКонтрагент) КАК Контрагент
53 samozvanec
 
07.08.13
15:02
+(52) Т.е. если по контрагенту будет только остаток на конец, то из остатков на начало придет NULL. ну и наоборот. и этот NULL меняется на имеющееся значение
54 Sorm
 
07.08.13
15:04
(47) Оно-то как раз будет:) Остатки на начало или конец возможно будут Null.
Рекомендую http://www.sql-ex.ru для понимания запросов.
55 samozvanec
 
07.08.13
15:06
тоже порекомендую)
говорят, ролики Павла Чистова о запросах очень хороши. сам не смотрел, но наслышан.
56 Mary01
 
07.08.13
15:11
(53) поняла. а чем этот способ лучше чем Объединить все, если результат один? лучше в плане быстродействия или еще чего-то?
57 samozvanec
 
07.08.13
15:13
(56) результат разный будет. см (50)
58 Shurjk2
 
07.08.13
15:15
(50) Количество строк в результате  очень зависит от того объединять или соединять таблицы.
59 samozvanec
 
07.08.13
15:16
короче на пальцах. две таблицы

1)

КакЗовут         СколькоЖретНаОбедДошираков

Вова             1
Петя             2
Галя             4
Вася             2

2)

КакЗовут         СколькоВесит

Вася             70
Галя             90
Максим           60
60 samozvanec
 
07.08.13
15:18
После полного соединения:

КакЗовут         СколькоЖретНаОбедДошираков    СколькоВесит

Вова             1
Петя             2
Галя             4                             90
Вася             2                             70
Максим                                         60
61 Mary01
 
07.08.13
15:19
(57) точно, прсто у меня результат был не упорядочен, а когда упорядочила, то увидела, что каждый к-агент по 2 раза!
62 Shurjk2
 
07.08.13
15:19
(60) После полного должно быть в результирующей таблице 12 строк:)
63 Mary01
 
07.08.13
15:19
(60) это с isnull, да?
64 samozvanec
 
07.08.13
15:20
после объединения:

КакЗовут         СколькоЖретНаОбедДошираков     СколькоВесит

Вова             1
Петя             2
Галя             4
Вася             2
Вася                                            70
Галя                                            90
Максим                                          60
65 samozvanec
 
07.08.13
15:21
(62) с чего бы?
(63) это если применить isnull к полю КакЗовут, так же, как в (52). в остальных колонках пустые значения - как раз null
66 Shurjk2
 
07.08.13
15:22
(65) Что такое полное объединение? Это скалярное произведение двух таблиц.
67 Shurjk2
 
07.08.13
15:23
(64) А если это сгруппировать то получаем нормальную таблицу и без всяких налов и задвоений.
68 samozvanec
 
07.08.13
15:23
(62) не, скалярное произведение будет, если ты вообще не укажешь условие соединения, или соединишь по ИСТИНА
69 Shurjk2
 
07.08.13
15:24
(68) А где там условие? и какое оно было?
70 samozvanec
 
07.08.13
15:25
(69) каюсь) условие было ПО Таб1.КакЗовут = Таб2.КакЗовут
71 Shurjk2
 
07.08.13
15:25
Это хорошо когда всего одно измерение в регистре а когда их несколько то легко получаем всяческие задвоения.
72 Mary01
 
07.08.13
15:26
(71) я по 2 измерениям делаю: Организация и Субконто1 (к-агенты)
73 samozvanec
 
07.08.13
15:27
(71) задвоение получишь, если строка одной таблицы по условию подойдет к двум строкам другой. гадкая ситуевина
74 Mary01
 
07.08.13
15:27
(45) не спешите с выводами, я 1с-ник но иногда приходится и админить )
75 Sorm
 
07.08.13
15:27
(66) :) Полное объединение - это что?:) Если "полное соединение" - то нет, если объединение - то опять же нет:)
76 Shurjk2
 
07.08.13
15:28
(74) А насчет бороды как?
77 Mary01
 
07.08.13
15:28
(73) это как? у нас один начальный остаток по каждому контрагенту и один конечный.
78 Mary01
 
07.08.13
15:29
(76) не выросла
79 samozvanec
 
07.08.13
15:29
(75) СОЕДИНИТЬ ВСЕ)
80 Shurjk2
 
07.08.13
15:29
(79) Сильно:)
81 samozvanec
 
07.08.13
15:31
(77) никак, не даст тебе виртуальная таблица две строки с одинаковыми измерениями. норм все.
82 Shurjk2
 
07.08.13
15:33
(81) В бухгалтерском то регистре? ну ну.
83 Mary01
 
07.08.13
15:34
(54) зарегистрировалась там.
84 Shurjk2
 
07.08.13
15:34
(78) А слабо фотку поменять, чтоб развеять мои сомнения.
85 samozvanec
 
07.08.13
15:34
+(81) хотя таблица ОстаткиИОбороты очень даже даст. есть там параметр у таблицы, МетодДополнения, по умолчанию - ДвиженияИГраницыПериода.
(82) таблица Остатки не даст
86 Shurjk2
 
07.08.13
15:36
(85) Там еще пара измерений есть, все немного посложней чем с едоками доширака. Поэтому советую использовать объединение - с группировкой - так надежней будет.
87 Sorm
 
07.08.13
15:38
(83) Порешай задачи начального этапа, и вопросов по запросам у тебя больше не будет:)
88 samozvanec
 
07.08.13
15:50
(86) не усложняй. не кошерно это. и опять же, если в другой таблице подойдут две записи, то точно такое же задвоение получишь
89 Mary01
 
07.08.13
15:56
(84) да пожалуйста
90 Shurjk2
 
07.08.13
15:56
(88) Неа задвоения не будет. А чем именно некошерно?
91 Shurjk2
 
07.08.13
15:57
(89) Непоменялась:(
92 Mary01
 
07.08.13
15:59
(91) да (
что я делаю не  так?
93 Shurjk2
 
07.08.13
15:59
(92) Сейчас вообще исчезла:)
94 Mary01
 
07.08.13
16:00
Модераторы, почему не меняется фото?
95 samozvanec
 
07.08.13
16:05
(90) че это не будет? строки сгруппируются по измерениям, ресурсы сложатся - разницы никакой. некошерно  - в таком примере только субъективно читабельность. если взять таблицы посложнее, то ты просто не сгруппируешь после объединения то, что можно соединить.
96 Shurjk2
 
07.08.13
16:09
(95) Откуда там двойное количество будет?
97 Shurjk2
 
07.08.13
16:10
+(96) И че это я вдруг не сгруппирую?
98 samozvanec
 
07.08.13
16:17
(96) во второй таблице 2 строки

Вася 2
Вася 2

после объединения и группировки с первой будет

Вася 70 4

(97) потому что у тебя в одной таблице, например, выбирается куча измерений, а из второй только КакЗовут. остальные поля будут null. Как его будешь группировать?
99 samozvanec
 
07.08.13
16:19
+(98) а теперь представь, что тебе надо не просто присоединить сколько жрет вася, а только в случае, если вася весит больше 80 кг. как тогда группировать?
100 Shurjk2
 
07.08.13
16:25
(98) Не будет такого, либо реально остаток по васе 4 а не 2.
101 Shurjk2
 
07.08.13
16:26
(98) Не будет у меня NULL- ов если я не буду всякие соединения использовать, просто по определению не будет.
102 Shurjk2
 
07.08.13
16:27
(99) Сначала выберу, сгрупирую потом уже отберу.
103 samozvanec
 
07.08.13
16:41
(101) у тебя в другой таблице тупо полей этих нет, что там будет, если не null?
(102) соединение оптимальнее

че за глупый спор вообще? надо соединять - соединяй, надо объединять - объединяй)
104 Shurjk2
 
07.08.13
16:50
(103) Что задам то и будет:) Чем оптимальней так и не понял.
105 Shurjk2
 
07.08.13
16:51
Я спор поддерживал только с целью новую фотку посмотреть:) но судя по всему ее так и не будет:(
106 samozvanec
 
07.08.13
16:54
(104) соединение по условию быстрее отработает чем группировка(которая, кстати, не отработает :) ) и отбор. что задашь? пустую ссылку? вариантов не особо

(105) есть такое) чето она не торопится
107 Mary01
 
07.08.13
17:12
она не грузится. когда я ее добавляю, откуда-то возникает старая фотка. где модераторы? как задать вопрос?
108 baza1978
 
07.08.13
17:22
(0) а зачем "обходится без запроса в цикле"? Деньги заказчики платят за результат, как это происходит никого не волнует. Если скорость нормальная, делай как тебе удобнее.. За алгоритмические изыски ни один заказчик бабла платить не будет.
109 Mary01
 
07.08.13
17:27
(108) я люблю чтобы было правильно и красиво
110 Shurjk2
 
07.08.13
17:32
(107) Печаль:(
111 Shurjk2
 
07.08.13
17:39
Может на почту тогда.
112 Mary01
 
07.08.13
17:41
111 неа
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой