8.х Запрос при формировании динамического списка

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

  1. TopicStarter Overlay
    Leprecus
    Offline

    Leprecus Опытный в 1С

    Регистрация:
    12 окт 2015
    Сообщения:
    80
    Симпатии:
    0
    Баллы:
    26
    Добрый день, как и впредь, сразу прошу прощения за элементарные вопросы, но никак не удаётся самостоятельно разобраться со сложными запросами. Подскажите пожалуйста.

    Начну с простого: Имеются документы ЗаказКлиента, соответственно справочник Контрагенты в табличной части КонтактнаяИнформация которого адрес эл. почты. Хочу вывести список на форму, но как не ковырял в конструкторе - результата нужно не получил. Какие соединения нужно использовать и как связать данные?

    Нужно вывести след поля:
    Документ.ЗаказКлиента.Номер
    Справочник.Контрагенты.Наименование
    Справочник.Контрагенты.КонтактнаяИнформация.АдресЭП
  2. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.565
    Симпатии:
    716
    Баллы:
    204
    Быть может стОит сперва прочитать про язык запросов, про виды соединений таблиц? Какой смысл говорить о виде требуемых соединений, если вы даже не представляете себе, как оно работает и в чем различия этих соединений?

    ответ на вопрос: Левое/Правое Внешнее по Контрагенту
  3. TopicStarter Overlay
    Leprecus
    Offline

    Leprecus Опытный в 1С

    Регистрация:
    12 окт 2015
    Сообщения:
    80
    Симпатии:
    0
    Баллы:
    26
    Я читал, уверяю, но видимо не укладывается на сторонних примерах или теми словами что излагают( А может и просто запутался и зашёл в тупик.
  4. TopicStarter Overlay
    Leprecus
    Offline

    Leprecus Опытный в 1С

    Регистрация:
    12 окт 2015
    Сообщения:
    80
    Симпатии:
    0
    Баллы:
    26
    Вот так получаю затроенные строки, но адрес электронки только в одной из строк
    ВЫБРАТЬ
    ДокументЗаказКлиента.Номер,
    Контрагенты.Наименование,
    ВложенныйЗапрос.АдресЭП
    ИЗ
    Документ.ЗаказКлиента КАК ДокументЗаказКлиента
    ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты
    ПО ДокументЗаказКлиента.Контрагент = Контрагенты.Ссылка
    ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
    КонтрагентыКонтактнаяИнформация.АдресЭП КАК АдресЭП,
    Контрагенты.Ссылка КАК Ссылка
    ИЗ
    Справочник.Контрагенты КАК Контрагенты
    ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты.КонтактнаяИнформация КАК КонтрагентыКонтактнаяИнформация
    ПО (КонтрагентыКонтактнаяИнформация.Ссылка = Контрагенты.Ссылка)) КАК ВложенныйЗапрос
    ПО ДокументЗаказКлиента.Контрагент = ВложенныйЗапрос.Ссылка
  5. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.565
    Симпатии:
    716
    Баллы:
    204
    Для чего используется вложенный запрос?
    Для чего используется 2 соединения?
  6. TopicStarter Overlay
    Leprecus
    Offline

    Leprecus Опытный в 1С

    Регистрация:
    12 окт 2015
    Сообщения:
    80
    Симпатии:
    0
    Баллы:
    26
    Хороший вопрос. Но я боюсь на него не знаю ответа, говорю, что окончательно запутался.
    Давайте попробую все мысли в кучу собрать, что бы понять на каком шаге я захожу в тупик.
    Мне нужно выбрать все договора, для каждого из них выбрать контрагента, а после для каждого контрагента выбрать из табличной части АдресЭП. Тут то я не ошибаюсь?
  7. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.565
    Симпатии:
    716
    Баллы:
    204
    Ошибаетесь, т.к. значение контрагента уже есть в заказе, выполнять соединение со справочником контрагентов нет необходимости, если нет задачи получить значение какого-то реквизита элемента справочника и то, в случае 1С можно вообще явно не делать соединения - это сделает платформа не явно.

    Т.е. у вас будет всего одно соединение таблиц. подзапрос в данном случае так же лишний, указания правильного условия соединения таблиц вполне достаточно.
  8. TopicStarter Overlay
    Leprecus
    Offline

    Leprecus Опытный в 1С

    Регистрация:
    12 окт 2015
    Сообщения:
    80
    Симпатии:
    0
    Баллы:
    26
    Что значение контрагента уже есть в заказе я знаю, Но я думал что как раз соединение со справочником контрагентов потребуется для обращения к табличной части контрагентов.Значит это заблуждение?
  9. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.565
    Симпатии:
    716
    Баллы:
    204
    Не совсем заблуждение, т.к. в запросе можно обратится сразу к табличной части справочника и при необходимости сделать соединение с самим справочником. В вашем случае выполнять соединение с самим справочником нет необходимости.
  10. TopicStarter Overlay
    Leprecus
    Offline

    Leprecus Опытный в 1С

    Регистрация:
    12 окт 2015
    Сообщения:
    80
    Симпатии:
    0
    Баллы:
    26
    Хорошо, так получилось, потому что после мне всё же потребуются данный из справочника контрагенты, а сейчас упрощённый вариант. Вот что теперь получается. Строки так же затроены.
    ВЫБРАТЬ
    ДокументЗаказКлиента.Номер,
    КонтрагентыКонтактнаяИнформация.Ссылка,
    КонтрагентыКонтактнаяИнформация.АдресЭП
    ИЗ
    Документ.ЗаказКлиента КАК ДокументЗаказКлиента
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Контрагенты.КонтактнаяИнформация КАК КонтрагентыКонтактнаяИнформация
    ПО ДокументЗаказКлиента.Контрагент = КонтрагентыКонтактнаяИнформация.Ссылка

    Чего не хватает в этом то супе?
  11. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.565
    Симпатии:
    716
    Баллы:
    204
    Для получения значения АдресЭП - хватает всего. Для корректного отображения данных в списке ЗаказовКлиентов, вероятно нужны все остальные реквизиты заказов.

    Внутреннее соединение будет работать медленнее внешнего соединения.

    КонтрагентыКонтактнаяИнформация.Ссылка в данном случае можно не делать, т.к. одним из реквизитов ЗаказКлиента является Контрагент.
  12. TopicStarter Overlay
    Leprecus
    Offline

    Leprecus Опытный в 1С

    Регистрация:
    12 окт 2015
    Сообщения:
    80
    Симпатии:
    0
    Баллы:
    26
    Вы извините, я думаю, что меня с трудом приходится понимать, но я вообще вас не понимаю)
    Какие другие реквизиты? Мне нужно просто выбрать номер заказа и адрес электронной почты. Таким запросом

    ВЫБРАТЬ
    ДокументЗаказКлиента.Номер,
    КонтрагентыКонтактнаяИнформация.АдресЭП
    ИЗ
    Документ.ЗаказКлиента КАК ДокументЗаказКлиента
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Контрагенты.КонтактнаяИнформация КАК КонтрагентыКонтактнаяИнформация
    ПО ДокументЗаказКлиента.Контрагент = КонтрагентыКонтактнаяИнформация.Ссылка

    сформировал динамический список, и кинул его на форму, но строк в 3 раза больше( Это нормально?
    Может какие фильтры или условия нужно в запросе?
  13. TopicStarter Overlay
    Leprecus
    Offline

    Leprecus Опытный в 1С

    Регистрация:
    12 окт 2015
    Сообщения:
    80
    Симпатии:
    0
    Баллы:
    26
    Я лично предположил что запрос построен неверное и в нём я получаю избыточные данные, поэтому по своей неопытности и полез в те дебри с которых мы начали.
  14. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.565
    Симпатии:
    716
    Баллы:
    204
    Дубли в результате соединения таблиц получаются только в том случае, если в соединяемых таблицах содержатся не уникальные значения по ключевым полям соединения.
    Если строк ровно в 3 раза больше, значит в табличной части "Контактная информация" справочника Контрагенты содержится по 3 строки.
    Необходимо указать условия соединения таблиц так, чтобы соединение происходило по уникальным комбинациям значений полей соединяемых таблиц.
  15. TopicStarter Overlay
    Leprecus
    Offline

    Leprecus Опытный в 1С

    Регистрация:
    12 окт 2015
    Сообщения:
    80
    Симпатии:
    0
    Баллы:
    26
    Вы вот про эту строчку говорите?
    ПО ДокументЗаказКлиента.Контрагент = КонтрагентыКонтактнаяИнформация.Ссылка
  16. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.565
    Симпатии:
    716
    Баллы:
    204
  17. shurikvz
    Offline

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

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    ?
    разверни суждение.
  18. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.565
    Симпатии:
    716
    Баллы:
    204
    Проверяет абсолютно все значения в обоих таблицах по условиям соединения, при левом/правом - только наличие значений не основной таблицы.
  19. shurikvz
    Offline

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

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    ?
    это откуда, можно почитать?

    Вообще-то в моем представлении внешнее соединение в лучшем случае такое же по скорости как внутреннее, а так в общем оно медленнее, поскольку выполняет ровно ту же работу что и внутренее + ему еще надо достать недостающие записи из таблиц и заполнить их null. В каких-то определенных ситуациях допускаю что внешнее отработает быстрее, но в общем случае оно как бы вот как написал.
  20. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.565
    Симпатии:
    716
    Баллы:
    204
    Null - это ничего, оно не хранится, а генерируется как результат соединения таблиц при отсутствии искомой комбинации полей в условии соединения.
    Внутреннее же соединение проверяет наличие комбинаций полей соединения в обеих таблицах и выводит в результат только когда комбинации существуют во обеих соединяемых таблицах.

    Где почитать - должно быть в любой книге про SQL, по-идеи.
    Последнее редактирование: 9 дек 2015

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