8.х Почему теряются данные в запросе

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем Bkmz, 7 апр 2017.

  1. TopicStarter Overlay
    Bkmz
    Offline

    Bkmz Опытный в 1С

    Регистрация:
    6 июл 2013
    Сообщения:
    430
    Симпатии:
    12
    Баллы:
    29
    Мне надо выбрать всех партнеров и их почту.

    Я считаю корректный результат запроса я получу когда напишу его вот так:

    Код:
    ВЫБРАТЬ
        Партнеры.Ссылка КАК Ссылка
    ПОМЕСТИТЬ втПартнеры
    ИЗ
        Справочник.Партнеры КАК Партнеры
    ;
    
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        ПартнерыКонтактнаяИнформация.АдресЭП,
        ПартнерыКонтактнаяИнформация.Ссылка
    ПОМЕСТИТЬ втПочтаПартнеров
    ИЗ
        Справочник.Партнеры.КонтактнаяИнформация КАК ПартнерыКонтактнаяИнформация
    ГДЕ
        ПартнерыКонтактнаяИнформация.Вид = ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.EmailПартнера)
    ;
    
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        втПартнеры.Ссылка КАК Ссылка,
        втПочтаПартнеров.АдресЭП КАК АдресЭП
    ИЗ
        втПартнеры КАК втПартнеры
            ЛЕВОЕ СОЕДИНЕНИЕ втПочтаПартнеров КАК втПочтаПартнеров
            ПО (втПартнеры.Ссылка = втПочтаПартнеров.Ссылка)
    ;
    А вот этот варинт будет терять записис

    Код:
    ВЫБРАТЬ
        Партнеры.Ссылка КАК Партнер,
        ПартнерыКонтактнаяИнформация.АдресЭП КАК АдресЭП
    ИЗ
        Справочник.Партнеры КАК Партнеры
            ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Партнеры.КонтактнаяИнформация КАК ПартнерыКонтактнаяИнформация
            ПО (ПартнерыКонтактнаяИнформация.Ссылка = Партнеры.Ссылка)
    ГДЕ
        ПартнерыКонтактнаяИнформация.Вид = ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.EmailПартнера)
    ;
    
    Как так получается что второй запрос теряет записи?
    --- Объединение сообщений, 7 апр 2017 ---
    Я так подозреваю что причина в условии ГДЕ. Точней в его присутствии. Если его не будет то записи теряться не будут.

    Можно написать без временных таблиц с подзапросом,

    Код:
    ВЫБРАТЬ
       Партнеры.Ссылка КАК Партнер,
       ВложенныйЗапрос.АдресЭП
    ИЗ
       Справочник.Партнеры КАК Партнеры
         ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
           ПартнерыКонтактнаяИнформация.АдресЭП КАК АдресЭП,
           ПартнерыКонтактнаяИнформация.Ссылка КАК Ссылка
         ИЗ
           Справочник.Партнеры.КонтактнаяИнформация КАК ПартнерыКонтактнаяИнформация
         ГДЕ
           ПартнерыКонтактнаяИнформация.Вид = ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.EmailПартнера)) КАК ВложенныйЗапрос
         ПО Партнеры.Ссылка = ВложенныйЗапрос.Ссылка
    ;
    
    но я так понимаю что это не приветствуется с точки зрения 1с? Потому как при таком раскладе индексы не используются. А значит запрос будет выполнятся медленней.

    Но с другой стороны создание временных таблиц тоже занимает время.

    Какой вариант правильный?
    Последнее редактирование: 7 апр 2017
  2. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.408
    Симпатии:
    973
    Баллы:
    204
    Что ж вы так любите усложнять жизнь себе и SQL серверу-то? :)

    НИпАнятнА, что мешает сделать запрос:
    Код:
    Выбрать ПартнерыКонтактнаяИнформация.Ссылка КАК Партнер,
    ПартнерыКонтактнаяИнформация.АдресЭП КАК АдресЭП
    ИЗ
    Справочник.Партнеры.КонтактнаяИнформация КАК ПартнерыКонтактнаяИнформация
    ГДЕ
    ПартнерыКонтактнаяИнформация.Вид = ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.EmailПартнера)
    
    Bkmz нравится это.
  3. TopicStarter Overlay
    Bkmz
    Offline

    Bkmz Опытный в 1С

    Регистрация:
    6 июл 2013
    Сообщения:
    430
    Симпатии:
    12
    Баллы:
    29
    Тьфу. Точно. Недосып это. Спасибо
    --- Объединение сообщений, 7 апр 2017 ---
    Ну а вообще если бы я брал контактную иформацию из другого справочник
    --- Объединение сообщений, 7 апр 2017 ---
    Как по умном называются когда обращаются через ссылку табличной части на уровень вверх?

    Код:
    ВЫБРАТЬ
       ПартнерыКонтактнаяИнформация.АдресЭП,
       ПартнерыКонтактнаяИнформация.Ссылка,
       > ПартнерыКонтактнаяИнформация.Ссылка.Перевозчик
    ИЗ
       Справочник.Партнеры.КонтактнаяИнформация КАК ПартнерыКонтактнаяИнформация
    ГДЕ
       ПартнерыКонтактнаяИнформация.Вид = ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.EmailПартнера)
    
    Последнее редактирование: 12 апр 2017
  4. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.408
    Симпатии:
    973
    Баллы:
    204
    Тогда и запрос будет к Справочник.Перевозчики.КонтактнаяИнформация, либо как было раньше через регистр, можно ограничить тип значения измерения "Объект".

    Обращение через точку - это левое соединение с таблицей, содержащей запрашиваемые данные :)
  5. TopicStarter Overlay
    Bkmz
    Offline

    Bkmz Опытный в 1С

    Регистрация:
    6 июл 2013
    Сообщения:
    430
    Симпатии:
    12
    Баллы:
    29
    А если так ?

    Код:
    ВЫБРАТЬ
        Партнеры.Ссылка КАК Ссылка
    ПОМЕСТИТЬ втПартнеры
    ИЗ
        Справочник.Партнеры КАК Партнеры
    ;
    
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        ПартнерыКонтактнаяИнформация.АдресЭП,
        ПартнерыКонтактнаяИнформация.Ссылка
    ПОМЕСТИТЬ втПочтаПартнеров
    ИЗ
        Справочник.Партнеры.КонтактнаяИнформация КАК ПартнерыКонтактнаяИнформация
    ГДЕ
        ПартнерыКонтактнаяИнформация.Вид = ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.EmailПартнера)
    ;
    
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        втПартнеры.Ссылка КАК Ссылка,
        > ЕСТЬNULL(втПочтаПартнеров.АдресЭП, "e-mail не внесен") КАК АдресЭП
    ИЗ
        втПартнеры КАК втПартнеры
            ЛЕВОЕ СОЕДИНЕНИЕ втПочтаПартнеров КАК втПочтаПартнеров
            ПО втПартнеры.Ссылка = втПочтаПартнеров.Ссылка
  6. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.408
    Симпатии:
    973
    Баллы:
    204
    Какой смысл в соединении, если можно напрямую получить данные запросом к табличной части?
  7. TopicStarter Overlay
    Bkmz
    Offline

    Bkmz Опытный в 1С

    Регистрация:
    6 июл 2013
    Сообщения:
    430
    Симпатии:
    12
    Баллы:
    29
    Потому что если нет у него контактной информации то я не получу партнера. А мне они нужны в любом случае.
  8. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.408
    Симпатии:
    973
    Баллы:
    204
    Для чего нужен партнер без адреса?
  9. TopicStarter Overlay
    Bkmz
    Offline

    Bkmz Опытный в 1С

    Регистрация:
    6 июл 2013
    Сообщения:
    430
    Симпатии:
    12
    Баллы:
    29
    Чтобы увидеть что должник есть, а адреса электронной почты у него нет, чтоб послать ему письмо
  10. AlexeyKh
    Offline

    AlexeyKh Опытный в 1С

    Регистрация:
    27 июл 2012
    Сообщения:
    148
    Симпатии:
    18
    Баллы:
    29
    вот этот запрос немного не верно записан в рамках вашей задачи

    ВЫБРАТЬ
    Партнеры.Ссылка КАК Партнер,
    ПартнерыКонтактнаяИнформация.АдресЭП КАК АдресЭП
    ИЗ
    Справочник.Партнеры КАК Партнеры
    ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Партнеры.КонтактнаяИнформация КАК ПартнерыКонтактнаяИнформация
    ПО (ПартнерыКонтактнаяИнформация.Ссылка = Партнеры.Ссылка)
    ГДЕ
    ПартнерыКонтактнаяИнформация.Вид = ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.EmailПартнера)
    ;

    вы правы, всю вашу картину портит условие ГДЕ,
    так вывод же сам по себе напрашивается (тем более в других запросах вы так и делаете)
    Уберите условие из секции Где и поместите его в секцию Левого соединения.
    (читайте учебники по СКЛ там все это есть)

    ВЫБРАТЬ
    Партнеры.Ссылка КАК Партнер,
    //можно даже так красиво сделать
    ЕстьNull(ПартнерыКонтактнаяИнформация.АдресЭП, "Адреса нет.") КАК АдресЭП
    ИЗ
    Справочник.Партнеры КАК Партнеры
    ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Партнеры.КонтактнаяИнформация КАК ПартнерыКонтактнаяИнформация
    ПО (ПартнерыКонтактнаяИнформация.Ссылка = Партнеры.Ссылка)
    И ПартнерыКонтактнаяИнформация.Вид = ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.EmailПартнера)
    //ГДЕ
    ;
  11. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.408
    Симпатии:
    973
    Баллы:
    204
    В таком случае
    Делайте просто соединение, без выборки во временную таблицу.
    Код:
    ВЫБРАТЬ
    Партнеры.Ссылка КАК Партнер,
    ЕСТЬNULL(ПартнерыКонтактнаяИнформация.АдресЭП, "") КАК АдресЭП
    ИЗ
    Справочник.Партнеры КАК Партнеры
    ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Партнеры.КонтактнаяИнформация КАК ПартнерыКонтактнаяИнформация
    ПО Партнеры.Ссылка = ПартнерыКонтактнаяИнформация.Ссылка
    И ПартнерыКонтактнаяИнформация.Вид = ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.EmailПартнера)
    Bkmz нравится это.
  12. TopicStarter Overlay
    Bkmz
    Offline

    Bkmz Опытный в 1С

    Регистрация:
    6 июл 2013
    Сообщения:
    430
    Симпатии:
    12
    Баллы:
    29
    То что надо.

    Такого приема я и не знал

    [​IMG]
    Последнее редактирование: 7 апр 2017

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