Имя: Пароль:
1C
1С v8
Вопрос по запросу
0 Lolipop
 
21.03.17
23:08
В запросе имеются такие проводки
26 62
62 26
51 60
60 51

Как сделать запросом, чтобы оставить по одному от каждой пары?
То есть, конечный вариант
26 62
51 60
1 DrShad
 
21.03.17
23:10
не выбирать лишнее в запрос
2 Diman000
 
21.03.17
23:13
По другой виртуальной таблице запрос строить.
Хотя, если у тебя именно ПРОВОДКИ, то не спасти...
Проводка по-любому есть и выйдет в результат. А вот свернуть обороты на более высоком уровне можно.
3 Lolipop
 
21.03.17
23:18
(1) Окей.
Тогда такая задача. Есть проводки и сумма по проводкам.
62.1    90.1    31 000.00
76.9    51    17 000.00
26    51    150.00
60.2    51    22 000.00
26    60.1    1 200.00
76.5    90.1    41 000.00
62.1    76.5    41 000.00
51    62.1    72 000.00
60.1    60.2    22 000.00
20    60.1    22 000.00
20    26    1 350.00
90.2    20    23 350.00

Нужно вот эту вещь привести к такому варианту, чтобы проводки разбились на минимальное количество групп НЕ КОРРЕСПОНДИРУЮЩИХ ДРУГ С ДРУГОМ.

Ответ по проводкам:
1    51, 20
2    60, 76
3    26, 62
4    90
4 Naf2017
 
21.03.17
23:19
выбрать
выбор когда СчетДт.Код>СчетКт.Код тогда СчетДт иначе СчетКт конец как счета
из Движения
5 Lolipop
 
21.03.17
23:20
Как я решил делать.
1. Отобрал все счета имеющиеся в запросе.
2. Отделил каждый счет корреспондирующий с другим счетом.
3. Далее из 2 отделил счета не корреспондирующие друг с другом и получилась такая вещь как в (1)
Теперь не знаю, как привести ее к нужному виду
6 Lolipop
 
21.03.17
23:21
(4) Это к какой таблице запрос?
7 Naf2017
 
21.03.17
23:24
(6) ты таблиц не показывал
8 Lolipop
 
21.03.17
23:25
(7) Глаза разуй. (1) и (3)
9 Lolipop
 
21.03.17
23:27
Вот запрос.

ВЫБРАТЬ РАЗЛИЧНЫЕ
    ВЫБОР
        КОГДА РегистрБухгалтерииДвиженияССубконто.СчетДт.Родитель = ЗНАЧЕНИЕ(ПланСчетов.ПланСчетов.ПустаяСсылка)
            ТОГДА РегистрБухгалтерииДвиженияССубконто.СчетДт
        ИНАЧЕ РегистрБухгалтерииДвиженияССубконто.СчетДт.Родитель
    КОНЕЦ КАК ВсеСчетаПРисутствующиеВРегистре
ПОМЕСТИТЬ ВсеСчетаПристуствующиеВРегистре
ИЗ
    РегистрБухгалтерии.РегистрБухгалтерии.ДвиженияССубконто КАК РегистрБухгалтерииДвиженияССубконто

ОБЪЕДИНИТЬ

ВЫБРАТЬ РАЗЛИЧНЫЕ
    ВЫБОР
        КОГДА РегистрБухгалтерииДвиженияССубконто.СчетКт.Родитель = ЗНАЧЕНИЕ(ПланСчетов.ПланСчетов.ПустаяСсылка)
            ТОГДА РегистрБухгалтерииДвиженияССубконто.СчетКт
        ИНАЧЕ РегистрБухгалтерииДвиженияССубконто.СчетКт.Родитель
    КОНЕЦ
ИЗ
    РегистрБухгалтерии.РегистрБухгалтерии.ДвиженияССубконто КАК РегистрБухгалтерииДвиженияССубконто
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
    ВЫБОР
        КОГДА РегистрБухгалтерииДвиженияССубконто.СчетДт.Родитель = ЗНАЧЕНИЕ(ПланСчетов.ПланСчетов.ПустаяСсылка)
            ТОГДА РегистрБухгалтерииДвиженияССубконто.СчетДт
        ИНАЧЕ РегистрБухгалтерииДвиженияССубконто.СчетДт.Родитель
    КОНЕЦ КАК СинтетическийСчетДт,
    ВЫБОР
        КОГДА РегистрБухгалтерииДвиженияССубконто.СчетКт.Родитель = ЗНАЧЕНИЕ(ПланСчетов.ПланСчетов.ПустаяСсылка)
            ТОГДА РегистрБухгалтерииДвиженияССубконто.СчетКт
        ИНАЧЕ РегистрБухгалтерииДвиженияССубконто.СчетКт.Родитель
    КОНЕЦ КАК СинтетическийСчетКт
ПОМЕСТИТЬ РегистрБухгалтерииССинтетическимиСчетами
ИЗ
    РегистрБухгалтерии.РегистрБухгалтерии.ДвиженияССубконто КАК РегистрБухгалтерииДвиженияССубконто
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВсеСчетаПристуствующиеВРегистре.ВсеСчетаПРисутствующиеВРегистре КАК ВсеСчетаПРисутствующиеВРегистреДтКТ,
    РегистрДляСвязиПроводокПоДт.СинтетическийСчетКт КАК СинтетическийСчетДтКт
ПОМЕСТИТЬ ПредварительнаяТаблицаСДтиКтВОднойТаблице
ИЗ
    ВсеСчетаПристуствующиеВРегистре КАК ВсеСчетаПристуствующиеВРегистре
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерииССинтетическимиСчетами КАК РегистрДляСвязиПроводокПоДт
        ПО ВсеСчетаПристуствующиеВРегистре.ВсеСчетаПРисутствующиеВРегистре = РегистрДляСвязиПроводокПоДт.СинтетическийСчетДт

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    ВсеСчетаПристуствующиеВРегистре.ВсеСчетаПРисутствующиеВРегистре,
    РегистрДляСвязиПроводокПоКт.СинтетическийСчетДт
ИЗ
    ВсеСчетаПристуствующиеВРегистре КАК ВсеСчетаПристуствующиеВРегистре
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерииССинтетическимиСчетами КАК РегистрДляСвязиПроводокПоКт
        ПО ВсеСчетаПристуствующиеВРегистре.ВсеСчетаПРисутствующиеВРегистре = РегистрДляСвязиПроводокПоКт.СинтетическийСчетКт
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВсеСчетаПристуствующиеВРегистре.ВсеСчетаПРисутствующиеВРегистре,
    ВсеСчетаПристуствующиеВРегистре1.ВсеСчетаПРисутствующиеВРегистре КАК ВсеСчетаПРисутствующиеВРегистре1
ПОМЕСТИТЬ ВсеСчетаСвязанныеДругСДругом
ИЗ
    ВсеСчетаПристуствующиеВРегистре КАК ВсеСчетаПристуствующиеВРегистре
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВсеСчетаПристуствующиеВРегистре КАК ВсеСчетаПристуствующиеВРегистре1
        ПО ВсеСчетаПристуствующиеВРегистре.ВсеСчетаПРисутствующиеВРегистре <> ВсеСчетаПристуствующиеВРегистре1.ВсеСчетаПРисутствующиеВРегистре
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВсеСчетаСвязанныеДругСДругом.ВсеСчетаПРисутствующиеВРегистре КАК ПроводкаКоторойНетДт,
    ВсеСчетаСвязанныеДругСДругом.ВсеСчетаПРисутствующиеВРегистре1 КАК ПроводкаКоторойНетКт
ПОМЕСТИТЬ ПроводкиКОторыхНет
ИЗ
    ВсеСчетаСвязанныеДругСДругом КАК ВсеСчетаСвязанныеДругСДругом
        ЛЕВОЕ СОЕДИНЕНИЕ ПредварительнаяТаблицаСДтиКтВОднойТаблице КАК ПредварительнаяТаблицаСДтиКтВОднойТаблице
        ПО ВсеСчетаСвязанныеДругСДругом.ВсеСчетаПРисутствующиеВРегистре = ПредварительнаяТаблицаСДтиКтВОднойТаблице.ВсеСчетаПРисутствующиеВРегистреДтКТ
            И ВсеСчетаСвязанныеДругСДругом.ВсеСчетаПРисутствующиеВРегистре1 = ПредварительнаяТаблицаСДтиКтВОднойТаблице.СинтетическийСчетДтКт
ГДЕ
    ПредварительнаяТаблицаСДтиКтВОднойТаблице.СинтетическийСчетДтКт ЕСТЬ NULL
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
    ПроводкиКОторыхНет.ПроводкаКоторойНетДт,
    ПроводкиКОторыхНет.ПроводкаКоторойНетКт
ИЗ
    ПроводкиКОторыхНет КАК ПроводкиКОторыхНет
ГДЕ
    (ПроводкиКОторыхНет.ПроводкаКоторойНетДт, ПроводкиКОторыхНет.ПроводкаКоторойНетКт) В
            (ВЫБРАТЬ ПЕРВЫЕ 1
                ПроводкиКОторыхНет.ПроводкаКоторойНетДт,
                ПроводкиКОторыхНет.ПроводкаКоторойНетКт
            ИЗ
                ПроводкиКоторыхНет КАК ВСЁ
            ГДЕ
                ВСЁ.ПроводкаКоторойНетДт = ПроводкиКОторыхНет.ПроводкаКоторойНетДт
                И ВСЁ.ПроводкаКоторойНетКт <> ПроводкиКОторыхНет.ПроводкаКоторойНетКт)
10 RomanYS
 
21.03.17
23:33
(3) почему не
1 51 , 90, 26
2 60 , 76
3 20 , 62
?
11 Lolipop
 
21.03.17
23:34
(10) Можно и так.
Ты абсолютно прав.
Сам не увидел.
12 DrShad
 
21.03.17
23:36
зачем все это?
13 Lolipop
 
21.03.17
23:40
(12) Нужно. Просто сдавайся, если не знаешь.
14 Lolipop
 
21.03.17
23:41
(12) Тут нет вариантов типа послать бухгалтера, не делать и так далее.
15 Diman000
 
21.03.17
23:42
Да не кипятись ты, зелен еще раз такие вопросы задаешь. Сказал бы спасибо, что с тобой тут цацкаются...

Тебе вообще не движения нужны. Говорю же, используй другую вирт. таблицу. Нафейхоа в такой задаче ДвиженияССубконто? Смотри в сторону ОборотыДтКт или типа того, за точность не ручаюсь, с бухрегами давно дел не имел.
Но задача выглядит плевой, взял обороты с одной стороны корреспонденций, взял с минусом их же с другой и свернул.
16 DrShad
 
21.03.17
23:48
сам бух по образованию - ума не приложу какая цель?
17 Diman000
 
21.03.17
23:50
И вообще не понятно чем стандартные бух. отчеты не устраивают. Анализ счета, что там еще есть, обороты между счетами какие-нибудь... Все же покажут что тебе надо..
18 Lolipop
 
21.03.17
23:51
(15) Я и не кипячусь.
Спасибо за помощь
19 DrShad
 
21.03.17
23:52
пока все что я понял - ищут проводку которой нет )))
20 Diman000
 
21.03.17
23:57
Да, чето вгляделся я в (3), выглядит как ахинея какая-то)))
Реально ищете проводки которых нет...
21 France
 
21.03.17
23:57
(14) бухгалтера послать - всегда есть варианты.. а вот на вопрос в (12) действительно нет вариантов - зачем все это?..
если есть ответ - тогда и помочь легче
22 Lolipop
 
21.03.17
23:59
(20) Это олимпиадное задание. Не практическое и не типовое
23 DrShad
 
22.03.17
00:00
озвучить его можно?
24 Diman000
 
22.03.17
00:01
Эвона как.
Голая теория значит. Тогда полный текст задания надо выкладывать, мало ли какие подвохи там.
Но лично я разбираться в нем не готов))
25 Lolipop
 
22.03.17
00:02
(23) Разработать внешний отчет, в котором предлагается вариант разбиения всех счетов, представленных в проводках, на минимальное количество групп, каждая из которых содержит синтетические счета, которые не корреспондируют друг с другом ни в одной из проводок, имеющихся в информационной  базе. При этом проводки, в которых корреспондируют одинаковые синтетические счета, а также проводки с нулевыми суммами учитывать не надо. Результат представить в виде отчета, форма которого приведена в примере.
26 France
 
22.03.17
00:04
блин. придется математику вспоминать......
27 Diman000
 
22.03.17
00:06
Ставлю тельца против яйца, что SQL-запросом такая задача не решается.
Выбрал запросом для начала все что надо, а дальше математику вспоминать вместе с Франсем))
28 DrShad
 
22.03.17
00:06
тебе не нужны движения с субконто )))
29 France
 
22.03.17
00:11
(27) запросом решается.. вот, мне бы математику подтянуть - и без яйца кто то остался бы))
30 DrShad
 
22.03.17
00:14
у меня с математикой беда
31 Lolipop
 
22.03.17
00:16
(29) Да, запросом решается.
Я уже понял, что движения с субконто не нужны.
Спасибо всем.

Пытаю обороты, вот только все равно получается лабуда из (1).
Эти дубли по ДТ и КТ меня убивают.

Простым кодом сделать легко, а вот запросом...
32 France
 
22.03.17
00:27
да блин, ужо сложно студенчество вспомнить, тем более не знакомую математику. но, нужно матрицы друючить..
33 Lolipop
 
22.03.17
10:14
(32) Тут математики 0. Одна логика
34 RomanYS
 
22.03.17
11:58
(31) Запросом можно легко получить пары не корреспондирующих счетов. А вот собрать их в группы проблематично. А с условием "на минимальное количество групп" сильно сомневаюсь, что "кодом сделать легко".
35 Ildarovich
 
22.03.17
12:33
(34) По задаче бухучет за уши притянут. Корреспондирующие счета тут просто структуру графа задают, вершины которого нужно разбить на минимальное число групп(классов) так, что вершины одного класса не связаны друг с другом. Классов может получиться от 1 (для несвязного графа) до N (для полносвязного графа).
Допустимое решение легко получить.
Для этого нужно наращивать классы один за другим, присоединяю к текущему классу вершину, удовлетворяющую условию несвязности ни с одной вершиной, уже включенную в эту группу.
Присоединить можно на одном шаге разные вершины. Появляются варианты. Это можно решить рекурсией. Проблема в том, что вариантов может получиться слишком много для перебора.
Поэтому минимальное количество групп как глобально-оптимальное решение получить вряд ли получится из-за размера задачи.
А вот локально-оптимальное - легко.
После прояснения алгоритма уже будет ясно, как его решать - кодом или запросом.
Была бы задача практической - было бы интересно, но это, к сожалению, не так.
36 PCcomCat
 
22.03.17
12:56
Выбрать проводки в таблицу. А затем сделать левое соединение таблицы с собой по Т1.СчетДт = Т2.СчетКт или Т1.СчетДт.Родитель = Т2.СчетКт.Родитель. Как-то так...
37 RomanYS
 
22.03.17
13:03
(35) Практическая задача: рассадить гостей за минимальное число столов чтобы за каждым столом не оказалось знакомых между собой)
А так с оценкой полностью согласен.
38 Мимохожий Однако
 
22.03.17
13:07
(0) зачем все это? Озвучь задачу, а не твои попытки
39 Мимохожий Однако
 
22.03.17
13:09
(25) План счетов для того и придуман, чтобы счета между собой взаимодействовали. В чем цель отчета кроме способа решения?
40 RomanYS
 
22.03.17
17:40
(38) (39) цель в (22), задача в (25).
План счетов здесь не более чем декорация.
41 France
 
22.03.17
23:41
(33) угу... почитай 35..