[РЕШЕНО] Сравнить 2 набора данных

Тема в разделе "Система компоновки данных (СКД)", создана пользователем lezhek, 27 авг 2015.

  1. TopicStarter Overlay
    lezhek
    Offline

    lezhek

    Регистрация:
    5 авг 2014
    Сообщения:
    30
    Симпатии:
    0
    Баллы:
    1
    Подскажите пожалуйста, можно ли в СКД создать 2 набора данных, сравнить их между собой и вывести те значения которые различаются?
  2. nomad_irk
    Online

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.580
    Симпатии:
    717
    Баллы:
    204
    Это и обычным запросом можно сделать, не обязательно именно СКД для этого использовать.
  3. Draco
    Online

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.649
    Симпатии:
    948
    Баллы:
    204
    Как сказали, лучше это сделать в запросе просто. т.к если в СКд два набора данных то их либо объеденяют либо идет левое соединение.
  4. alexburn
    Offline

    alexburn Модераторы Команда форума Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    14.782
    Симпатии:
    509
    Баллы:
    204
    Да, при использовании нескольких наборов в СКД идет левое соединение.
  5. TopicStarter Overlay
    lezhek
    Offline

    lezhek

    Регистрация:
    5 авг 2014
    Сообщения:
    30
    Симпатии:
    0
    Баллы:
    1
    Подскажите пожалуйста, как лучше в запросе это сделать
  6. Draco
    Online

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.649
    Симпатии:
    948
    Баллы:
    204
    Сложно сказать т.к задача плохо сформулирована, хотя бы какие исходные данные или что
    т.к вариантов несколько
  7. TopicStarter Overlay
    lezhek
    Offline

    lezhek

    Регистрация:
    5 авг 2014
    Сообщения:
    30
    Симпатии:
    0
    Баллы:
    1
    Два регистра: товары на складах и партии надо найти в них различие и вывести эти данные
  8. nomad_irk
    Online

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.580
    Симпатии:
    717
    Баллы:
    204
    объединяем 2 таблицы, группируем результат, проверяем равенство значений в двух колонках, если не равно - выводим
  9. Draco
    Online

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.649
    Симпатии:
    948
    Баллы:
    204
    ну тут можно просто берете один регистр Склад номенклатура количество
    объеденяете со вторым регистром только количество умножайте на -1
    и выводите то что не равно нулю
    В итоге те что больше нуля знаячит есть в первом во втором нет, что меньше нуля наоборот
  10. TopicStarter Overlay
    lezhek
    Offline

    lezhek

    Регистрация:
    5 авг 2014
    Сообщения:
    30
    Симпатии:
    0
    Баллы:
    1
    Код:
    ВЫБРАТЬ
        ПартииТоваровНаСкладахБухгалтерскийУчет.Регистратор КАК Регистратор,
        ПартииТоваровНаСкладахБухгалтерскийУчет.Номенклатура,
        ПартииТоваровНаСкладахБухгалтерскийУчет.ХарактеристикаНоменклатуры,
        ПартииТоваровНаСкладахБухгалтерскийУчет.Количество как количество1
        ТоварыНаСкладах.Регистратор как Регигистратор,
        ТоварыНаСкладах.Номенклатура,
        ТоварыНаСкладах.ХарактеристикаНоменклатуры,
        ТоварыНаСкладах.Количество как количетсво2
           
    ИЗ
        РегистрНакопления.ПартииТоваровНаСкладахБухгалтерскийУчет КАК ПартииТоваровНаСкладахБухгалтерскийУчет Полное Соединение
        РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах
    по 
    ПартииТоваровНаСкладахБухгалтерскийУчет.Регистратор=ТоварыНаСкладах.Регистратор,
    ПартииТоваровНаСкладахБухгалтерскийУчет.Номенклатура=ТоварыНаСкладах.Номенклатура,
    ПартииТоваровНаСкладахБухгалтерскийУчет.Номенклатура=ПартииТоваровНаСкладахБухгалтерскийУчет.ХарактеристикаНоменклатуры
    Подскажите ,что не правильно при Соединении?
    Последнее редактирование модератором: 28 авг 2015
  11. nomad_irk
    Online

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.580
    Симпатии:
    717
    Баллы:
    204
    нужно ОБЪЕДИНЕНИЕ
  12. Yuriy_Alexandrovich
    Offline

    Yuriy_Alexandrovich Профессионал в 1С Команда форума

    Регистрация:
    15 сен 2011
    Сообщения:
    1.275
    Симпатии:
    76
    Баллы:
    54
    Доброго всем
    Код:
    ВЫБРАТЬ
        ПартииТоваровНаСкладахБухгалтерскийУчет.Регистратор КАК РегистраторПоБУ,
        ПартииТоваровНаСкладахБухгалтерскийУчет.Номенклатура,
        ПартииТоваровНаСкладахБухгалтерскийУчет.ХарактеристикаНоменклатуры,
        ПартииТоваровНаСкладахБухгалтерскийУчет.Количество КАК КоличествоПоБУ,
        ТоварыНаСкладах.Регистратор КАК РегигистраторПоУУ,
        ТоварыНаСкладах.Номенклатура,
        ТоварыНаСкладах.ХарактеристикаНоменклатуры,
        ТоварыНаСкладах.Количество КАК КоличетсвоНаСкладах
        
    ИЗ
        РегистрНакопления.ПартииТоваровНаСкладахБухгалтерскийУчет КАК ПартииТоваровНаСкладахБухгалтерскийУчет
        ПОЛНОЕ СОЕДИНЕНИЕ
              РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах
        ПО ПартииТоваровНаСкладахБухгалтерскийУчет.Регистратор  = ТоварыНаСкладах.Регистратор И
    ПартииТоваровНаСкладахБухгалтерскийУчет.Номенклатура = ТоварыНаСкладах.Номенклатура И
    ПартииТоваровНаСкладахБухгалтерскийУчет.Номенклатура = ПартииТоваровНаСкладахБухгалтерскийУчет.ХарактеристикаНоменклатуры
    
    // Добавляем отсев соединившихся записей :
    ГДЕ
      ТоварыНаСкладах.Регистратор ЕСТЬ NULL
      ИЛИ ПартииТоваровНаСкладахБухгалтерскийУчет.Регистратор ЕСТЬ NULL
    
  13. Draco
    Online

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.649
    Симпатии:
    948
    Баллы:
    204
    С точки зрения производитеьности объеденение будет быстрее работать.
    И еще про регистраторы. Представляете сколько он сейчас таблиц в запрос потянет.
    и у Вас не попадут те значения которые по количеству отличаются, например по одному регистру списалось 2, по другому 3 шт.
    при этом у Вас условие то по регистратору номенклатуре и характеритике выполниться. но данные то в регистрах разные
  14. TopicStarter Overlay
    lezhek
    Offline

    lezhek

    Регистрация:
    5 авг 2014
    Сообщения:
    30
    Симпатии:
    0
    Баллы:
    1
    Подскажите , При объединении не убрались повторяющиеся значения а стали друг за другом, как можно оставить только не повторяющиеся значения
    ВЫБРАТЬ
    ПартииТоваровНаСкладахБухгалтерскийУчет.Регистратор КАК Регистратор,
    ПартииТоваровНаСкладахБухгалтерскийУчет.Номенклатура,
    ПартииТоваровНаСкладахБухгалтерскийУчет.ХарактеристикаНоменклатуры,
    ПартииТоваровНаСкладахБухгалтерскийУчет.Количество как количество1,
    0 как количество2,
    ПартииТоваровНаСкладахБухгалтерскийУчет.Период
    ИЗ
    РегистрНакопления.ПартииТоваровНаСкладахБухгалтерскийУчет КАК ПартииТоваровНаСкладахБухгалтерскийУчет
    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
    ТоварыНаСкладах.Регистратор КАК Регистратор,
    ТоварыНаСкладах.Номенклатура,
    ТоварыНаСкладах.ХарактеристикаНоменклатуры,
    0 как Количетсво1,
    ТоварыНаСкладах.Количество как количество2,
    ТОварыНаСкладах.Период
    ИЗ
    РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах
  15. Yuriy_Alexandrovich
    Offline

    Yuriy_Alexandrovich Профессионал в 1С Команда форума

    Регистрация:
    15 сен 2011
    Сообщения:
    1.275
    Симпатии:
    76
    Баллы:
    54
    В данном случае, не уверен в этом утверждении. (мы из объединения исключаем область пересечения выборок)
    --- Объединение сообщений, 28 авг 2015 ---
    В этом запросе вы получите выборки записей как по БУ так и по складам, вы не получаете разницу !
    Для реализации вашей задумки, описанной в начале поста, в объединяемые запросы (каждый) необходимо добавить левые соединения с соответствующими условиями соединения
  16. Draco
    Online

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.649
    Симпатии:
    948
    Баллы:
    204
    1.мы после объеденения по тому же условию практически можем отсеять. Мы же после объеденения выберем то что не равно нулю. т.е одинаковые строки йдут.
    2. Практически всегда Быстрее объеденение работает. Левое соеденение там еще все зависит от того как он план построит и т.д. и сколько в выюорке будет т.к субд план запроса соеинения строит в зависимости от того какое количество будет слева и справа.
  17. Yuriy_Alexandrovich
    Offline

    Yuriy_Alexandrovich Профессионал в 1С Команда форума

    Регистрация:
    15 сен 2011
    Сообщения:
    1.275
    Симпатии:
    76
    Баллы:
    54
    по поводу, что быстрее, набросал тест, с замером производительности получается следующее :
    upload_2015-8-28_11-55-58.png

    upload_2015-8-28_11-56-16.png

    upload_2015-8-28_11-56-37.png

    текст модуля обработки :
    Код:
    Процедура ЗамерПроизводительности_1()
     
        Запрос = Новый Запрос;
        Запрос.Текст = "
        |ВЫБРАТЬ
        |    ПартииТоваровНаСкладахБухгалтерскийУчет.Регистратор,
        |    ПартииТоваровНаСкладахБухгалтерскийУчет.Номенклатура,
        |    ПартииТоваровНаСкладахБухгалтерскийУчет.ХарактеристикаНоменклатуры,
        |    ПартииТоваровНаСкладахБухгалтерскийУчет.Количество,
        |    ТоварыНаСкладах.Регистратор КАК Регистратор1,
        |    ТоварыНаСкладах.Номенклатура КАК Номенклатура1,
        |    ТоварыНаСкладах.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры1,
        |    ТоварыНаСкладах.Количество КАК Количество1
        |ИЗ
        |    РегистрНакопления.ПартииТоваровНаСкладахБухгалтерскийУчет КАК ПартииТоваровНаСкладахБухгалтерскийУчет
        |    ПОЛНОЕ СОЕДИНЕНИЕ
        |        РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах
        |    ПО ПартииТоваровНаСкладахБухгалтерскийУчет.Регистратор = ТоварыНаСкладах.Регистратор
        |        И ПартииТоваровНаСкладахБухгалтерскийУчет.Номенклатура = ТоварыНаСкладах.Номенклатура
        |        И ПартииТоваровНаСкладахБухгалтерскийУчет.ХарактеристикаНоменклатуры = ТоварыНаСкладах.ХарактеристикаНоменклатуры
        |    ГДЕ
        |        ПартииТоваровНаСкладахБухгалтерскийУчет.Период МЕЖДУ НАЧАЛОПЕРИОДА(&ДатаПериода, ГОД) И КОНЕЦПЕРИОДА(&ДатаПериода, ГОД)
        |        И ТоварыНаСкладах.Период МЕЖДУ НАЧАЛОПЕРИОДА(&ДатаПериода, ГОД) И КОНЕЦПЕРИОДА(&ДатаПериода, ГОД)
        |        И (ПартииТоваровНаСкладахБухгалтерскийУчет.Регистратор ЕСТЬ NULL
        |            ИЛИ ТоварыНаСкладах.Регистратор ЕСТЬ NULL)
        |";
        Запрос.УстановитьПараметр("ДатаПериода", Дата('20121212'));
        Запрос.Выполнить();
     
    КонецПроцедуры
    
    Процедура ЗамерПроизводительности_2()
     
        Запрос = Новый Запрос;
        Запрос.Текст = "
        |ВЫБРАТЬ
        |    ПартииТоваровНаСкладахБухгалтерскийУчет.Регистратор,
        |    ПартииТоваровНаСкладахБухгалтерскийУчет.Номенклатура,
        |    ПартииТоваровНаСкладахБухгалтерскийУчет.ХарактеристикаНоменклатуры,
        |    ПартииТоваровНаСкладахБухгалтерскийУчет.Количество,
        |    ТоварыНаСкладах.Регистратор КАК Регистратор1,
        |    ТоварыНаСкладах.Номенклатура КАК Номенклатура1,
        |    ТоварыНаСкладах.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры1,
        |    ТоварыНаСкладах.Количество КАК Количество1
        |ИЗ
        |(    ВЫБРАТЬ
        |        ПартииТоваровНаСкладахБухгалтерскийУчет.Регистратор,
        |        ПартииТоваровНаСкладахБухгалтерскийУчет.Номенклатура,
        |        ПартииТоваровНаСкладахБухгалтерскийУчет.ХарактеристикаНоменклатуры,
        |        ПартииТоваровНаСкладахБухгалтерскийУчет.Количество
        |    ИЗ
        |        РегистрНакопления.ПартииТоваровНаСкладахБухгалтерскийУчет КАК ПартииТоваровНаСкладахБухгалтерскийУчет
        |    ГДЕ
        |        ПартииТоваровНаСкладахБухгалтерскийУчет.Период МЕЖДУ НАЧАЛОПЕРИОДА(&ДатаПериода, ГОД) И КОНЕЦПЕРИОДА(&ДатаПериода, ГОД)
        |) КАК ПартииТоваровНаСкладахБухгалтерскийУчет
        |    ПОЛНОЕ СОЕДИНЕНИЕ
        |    (    ВЫБРАТЬ
        |            ТоварыНаСкладах.Регистратор,
        |            ТоварыНаСкладах.Номенклатура,
        |            ТоварыНаСкладах.ХарактеристикаНоменклатуры,
        |            ТоварыНаСкладах.Количество
        |        ИЗ
        |            РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах
        |        ГДЕ
        |            ТоварыНаСкладах.Период МЕЖДУ НАЧАЛОПЕРИОДА(&ДатаПериода, ГОД) И КОНЕЦПЕРИОДА(&ДатаПериода, ГОД)
        |    ) КАК ТоварыНаСкладах
        |    ПО ПартииТоваровНаСкладахБухгалтерскийУчет.Регистратор = ТоварыНаСкладах.Регистратор
        |        И ПартииТоваровНаСкладахБухгалтерскийУчет.Номенклатура = ТоварыНаСкладах.Номенклатура
        |        И ПартииТоваровНаСкладахБухгалтерскийУчет.ХарактеристикаНоменклатуры = ТоварыНаСкладах.ХарактеристикаНоменклатуры
        |ГДЕ (ПартииТоваровНаСкладахБухгалтерскийУчет.Регистратор ЕСТЬ NULL
        |    ИЛИ ТоварыНаСкладах.Регистратор ЕСТЬ NULL)
        |";
        Запрос.УстановитьПараметр("ДатаПериода", Дата('20121212'));
        Запрос.Выполнить();
     
    КонецПроцедуры
    
    Процедура ЗамерПроизводительности_3()
     
        Запрос = Новый Запрос;
        Запрос.Текст = "
        |ВЫБРАТЬ
        |    ПартииТоваровНаСкладахБухгалтерскийУчет.Регистратор,
        |    ПартииТоваровНаСкладахБухгалтерскийУчет.Номенклатура,
        |    ПартииТоваровНаСкладахБухгалтерскийУчет.ХарактеристикаНоменклатуры,
        |    ПартииТоваровНаСкладахБухгалтерскийУчет.Количество
        |ИЗ
        |    РегистрНакопления.ПартииТоваровНаСкладахБухгалтерскийУчет КАК ПартииТоваровНаСкладахБухгалтерскийУчет
        |    ЛЕВОЕ СОЕДИНЕНИЕ
        |        РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах
        |    ПО ПартииТоваровНаСкладахБухгалтерскийУчет.Регистратор = ТоварыНаСкладах.Регистратор
        |        И ПартииТоваровНаСкладахБухгалтерскийУчет.Номенклатура = ТоварыНаСкладах.Номенклатура
        |        И ПартииТоваровНаСкладахБухгалтерскийУчет.ХарактеристикаНоменклатуры = ТоварыНаСкладах.ХарактеристикаНоменклатуры
        |ГДЕ
        |    ПартииТоваровНаСкладахБухгалтерскийУчет.Период МЕЖДУ НАЧАЛОПЕРИОДА(&ДатаПериода, ГОД) И КОНЕЦПЕРИОДА(&ДатаПериода, ГОД)
        |    И ТоварыНаСкладах.Регистратор ЕСТЬ NULL
        |
        |ОБЪЕДИНИТЬ
        |
        |ВЫБРАТЬ
        |    ТоварыНаСкладах.Регистратор,
        |    ТоварыНаСкладах.Номенклатура,
        |    ТоварыНаСкладах.ХарактеристикаНоменклатуры,
        |    ТоварыНаСкладах.Количество
        |ИЗ
        |    РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах
        |    ЛЕВОЕ СОЕДИНЕНИЕ
        |        РегистрНакопления.ПартииТоваровНаСкладахБухгалтерскийУчет КАК ПартииТоваровНаСкладахБухгалтерскийУчет
        |    ПО ПартииТоваровНаСкладахБухгалтерскийУчет.Регистратор = ТоварыНаСкладах.Регистратор
        |        И ПартииТоваровНаСкладахБухгалтерскийУчет.Номенклатура = ТоварыНаСкладах.Номенклатура
        |        И ПартииТоваровНаСкладахБухгалтерскийУчет.ХарактеристикаНоменклатуры = ТоварыНаСкладах.ХарактеристикаНоменклатуры
        |ГДЕ
        |    ТоварыНаСкладах.Период МЕЖДУ НАЧАЛОПЕРИОДА(&ДатаПериода, ГОД) И КОНЕЦПЕРИОДА(&ДатаПериода, ГОД)
        |    И ПартииТоваровНаСкладахБухгалтерскийУчет.Регистратор ЕСТЬ NULL
        |";
        Запрос.УстановитьПараметр("ДатаПериода", Дата('20121212'));
        Запрос.Выполнить();
     
    КонецПроцедуры
    
    ЗамерПроизводительности_1();
    ЗамерПроизводительности_1();
    ЗамерПроизводительности_1();
    
    ЗамерПроизводительности_2();
    ЗамерПроизводительности_2();
    ЗамерПроизводительности_2();
    
    ЗамерПроизводительности_3();
    ЗамерПроизводительности_3();
    ЗамерПроизводительности_3();
    
    
    
    // END
    --- Объединение сообщений, 28 авг 2015 ---
    Посмотреть вложение 20066
    --- Объединение сообщений, 28 авг 2015 ---
    upload_2015-8-28_12-4-38.png
    Последнее редактирование: 28 авг 2015
  18. nomad_irk
    Online

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.580
    Симпатии:
    717
    Баллы:
    204
    Вы там прикалываетесь что ли? Для чего все эти соединения таблиц при объединении?
    Код:
    Выбрать
    Регистратор,
    Номенклатура,
    Склад
    Сумма(КоличествоОборот)
    ИЗ (
    
    Выбрать
    Регистратор,
    Номенклатура,
    Склад,
    КоличествоОборот
    Из РегистрНакопления.ТоварыНаСкладах.Обороты()
    
    ОБЪЕДИНИТЬ ВСЕ
    Выбрать
    Регистратор,
    Номенклатура,
    Склад,
    -КоличествоОборот
    Из РегистрНакопления.ПартииТоваровНаСкладах.Обороты())
    
    Сгруппировать ПО
    Регистратор,
    Номенклатура,
    Склад
    
    ИМЕЮЩИЕ
    Сумма(КоличествоОборот) <> 0
  19. Draco
    Online

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.649
    Симпатии:
    948
    Баллы:
    204
    то же хотел спросить. зачем про объеденени там еще и левое соединение
    --- Объединение сообщений, 28 авг 2015 ---
    И второе вы когда леаете замер производительности учитывайте, что вот у Вас есть запрос, и выборка данных после того как вы его перавй раз выполнили данные у вас уже есть в оперативе и второй запрос - он уже данные из оперативы считает а не с диска и может быть быстрее.
  20. nomad_irk
    Online

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.580
    Симпатии:
    717
    Баллы:
    204
    Да там даже не ЛЕВОЕ, а ПОЛНОЕ....т.е. вообще ВСЕ строки из реальных таблиц тянем.

Поделиться этой страницей