8.х Наложить условие в запросе по строкам подзапроса

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

  1. TopicStarter Overlay
    Itsys
    Offline

    Itsys Опытный в 1С

    Регистрация:
    3 янв 2010
    Сообщения:
    1.394
    Симпатии:
    0
    Баллы:
    26
    Добрый день,

    Может кто знает, видел где-то, что в запросе можно наложить условие на результат построчно по подзапросу. Т.е. есть запрос, который возвращает 100 строк, надо его построчно сравнить с другим запросом, сохраненным во временную таблицу, т.е. в результате должны остаться только те строки, которые отсутствуют в подзапросе.
  2. TopicStarter Overlay
    Itsys
    Offline

    Itsys Опытный в 1С

    Регистрация:
    3 янв 2010
    Сообщения:
    1.394
    Симпатии:
    0
    Баллы:
    26
    Эх... помню недавно видел на партнерском форуме, но найти никак не могу....
  3. HexaD
    Offline

    HexaD Опытный в 1С

    Регистрация:
    19 июн 2010
    Сообщения:
    59
    Симпатии:
    0
    Баллы:
    26
    Не знаю насчёт построчного сравнения, но выбрать некоторые данные вложенным запросом, а потом исключить эти данные во внешней выборке можно, например, так:

    Код:
    ВЫБРАТЬ
    |    РаботникиВзаиморасчеты.Физлицо,
    |    РаботникиВзаиморасчеты.СуммаВзаиморасчетовОборот,
    |    РаботникиВзаиморасчеты.СуммаВзаиморасчетовПриход,
    |    РаботникиВзаиморасчеты.СуммаВзаиморасчетовРасход
    |ИЗ
    |    РегистрНакопления.ВзаиморасчетыСРаботникамиОрганизаций.Обороты(
    |    ,
    |    ,
    |    ,
    |    (НЕ Физлицо В
    |         (ВЫБРАТЬ
    |          НачислениеЗарплатыРаботникамОрганизацийНачисления.Физлицо
    |          ИЗ
    |          Документ.НачислениеЗарплатыРаботникамОрганизаций.Начисления КАК НачислениеЗарплатыРаботникамОрганизацийНачисления
    |          ГДЕ
    |          НачислениеЗарплатыРаботникамОрганизацийНачисления.Ссылка = &Ссылка))) КАК РаботникиВзаиморасчеты
    
    
  4. TopicStarter Overlay
    Itsys
    Offline

    Itsys Опытный в 1С

    Регистрация:
    3 янв 2010
    Сообщения:
    1.394
    Симпатии:
    0
    Баллы:
    26
    А если "значащих" полей больше одного?
    Для примера:
    Результат "исходного" запроса:
    Контрагент, ВидРасчетов
    Конт1, Услуги
    Конт1, Аванс
    Конт2, Услуги
    Конт2, Аванс
    Конт3, Товар

    Подзапрос:
    Контрагент, ВидРасчетов
    Конт1, Услуги
    Конт2, Аванс

    Требуемый результат:
    Контрагент, ВидРасчетов
    Конт1, Аванс
    Конт2, Услуги
    Конт3, Товар
  5. HexaD
    Offline

    HexaD Опытный в 1С

    Регистрация:
    19 июн 2010
    Сообщения:
    59
    Симпатии:
    0
    Баллы:
    26
    Хмм.. Тогда я не знаю. Но Яндекс, похоже, знает :unsure: . Видимо, это то, что вы пытались найти:
    http://www.1c-h.ru/?p=917
  6. TopicStarter Overlay
    Itsys
    Offline

    Itsys Опытный в 1С

    Регистрация:
    3 янв 2010
    Сообщения:
    1.394
    Симпатии:
    0
    Баллы:
    26
    Это тоже по одному реквизиту да и не очень красивое решение само по себе... требующее кучу памяти при работе с большим количеством данных.
    Видел более красивое решение в блоке "ГДЕ"
  7. HexaD
    Offline

    HexaD Опытный в 1С

    Регистрация:
    19 июн 2010
    Сообщения:
    59
    Симпатии:
    0
    Баллы:
    26
    В предыдущем примере 1 реквизит, но можно, если я правильно понимаю, добавить и больше реквизитов, логика от этого не изменится.

    Через ГДЕ была мысль сделать, но результаты, почему-то, получаются не такие как нужно. Если разберусь - напишу.
  8. TopicStarter Overlay
    Itsys
    Offline

    Itsys Опытный в 1С

    Регистрация:
    3 янв 2010
    Сообщения:
    1.394
    Симпатии:
    0
    Баллы:
    26
    Там запись что-то типа:
    Код:
    ГДЕ
    (Контрагент, ВидРасчетов) В (ТаблицаПодзапроса)
    
  9. TopicStarter Overlay
    Itsys
    Offline

    Itsys Опытный в 1С

    Регистрация:
    3 янв 2010
    Сообщения:
    1.394
    Симпатии:
    0
    Баллы:
    26
    Немного ошибся :)
    Код:
    ГДЕ
    (Контрагент, ВидРасчетов) В ((ВЫБРАТЬ Контрагент, ВидРасчетов ИЗ ТаблицаПодзапроса) КАК Подзапрос)
    
  10. HexaD
    Offline

    HexaD Опытный в 1С

    Регистрация:
    19 июн 2010
    Сообщения:
    59
    Симпатии:
    0
    Баллы:
    26
    Да, точно, тоже нашёл. Раньше думал, что в выражении "В" можно только один параметр давать. Оказывается, можно больше через запятую, главное, чтобы во вложенном запросе было столько же полей.
  11. mialord
    Offline

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

    Регистрация:
    31 июл 2009
    Сообщения:
    5.400
    Симпатии:
    40
    Баллы:
    54
    А теперь, если не сложно не могли бы более детальней описать данный метод для бужущего поколения :unsure: , заранее благодарю.
  12. HexaD
    Offline

    HexaD Опытный в 1С

    Регистрация:
    19 июн 2010
    Сообщения:
    59
    Симпатии:
    0
    Баллы:
    26
    А, ну, пожалуйста :unsure: . Itsys уже привёл лаконичный пример. Вот мой:

    Код:
    ВЫБРАТЬ
    ЦеныНоменклатуры.Номенклатура,
    ЦеныНоменклатуры.Цена,
    ЦеныНоменклатуры.Регистратор
    ИЗ
    РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
    ГДЕ
    (ЦеныНоменклатуры.Номенклатура, ЦеныНоменклатуры.Цена) НЕ В
    (ВЫБРАТЬ
    УстановкаЦенНоменклатурыТовары.Номенклатура КАК Номенклатура1,
    УстановкаЦенНоменклатурыТовары.Цена КАК Цена
    ИЗ
    Документ.УстановкаЦенНоменклатуры.Товары КАК УстановкаЦенНоменклатурыТовары
    ГДЕ
    УстановкаЦенНоменклатурыТовары.Ссылка = &Ссылка)
    
    
    Для меня тут в новинку было то, что в блоке "ГДЕ" вложенный запрос может служить условием не только по одному полю, а сразу по нескольким. Т.е. внутренним запросом можно выбрать какие-то данные, а потом исключить те строки во внешнем запросе, которые совпали со строками внутреннего запроса одновременно по 2-ум полям: Номенклатура и Цена.

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