Реклама на этом месте
Форум 1С
Форум 1С
Программистам. Бухгалтерам. Администраторам. Пользователям
Задай вопрос - получи решение проблемы. Без троллинга и флуда.
14 Ноя 2018, 01:48
МультиВход
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?
 
collapse

Автор Тема: Вторник. Вопрос 5  (Прочитано 55173 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн aprol

  • *
  • Сообщений: 35
  • РЕПУТАЦИЯ: 0
  • Регистрация: 2010-12-28
  • Сайт: 
  • Профессия: Консультант 1С
Re: Вторник. Вопрос 5
« Ответ #10: 12 Мар 2013, 10:31 »
ВЫБРАТЬ
      ЛимитыКредиторскойЗадолженности.Организация КАК Организация,
      ЛимитыКредиторскойЗадолженности.Контрагент КАК Контрагент,
      ЛимитыКредиторскойЗадолженности.Договор КАК Договор,
      СУММА(ЛимитыКредиторскойЗадолженности.Сумма) КАК Сумма
Поместить ЛимитыКредиторскойЗадолженности
ИЗ
      РегистрСведений.ЛимитыКредиторскойЗадолженности КАК ЛимитыКредиторскойЗадолженности
ГДЕ
      ЛимитыКредиторскойЗадолженности.Организация = &Организация
      И (ЛимитыКредиторскойЗадолженности.Договор.ДоговорСПодрядчиком
             ИЛИ ЛимитыКредиторскойЗадолженности.Договор.ДоговорСПоставщиком)
СГРУППИРОВАТЬ ПО
      ЛимитыКредиторскойЗадолженности.Организация,
      ЛимитыКредиторскойЗадолженности.Контрагент,
      ЛимитыКредиторскойЗадолженности.Договор
;

ВЫБРАТЬ
    ПоступлениеТоваровИУслуг.Ссылка,
    ПоступлениеТоваровИУслуг.Номер,
    ПоступлениеТоваровИУслуг.Договор,
    ПоступлениеТоваровИУслуг.Контрагент,
    ПоступлениеТоваровИУслуг.Организация,
    ПоступлениеТоваровИУслуг.Сумма,
    ПоступлениеТоваровИУслуг.Дата
ИЗ
    Документ.ПоступлениеТоваровИУслуг КАК ПоступлениеТоваровИУслуг
        ЛЕВОЕ СОЕДИНЕНИЕ ЛимитыКредиторскойЗадолженности КАК ЛимитыКредиторскойЗадолженности
        ПО ПоступлениеТоваровИУслуг.Контрагент = ЛимитыКредиторскойЗадолженности.Контрагент
            И ПоступлениеТоваровИУслуг.Договор = ЛимитыКредиторскойЗадолженности.Договор
ГДЕ
    (ПоступлениеТоваровИУслуг.Сумма < &МинимальнаяСуммаЗадолженности
            ИЛИ ПоступлениеТоваровИУслуг.Сумма < ЛимитыКредиторскойЗадолженности.Сумма)
    И (ПоступлениеТоваровИУслуг.Договор.ДоговорСПодрядчиком
            ИЛИ ПоступлениеТоваровИУслуг.Договор.ДоговорСПоставщиком)


1. тк у регистра 4ре измерения то сгруппировать придется оставить(для исключения перемножения множеств при соединении)
2. тк сгруппировать оставили, то вынесем вложенный запрос в виртуальную таблицу и соединятся будем уже с ней.
3. что бы уменьшить количество записей в виртуальной таблице добавим условие
        И (ЛимитыКредиторскойЗадолженности.Договор.ДоговорСПодрядчиком
             ИЛИ ЛимитыКредиторскойЗадолженности.Договор.ДоговорСПоставщиком)
    тк оно используется в результирующей выборке
4. непонятным осталось почему во вложенном запросе установлен отбор ко конкретной организации, а в итоговом не. Так то надо было бы либо исключить усорвие из вложенного запроса лиибо включить в итоговую.


Оффлайн Evga

  • *
  • Сообщений: 37
  • РЕПУТАЦИЯ: 0
  • Регистрация: 2013-02-28
  • Сайт: 
  • Профессия: Программист 1С
Re: Вторник. Вопрос 5
« Ответ #11: 12 Мар 2013, 10:54 »
Я бы сделал так:
ВЫБРАТЬ
ПоступлениеТоваровИУслуг.Ссылка,
ПоступлениеТоваровИУслуг.Номер,
ПоступлениеТоваровИУслуг.Договор,
ПоступлениеТоваровИУслуг.Контрагент,
ПоступлениеТоваровИУслуг.Организация,
ПоступлениеТоваровИУслуг.Сумма,
ПоступлениеТоваровИУслуг.Дата
ИЗ
Документ.ПоступлениеТоваровИУслуг КАК ПоступлениеТоваровИУслуг
ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
ЛимитыКредиторскойЗадолженности.Контрагент КАК Контрагент,
ЛимитыКредиторскойЗадолженности.Договор КАК Договор,
СУММА(ЛимитыКредиторскойЗадолженности.Сумма) КАК Сумма
ИЗ
РегистрСведений.ЛимитыКредиторскойЗадолженности КАК ЛимитыКредиторскойЗадолженности
ГДЕ
ЛимитыКредиторскойЗадолженности.Организация = &Организация
И (ЛимитыКредиторскойЗадолженности.Договор.ДоговорСПодрядчиком = ИСТИНА
ИЛИ ЛимитыКредиторскойЗадолженности.Договор.ДоговорСПоставщиком = ИСТИНА)

СГРУППИРОВАТЬ ПО
ЛимитыКредиторскойЗадолженности.Контрагент,
ЛимитыКредиторскойЗадолженности.Договор) КАК ЛимитыКредиторскойЗадолженности
ПО ПоступлениеТоваровИУслуг.Контрагент = ЛимитыКредиторскойЗадолженности.Контрагент
И ПоступлениеТоваровИУслуг.Договор = ЛимитыКредиторскойЗадолженности.Договор
ГДЕ
(ПоступлениеТоваровИУслуг.Сумма < &МинимальнаяСуммаЗадолженности
ИЛИ ПоступлениеТоваровИУслуг.Сумма < ЛимитыКредиторскойЗадолженности.Сумма)

1)Сделал бы внутреннее соединение, а не левое. Так как нам нужны только те документы, в которых сумма документа меньше суммы лимита. Если сумма лимита не будет установлена, то в запросе будет null. А при внутреннем соединении такого не будет и документы с контрагентами, у которых лимит не установлен - не попадут в выборку.
2)Условие на (Договор.ДоговорСПодрядчиком = ИСТИНА ИЛИ Договор.ДоговорСПоставщиком = ИСТИНА) перенес бы внутрь вложенного запроса, чтобы при условие на эти договора наложилось раньше. В предыдущем варианте условие накладывалось позже и сначала получится бОльшая таблица, а потом будет отсечение. В моем варианте будет при соединении получено таблица меньше.
3)Ну и выбирать организацию во вложенном запросе не вижу смысла, так как там идет жесткое условие на нее.

Оффлайн Spider244

  • *
  • Сообщений: 37
  • РЕПУТАЦИЯ: 0
  • Регистрация: 2011-07-26
  • Сайт: 
  • Профессия: Программист 1С
Re: Вторник. Вопрос 5
« Ответ #12: 12 Мар 2013, 10:56 »
ВЫБРАТЬ
ЛимитыКредиторскойЗадолженности.Организация КАК Организация,
ЛимитыКредиторскойЗадолженности.Контрагент КАК Контрагент,
ЛимитыКредиторскойЗадолженности.Договор КАК Договор,
СУММА(ЛимитыКредиторскойЗадолженности.Сумма) КАК Сумма
ПОМЕСТИТЬ ЛимитыКредиторскойЗадолженности
ИЗ
РегистрСведений.ЛимитыКредиторскойЗадолженности КАК ЛимитыКредиторскойЗадолженности
ГДЕ
ЛимитыКредиторскойЗадолженности.Организация = &Организация

СГРУППИРОВАТЬ ПО
ЛимитыКредиторскойЗадолженности.Организация,
ЛимитыКредиторскойЗадолженности.Контрагент,
ЛимитыКредиторскойЗадолженности.Договор
;

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

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

ОБЪЕДИНИТЬ ВСЕ

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

ОБЪЕДИНИТЬ ВСЕ

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

ОБЪЕДИНИТЬ ВСЕ

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

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

Оффлайн evgeny.s

  • *
  • Сообщений: 38
  • РЕПУТАЦИЯ: 0
  • Регистрация: 2011-01-07
  • Сайт: 
  • Профессия: Программист 8.1
Re: Вторник. Вопрос 5
« Ответ #13: 12 Мар 2013, 11:01 »
я бы использовал виртуальную а не физическую таблицу регистра сведений, за счет этого отбор по организации можно будет еще сделать до выполнения самого запроса, а не накладывать отбор по организации, по уже сформированному запросу.

Оффлайн kereo

  • *
  • Сообщений: 38
  • РЕПУТАЦИЯ: 0
  • Регистрация: 2010-11-26
  • Сайт: 
  • Профессия: Программист 1С
Re: Вторник. Вопрос 5
« Ответ #14: 12 Мар 2013, 11:03 »
Для построения более оптимального плана запросов я создам две временные таблицы. При создании таблицы ВТ_Лимиты использую в отборе таблицу ВТ_Поступления для уменьшения количества строк в ВТ_Лимиты. В обеих таблицах создам индексы для более быстрого отбора и соединения между таблицами. Для исключения появления ошибки при выполнении запроса в условии после левого соединения использую функцию ЕстьNull().
ВЫБРАТЬ
    ПоступлениеТоваровИУслуг.Ссылка,
    ПоступлениеТоваровИУслуг.Номер,
    ПоступлениеТоваровИУслуг.Договор,
    ПоступлениеТоваровИУслуг.Контрагент,
    ПоступлениеТоваровИУслуг.Организация,
    ПоступлениеТоваровИУслуг.Сумма,
    ПоступлениеТоваровИУслуг.Дата
ПОМЕСТИТЬ ВТ_Поступления
ИЗ
    Документ.ПоступлениеТоваровИУслуг КАК ПоступлениеТоваровИУслуг
ГДЕ
    (ПоступлениеТоваровИУслуг.Организация = &Организация)
    И (ПоступлениеТоваровИУслуг.Договор.ДоговорСПодрядчиком = ИСТИНА
        ИЛИ ПоступлениеТоваровИУслуг.Договор.ДоговорСПоставщиком = ИСТИНА)

ИНДЕКСИРОВАТЬ ПО
    ПоступлениеТоваровИУслуг.Контрагент,
    ПоступлениеТоваровИУслуг.Договор,
    ПоступлениеТоваровИУслуг.Организация

;

ВЫБРАТЬ
    ЛимитыКредиторскойЗадолженности.Организация КАК Организация,
    ЛимитыКредиторскойЗадолженности.Контрагент КАК Контрагент,
    ЛимитыКредиторскойЗадолженности.Договор КАК Договор,
    СУММА(ЛимитыКредиторскойЗадолженности.Сумма) КАК Сумма
ПОМЕСТИТЬ ВТ_Лимиты
ИЗ
    РегистрСведений.ЛимитыКредиторскойЗадолженности КАК ЛимитыКредиторскойЗадолженности
ГДЕ
    (ЛимитыКредиторскойЗадолженности.Контрагент, ЛимитыКредиторскойЗадолженности.Договор, ЛимитыКредиторскойЗадолженности.Организация) В
    (ВЫБРАТЬ
            ПоступлениеТоваровИУслуг.Контрагент,
    ПоступлениеТоваровИУслуг.Договор,
    ПоступлениеТоваровИУслуг.Организация
ИЗ ВТ_Поступления КАК ПоступлениеТоваровИУслуг)
    СГРУППИРОВАТЬ ПО
ЛимитыКредиторскойЗадолженности.Организация,
        ЛимитыКредиторскойЗадолженности.Контрагент,
        ЛимитыКредиторскойЗадолженности.Договор

ИНДЕКСИРОВАТЬ ПО
    ЛимитыКредиторскойЗадолженности.Контрагент,
    ЛимитыКредиторскойЗадолженности.Договор,
    ЛимитыКредиторскойЗадолженности.Организация
;

ВЫБРАТЬ
    ПоступлениеТоваровИУслуг.Ссылка,
    ПоступлениеТоваровИУслуг.Номер,
    ПоступлениеТоваровИУслуг.Договор,
    ПоступлениеТоваровИУслуг.Контрагент,
    ПоступлениеТоваровИУслуг.Организация,
    ПоступлениеТоваровИУслуг.Сумма,
    ПоступлениеТоваровИУслуг.Дата
ИЗ
    ВТ_Поступления КАК ПоступлениеТоваровИУслуг
        ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
            ЛимитыКредиторскойЗадолженности.Организация КАК Организация,
            ЛимитыКредиторскойЗадолженности.Контрагент КАК Контрагент,
            ЛимитыКредиторскойЗадолженности.Договор КАК Договор,
            ЛимитыКредиторскойЗадолженности.Сумма КАК Сумма
        ИЗ
            ВТ_Лимиты КАК ЛимитыКредиторскойЗадолженности) КАК ЛимитыКредиторскойЗадолженности
        ПО ПоступлениеТоваровИУслуг.Контрагент = ЛимитыКредиторскойЗадолженности.Контрагент
            И ПоступлениеТоваровИУслуг.Договор = ЛимитыКредиторскойЗадолженности.Договор
ГДЕ
    (ПоступлениеТоваровИУслуг.Сумма < &МинимальнаяСуммаЗадолженности
            ИЛИ ПоступлениеТоваровИУслуг.Сумма < ЕстьNull(ЛимитыКредиторскойЗадолженности.Сумма, 0))

Оффлайн DarKySiK

  • *
  • Сообщений: 41
  • РЕПУТАЦИЯ: 0
  • Регистрация: 2011-02-17
  • Сайт: 
  • Профессия: Программист 1С
Re: Вторник. Вопрос 5
« Ответ #15: 12 Мар 2013, 11:30 »
1. Подзапросы вынести во временные таблицы с индексацией полей соединения. Организация соединения, описанная в примере может привести к замедлению выполнения запроса.
2. Соединение сделать так же по организации, так как организация входит в основной индекс регистра. Это может ускорить время выполнения запроса.

Оффлайн Санчес

  • *
  • Сообщений: 42
  • РЕПУТАЦИЯ: 1
  • КПД: 2%
  • Регистрация: 2013-03-11
  • Сайт: 
  • Профессия: Разработчик 1С
Re: Вторник. Вопрос 5
« Ответ #16: 12 Мар 2013, 11:36 »
Вынести вложенный запрос во временную таблицу

Оффлайн techh

  • *
  • Сообщений: 41
  • РЕПУТАЦИЯ: 0
  • Регистрация: 2013-03-11
  • Сайт: 
  • Профессия: Программист 1С
Re: Вторник. Вопрос 5
« Ответ #17: 12 Мар 2013, 12:04 »
Не оптимально использовать вложенные запросы, т.к. системе сложно рассчитать количество записей в его результате, и, скорее всего, будет выбран неправильный план выполнения запроса. Вместо вложенных запросов лучше использовать временные таблицы.
 
Думаю, целесообразнее сначала выбрать ПоступленияТоваровИУслуг, в которых указан договор с подрядчиком или поставщиком, т.к., возможно, таких документов всего несколько штук, а при левом соединении (как в исходном запросе) будут сначала выбраны ВСЕ ПоступленияТоваровИУслуг, и только потом отброшены лишние.
 
Левое соединение заменил внутренним, и условие по сумме добавил в условие соединения, чтобы опять же СРАЗУ отбрасывались ненужные записи (уже на этапе соединения), а не после.

   
ВЫБРАТЬ
ЛимитыКредиторскойЗадолженности.Организация КАК Организация,
ЛимитыКредиторскойЗадолженности.Контрагент КАК Контрагент,
ЛимитыКредиторскойЗадолженности.Договор КАК Договор,
СУММА(ЛимитыКредиторскойЗадолженности.Сумма) КАК Сумма
ПОМЕСТИТЬ ЛимитыКредиторскойЗадолженности
ИЗ
РегистрСведений.ЛимитыКредиторскойЗадолженности КАК ЛимитыКредиторскойЗадолженности
ГДЕ
ЛимитыКредиторскойЗадолженности.Организация = &Организация

СГРУППИРОВАТЬ ПО
ЛимитыКредиторскойЗадолженности.Организация,
ЛимитыКредиторскойЗадолженности.Контрагент,
ЛимитыКредиторскойЗадолженности.Договор
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ПоступлениеТоваровИУслуг.Ссылка,
ПоступлениеТоваровИУслуг.Номер,
ПоступлениеТоваровИУслуг.Договор,
ПоступлениеТоваровИУслуг.Контрагент,
ПоступлениеТоваровИУслуг.Организация,
ПоступлениеТоваровИУслуг.Сумма,
ПоступлениеТоваровИУслуг.Дата
ПОМЕСТИТЬ ПоступлениеТоваровИУслуг
ИЗ
Документ.ПоступлениеТоваровИУслуг КАК ПоступлениеТоваровИУслуг
ГДЕ
(ПоступлениеТоваровИУслуг.Договор.ДоговорСПодрядчиком
ИЛИ ПоступлениеТоваровИУслуг.Договор.ДоговорСПоставщиком)
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ПоступлениеТоваровИУслуг.Ссылка,
ПоступлениеТоваровИУслуг.Номер,
ПоступлениеТоваровИУслуг.Договор,
ПоступлениеТоваровИУслуг.Контрагент,
ПоступлениеТоваровИУслуг.Организация,
ПоступлениеТоваровИУслуг.Сумма,
ПоступлениеТоваровИУслуг.Дата
ИЗ
ПоступлениеТоваровИУслуг КАК ПоступлениеТоваровИУслуг
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ЛимитыКредиторскойЗадолженности КАК ЛимитыКредиторскойЗадолженности
ПО ПоступлениеТоваровИУслуг.Контрагент = ЛимитыКредиторскойЗадолженности.Контрагент
И ПоступлениеТоваровИУслуг.Договор = ЛимитыКредиторскойЗадолженности.Договор
И (ПоступлениеТоваровИУслуг.Сумма < &МинимальнаяСуммаЗадолженности
ИЛИ ПоступлениеТоваровИУслуг.Сумма < ЛимитыКредиторскойЗадолженности.Сумма)


Оффлайн ket_kat

  • *
  • Сообщений: 19
  • РЕПУТАЦИЯ: 0
  • Регистрация: 2013-03-11
  • Сайт: 
  • Профессия: Программист 8.1
Re: Вторник. Вопрос 5
« Ответ #18: 12 Мар 2013, 12:09 »
ВЫБРАТЬ
   ПоступлениеТоваровИУслуг.Ссылка,
   ПоступлениеТоваровИУслуг.Номер,
   ПоступлениеТоваровИУслуг.ДоговорКонтрагента,
   ПоступлениеТоваровИУслуг.Контрагент,
   ПоступлениеТоваровИУслуг.Организация,
   СУММА(ПоступлениеТоваровИУслуг.СуммаДокумента) КАК СуммаДокумента,
   ПоступлениеТоваровИУслуг.Дата
ПОМЕСТИТЬ Поступления
ИЗ
   Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровИУслуг

СГРУППИРОВАТЬ ПО
   ПоступлениеТоваровИУслуг.Ссылка,
   ПоступлениеТоваровИУслуг.Номер,
   ПоступлениеТоваровИУслуг.ДоговорКонтрагента,
   ПоступлениеТоваровИУслуг.Контрагент,
   ПоступлениеТоваровИУслуг.Организация,
   ПоступлениеТоваровИУслуг.Дата
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ЛимитыКредиторскойЗадолженности.Организация,
   ЛимитыКредиторскойЗадолженности.Контрагент,
   ЛимитыКредиторскойЗадолженности.Договор,
   СУММА(ЛимитыКредиторскойЗадолженности.Сумма) КАК СуммаЛимита
ПОМЕСТИТЬ Лимиты
ИЗ
   РегистрСведений.ЛимитыКредиторскойЗадолженности КАК ЛимитыКредиторскойЗадолженности

СГРУППИРОВАТЬ ПО
   ЛимитыКредиторскойЗадолженности.Организация,
   ЛимитыКредиторскойЗадолженности.Контрагент,
   ЛимитыКредиторскойЗадолженности.Договор
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   Поступления.Ссылка,
   Поступления.Номер,
   Поступления.ДоговорКонтрагента,
   Поступления.Контрагент,
   Поступления.Организация,
   СУММА(Поступления.СуммаДокумента) КАК СуммаДокумента,
   СУММА(Лимиты.СуммаЛимита) КАК СуммаЛимита
ПОМЕСТИТЬ Итоговый
ИЗ
   Поступления КАК Поступления
      ЛЕВОЕ СОЕДИНЕНИЕ Лимиты КАК Лимиты
      ПО Поступления.Контрагент = Лимиты.Контрагент
         И Поступления.ДоговорКонтрагента = Лимиты.Договор

СГРУППИРОВАТЬ ПО
   Поступления.Ссылка,
   Поступления.Номер,
   Поступления.ДоговорКонтрагента,
   Поступления.Контрагент,
   Поступления.Организация
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   Итоговый.Ссылка,
   Итоговый.Номер,
   Итоговый.ДоговорКонтрагента,
   Итоговый.Контрагент,
   Итоговый.Организация,
   Итоговый.СуммаДокумента
ИЗ
   Итоговый КАК Итоговый
ГДЕ
   (Итоговый.СуммаДокумента < &МинимальнаяСуммаЗадолженности
         ИЛИ Итоговый.СуммаДокумента < Итоговый.СуммаЛимита)


Пояснения:
Не следует делать соединения с подзапросами
Следует соединять между собой или объекты метаданных или временные таблицы
Так будет увеличено быстродействие и стабильность работы  запроса.

Оффлайн IrinaO

  • *
  • Сообщений: 39
  • РЕПУТАЦИЯ: 1
  • КПД: 3%
  • Регистрация: 2012-12-08
  • Сайт: 
  • Профессия: Ученик 1С
Re: Вторник. Вопрос 5
« Ответ #19: 12 Мар 2013, 12:13 »
Избавляемся от вложенного запросы с помощью временной таблицы, в которую сразу отбираем данные только по нужным договорам

ВЫБРАТЬ
   ЛимитыКредиторскойЗадолженности.Организация,
   ЛимитыКредиторскойЗадолженности.Контрагент КАК Контрагент,
   ЛимитыКредиторскойЗадолженности.Договор КАК Договор,
   СУММА(ЛимитыКредиторскойЗадолженности.Сумма) КАК Сумма
ПОМЕСТИТЬ Лимиты
ИЗ
   РегистрСведений.ЛимитыКредиторскойЗадолженности КАК ЛимитыКредиторскойЗадолженности
ГДЕ
   ЛимитыКредиторскойЗадолженности.Организация = &Организация
   И (ЛимитыКредиторскойЗадолженности.Договор.ДоговорСПодрядчиком = ИСТИНА
         ИЛИ ЛимитыКредиторскойЗадолженности.Договор.ДоговорСПоставщиком = ИСТИНА)

СГРУППИРОВАТЬ ПО
   ЛимитыКредиторскойЗадолженности.Контрагент,
   ЛимитыКредиторскойЗадолженности.Договор,
   ЛимитыКредиторскойЗадолженности.Организация

ИНДЕКСИРОВАТЬ ПО
   Контрагент,
   Договор
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ПоступлениеТоваровИУслуг.Ссылка,
   ПоступлениеТоваровИУслуг.Номер,
   ПоступлениеТоваровИУслуг.Договор,
   ПоступлениеТоваровИУслуг.Контрагент,
   ПоступлениеТоваровИУслуг.Организация,
   ПоступлениеТоваровИУслуг.Сумма,
   ПоступлениеТоваровИУслуг.Дата
ИЗ
   Документ.ПоступлениеТоваровИУслуг КАК ПоступлениеТоваровИУслуг
      ЛЕВОЕ СОЕДИНЕНИЕ Лимиты КАК Лимиты
      ПО ПоступлениеТоваровИУслуг.Контрагент = Лимиты.Контрагент
         И ПоступлениеТоваровИУслуг.Договор = Лимиты.Договор
ГДЕ
   (ПоступлениеТоваровИУслуг.Договор.ДоговорСПодрядчиком = ИСТИНА
         ИЛИ ПоступлениеТоваровИУслуг.Договор.ДоговорСПоставщиком = ИСТИНА)
   И (ПоступлениеТоваровИУслуг.Сумма < &МинимальнаяСуммаЗадолженности
         ИЛИ ПоступлениеТоваровИУслуг.Сумма < Лимиты.Сумма)


Теги:
 


* Реклама

* Поиск

* Последние задачи на разработку (фриланс)

* Реклама

* Последние вакансии

* Топ 10 авторов за месяц

oleg-x
64 Сообщений
wise wise
58 Сообщений
AIFrame AIFrame
50 Сообщений
alexandr_ll
46 Сообщений
Геннадий ОбьГЭС Геннадий ОбьГЭС
43 Сообщений
alex0402
41 Сообщений
LexaK
32 Сообщений
BuhRust
28 Сообщений
andron81_81
24 Сообщений
MuI_I_Ika MuI_I_Ika
22 Сообщений

* Кто онлайн

  • Точка Гостей: 134
  • Точка Скрытых: 0
  • Точка Пользователей: 0

Нет пользователей онлайн.

* Облако тэгов

* Форум 1С с мобильного

* Инструменты

* Дополнительно

Поиск

 
SimplePortal 2.3.5 © 2008-2012, SimplePortal