Выбор нескольких документов по контрагенту одним запросом
По теме из базы знаний
- Неоплаченные долги при распределении оплаты по правилу ФИФО одним запросом и намного быстрее, чем Вы думали
- Полезная обработка документов для Управляемого приложения. Самое необходимое: Проведение, нумерация, изменение времени(!) и удаление. Есть вариант выполнения в фоне!
- Загрузка документов и номенклатуры из Excel в 1С "одним нажатием": УПД, ТОРГ-12, отчеты маркетплейсов, заказы, счета, прайсы
- Загрузка чеков ФНС в документы 1С:БП, 1С:УНФ, 1С:ERP, 1С:КА и 1С:УТ
- Переход с УПП на ERP с сохранением документов. Фантастика или реальность?
Найденные решения
ВЫБРАТЬ
ЗаказПокупателя.Ссылка,
ЗаказПокупателя.Дата,
ЗаказПокупателя.Контрагент
ПОМЕСТИТЬ т
ИЗ
Документ.ЗаказПокупателя КАК ЗаказПокупателя
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
т1.Ссылка,
т1.Дата,
т1.Контрагент КАК Контрагент,
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ т2.Ссылка) КАК Ссылка1
ИЗ
т КАК т1
левое СОЕДИНЕНИЕ т КАК т2
ПО т1.Контрагент = т2.Контрагент
И т1.Дата < т2.Дата
СГРУППИРОВАТЬ ПО
т1.Ссылка,
т1.Дата,
т1.Контрагент
имеющие КОЛИЧЕСТВО(РАЗЛИЧНЫЕ т2.Ссылка) <4
УПОРЯДОЧИТЬ ПО
Контрагент,
Ссылка1
ПоказатьОстальные ответы
В избранное
Подписаться на ответы
Сортировка:
Древо развёрнутое
Свернуть все
а вот так
и фсё ))
Запрос.Текст =
"ВЫБРАТЬ
Продажи.Контрагент КАК Контрагент,
Продажи.ЗаказПокупателя
Продажи.ЗаказПокупателя.Дата КАК Дата
ИЗ
РегистрНакопления.Продажи.Обороты(...)
УПОРЯДОЧИТЬ ПО
Контрагент,
Дата Убыв
";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.СледующийПоЗначениюПоля("Контрагент") Цикл
Инд = 1;
//Получаем первый заказ в выборке
...
Пока Выборка.Следующий() И Инд < 5 Цикл
//Получаем следующие заказы (3) контрагента в выборке
Инд = Инд + 1;
КонецЦикла;
КонецЦикла;
Показатьи фсё ))
(26) да, вижу, что каша в голове. Оборотные виртуальные таблицы не используют итоговые таблицы. Их даже нет для оборотных регистров, от слова "совсем". Они нужны только для вирт. "остатки". И то там не то что думаете.
Даже не представляете себе структуру хранения и выборки данных.
Даже не представляете себе структуру хранения и выборки данных.
(42) таблица общих оборотов за месяц. Пусть это будет называться итоговой таблицей, но это другая таблица, отличная от таблицы итогов "остатки". Вот для нее она точно передает назначение - итоги.
Вот с этим: "потому-что выбирает не всю таблицу, как она есть, а только часть записей (итоговые называются)!" тоже согласишься?
ps. в классификации 1С эта таблица называется "таблица оборотов".
Вот с этим: "потому-что выбирает не всю таблицу, как она есть, а только часть записей (итоговые называются)!" тоже согласишься?
ps. в классификации 1С эта таблица называется "таблица оборотов".
(43) Да ну. Всегда это называлось таблицами движений и таблицами итогов (итоговых записей). "Таблицей оборотов" можно назвать и таблицу движений - там же тоже обороты. Что смысл итогов отличается для остатков и оборотов - с этим никто не спорит. Короче, замяли тему.
(29) ну во первых я этого не говорил, во вторых это не простой перебор а "шаговый", а в третьих "ПродажиДокумент В (Выбрать первые 4 Прод.Документ из РегистрНакопления.Продажи как Прод Где Прод.Контрагент = ВТ.Контрагент УПОРЯДОЧИТЬ ПО Прод.Документ.Дата УБЫВ) " здесь два не оптимальных случая конструкция "В" и вложенный запрос! Так что "шаговый" перебор сработает намного быстрей
(31) Какие-то выводы можно делать только анализируя конкретные планы выполнения. Далеко не всегда можно глядя на запрос понять, насколько оптимально или неоптимально он будет выполняться. Даже банальные советы типа "не использовать вложенные запросы" - это всего лишь способ гарантировать стабильность результата и застраховаться от "выбрыков" оптимизатора запросов. А не истина последней инстанции.
Есть такое понятие как "достаточная производительность".
И есть две крайности:
1) вообще не принимать во внимание вопрос производительности, пока он сам не заявит о себе в полный рост (и это вполне себе работающий подход для стартапов)
2) слепо следовать рекомендациям, не обращая внимание на другую чашу весов.
Истина, как всегда, посередине. Если в боевых условиях удается получить достаточную производительность не переусложняя код и имея при этом какой-то запас по масштабируемости - то это хороший вариант.
Это я к чему. Я не раз и не два применял "ужас" со вложенными коррелирующими запросами и никакого "ужаса" по производительности в боевых условиях на немаленьких объемах данных не получал. Зато такие запросы, как правило, гораздо более простые и короткие, по сравнению с альтернативами.
Есть такое понятие как "достаточная производительность".
И есть две крайности:
1) вообще не принимать во внимание вопрос производительности, пока он сам не заявит о себе в полный рост (и это вполне себе работающий подход для стартапов)
2) слепо следовать рекомендациям, не обращая внимание на другую чашу весов.
Истина, как всегда, посередине. Если в боевых условиях удается получить достаточную производительность не переусложняя код и имея при этом какой-то запас по масштабируемости - то это хороший вариант.
Это я к чему. Я не раз и не два применял "ужас" со вложенными коррелирующими запросами и никакого "ужаса" по производительности в боевых условиях на немаленьких объемах данных не получал. Зато такие запросы, как правило, гораздо более простые и короткие, по сравнению с альтернативами.
ВЫБРАТЬ
ЗаказПокупателя.Ссылка,
ЗаказПокупателя.Дата,
ЗаказПокупателя.Контрагент
ПОМЕСТИТЬ т
ИЗ
Документ.ЗаказПокупателя КАК ЗаказПокупателя
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
т1.Ссылка,
т1.Дата,
т1.Контрагент КАК Контрагент,
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ т2.Ссылка) КАК Ссылка1
ИЗ
т КАК т1
левое СОЕДИНЕНИЕ т КАК т2
ПО т1.Контрагент = т2.Контрагент
И т1.Дата < т2.Дата
СГРУППИРОВАТЬ ПО
т1.Ссылка,
т1.Дата,
т1.Контрагент
имеющие КОЛИЧЕСТВО(РАЗЛИЧНЫЕ т2.Ссылка) <4
УПОРЯДОЧИТЬ ПО
Контрагент,
Ссылка1
Показать
(5) Непонятно зачем тут ВТ и вообще выборка из регистра, а не документов, но я тоже хотел подвести ТС к схеме с
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ т2.Ссылка) КАК Ссылка1
имеющие КОЛИЧЕСТВО(РАЗЛИЧНЫЕ т2.Ссылка) <=4
Только он пока ещё не написал, что хочет именно этого.
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ т2.Ссылка) КАК Ссылка1
имеющие КОЛИЧЕСТВО(РАЗЛИЧНЫЕ т2.Ссылка) <=4
Только он пока ещё не написал, что хочет именно этого.
Ну ВЫ, блин, даете. Выборка всей физ.таблицы во временную.
Тогда уж делали бы:
....
Тогда уж делали бы:
ВЫБРАТЬ
т1.Ссылка,
т1.Дата,
т1.Контрагент КАК Контрагент,
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ т2.Ссылка) КАК Ссылка1
ИЗ
Документ.ЗаказПокупателя КАК т1
левое СОЕДИНЕНИЕ Документ.ЗаказПокупателя КАК т2
ПО т1.Контрагент = т2.Контрагент
И т1.Дата < т2.Дата
Показать....
(5) Абсолютно не оптимальный запрос в первом ВТ. Если у человека база с заказами в миллион документов?! Первая выборка что сделает?!? Поместит ВЕСЬ МИЛЛИОН ДОКУМЕНТОВ в ВТ.
Это лажа!!!
Зачем там вообще различные!? ссылка никогда в этом запросе не продублируется. фигня это а не запрос.
Это лажа!!!
Зачем там вообще различные!? ссылка никогда в этом запросе не продублируется. фигня это а не запрос.
ВЫБРАТЬ Различные
Продажи.Контрагент
поместить ВТ
из РегистрНакопления.Продажи.Оборот() как продажи
;
Выбрать
ВТ.Контрагент,
ПродажиДокументы.Документ
из
РегистрНакопления.Продажи.Оборот() как Продажи
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи как ПродажиДокумент
ПО ВТ.Контрагент = ПродажиДокумент.Контрагент и ПродажиДокумент В (Выбрать первые 4 Прод.Документ из РегистрНакопления.Продажи как Прод Где Прод.Контрагент = ВТ.Контрагент УПОРЯДОЧИТЬ ПО Прод.Документ.Дата УБЫВ)
ПоказатьВЫБРАТЬ Различные
Продажи.Контрагент
поместить ВТ
из РегистрНакопления.Продажи.Оборот(&ДатаНачала,&ДатаОкончания) как продажи
;
Выбрать
ВТ.Контрагент,
ПродажиДокументы.Документ
из
РегистрНакопления.Продажи.Оборот(&ДатаНачала,&ДатаОкончания) как Продажи
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи как ПродажиДокумент
ПО ВТ.Контрагент = ПродажиДокумент.Контрагент и ПродажиДокумент В (Выбрать первые 4 Прод.Документ из РегистрНакопления.Продажи как Прод Где Прод.Контрагент = ВТ.Контрагент УПОРЯДОЧИТЬ ПО Прод.Документ.Дата УБЫВ)
Показать
(21) А вот этот запрос, точно повесит все ресурсы, учитывая объем данных, по ходу не мне надо учится оптимальный код писать! Конструкции "ПродажиДокумент В (Выбрать первые 4 Прод.Документ из РегистрНакопления.Продажи как Прод Где Прод.Контрагент = ВТ.Контрагент УПОРЯДОЧИТЬ ПО Прод.Документ.Дата УБЫВ) " работают очень медленно!!!
Я бы попробовал бы СКД через 2 набора данных ,в первом выбираются контрагенты за нужный период и передаются во второй набор в качестве параметров вирт.таблици Обороты и как раз во втором можно использовать ВЫБРАТЬ ПЕРВЫЕ 4 - как-то так
можно сделать через 4 временные таблицы, с выборкой максимальных заказов (хотя я бы сделал как Jen1978)
ВЫБРАТЬ
ЗаказКлиента.Контрагент КАК Контрагент,
МАКСИМУМ(ЗаказКлиента.Ссылка) КАК Заказ,
МАКСИМУМ(ЗаказКлиента.Дата) КАК Дата
ПОМЕСТИТЬ ВР1
ИЗ
Документ.ЗаказКлиента КАК ЗаказКлиента
СГРУППИРОВАТЬ ПО
ЗаказКлиента.Контрагент
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
ВР1.Контрагент КАК Контрагент,
МАКСИМУМ(ЗаказКлиента.Ссылка) КАК Ссылка,
МАКСИМУМ(ЗаказКлиента.Дата) КАК Дата
ПОМЕСТИТЬ ВР2
ИЗ
ВР1 КАК ВР1
ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗаказКлиента КАК ЗаказКлиента
ПО ВР1.Контрагент = ЗаказКлиента.Контрагент
И (ВР1.Дата > ЗаказКлиента.Дата)
ГДЕ
НЕ ЗаказКлиента.Ссылка ЕСТЬ NULL
СГРУППИРОВАТЬ ПО
ВР1.Контрагент
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
ВР2.Контрагент КАК Контрагент,
МАКСИМУМ(ЗаказКлиента.Ссылка) КАК Ссылка,
МАКСИМУМ(ЗаказКлиента.Дата) КАК Дата
ПОМЕСТИТЬ ВР3
ИЗ
ВР2 КАК ВР2
ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗаказКлиента КАК ЗаказКлиента
ПО ВР2.Контрагент = ЗаказКлиента.Контрагент
И ВР2.Дата > ЗаказКлиента.Дата
ГДЕ
НЕ ЗаказКлиента.Ссылка ЕСТЬ NULL
СГРУППИРОВАТЬ ПО
ВР2.Контрагент
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
ВР3.Контрагент КАК Контрагент,
МАКСИМУМ(ЗаказКлиента.Ссылка) КАК Ссылка,
МАКСИМУМ(ЗаказКлиента.Дата) КАК Дата
ПОМЕСТИТЬ ВР4
ИЗ
ВР3 КАК ВР3
ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗаказКлиента КАК ЗаказКлиента
ПО ВР3.Контрагент = ЗаказКлиента.Контрагент
И ВР3.Дата > ЗаказКлиента.Дата
ГДЕ
НЕ ЗаказКлиента.Ссылка ЕСТЬ NULL
СГРУППИРОВАТЬ ПО
ВР3.Контрагент
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
ВР1.Контрагент КАК Контрагент,
ВР1.Заказ КАК Заказ
ИЗ
ВР1 КАК ВР1
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ВР2.Контрагент,
ВР2.Ссылка
ИЗ
ВР2 КАК ВР2
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ВР3.Контрагент,
ВР3.Ссылка
ИЗ
ВР3 КАК ВР3
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ВР4.Контрагент,
ВР4.Ссылка
ИЗ
ВР4 КАК ВР4
Показать
Так тоже не пойдёт. Ты выбираешь Максимум(Ссылка) и Максимум(Дата). В итоге мы получим дату последнего документа и ссылку на какой-то другой документ. Максимум по ссылке работает так: платформа смотрит на ГУИД объекта и выбирает максимальный ГУИД по строковому значению ГУИДа.
(хотя я бы сделал как Jen1978) - он неправильно сделал, там ошибка в коде в последнем условии. Нельзя такое условие построить.
(хотя я бы сделал как Jen1978) - он неправильно сделал, там ошибка в коде в последнем условии. Нельзя такое условие построить.
(50)согласен, не проверил, вот так правильно
ВЫБРАТЬ
ЗаказКлиента.Контрагент КАК Контрагент,
МАКСИМУМ(ЗаказКлиента.Ссылка) КАК Заказ
ПОМЕСТИТЬ ВР1
ИЗ
Документ.ЗаказКлиента КАК ЗаказКлиента
ГДЕ
ЗаказКлиента.Контрагент = &Контрагент
СГРУППИРОВАТЬ ПО
ЗаказКлиента.Контрагент
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
ВР1.Контрагент КАК Контрагент,
МАКСИМУМ(ЗаказКлиента.Ссылка) КАК Ссылка
ПОМЕСТИТЬ ВР2
ИЗ
ВР1 КАК ВР1
ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗаказКлиента КАК ЗаказКлиента
ПО ВР1.Контрагент = ЗаказКлиента.Контрагент
И ВР1.Заказ.Дата > ЗаказКлиента.Дата
ГДЕ
НЕ ЗаказКлиента.Ссылка ЕСТЬ NULL
СГРУППИРОВАТЬ ПО
ВР1.Контрагент
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
ВР2.Контрагент КАК Контрагент,
МАКСИМУМ(ЗаказКлиента.Ссылка) КАК Ссылка
ПОМЕСТИТЬ ВР3
ИЗ
ВР2 КАК ВР2
ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗаказКлиента КАК ЗаказКлиента
ПО ВР2.Контрагент = ЗаказКлиента.Контрагент
И ВР2.Ссылка.Дата > ЗаказКлиента.Дата
ГДЕ
НЕ ЗаказКлиента.Ссылка ЕСТЬ NULL
СГРУППИРОВАТЬ ПО
ВР2.Контрагент
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
ВР3.Контрагент КАК Контрагент,
МАКСИМУМ(ЗаказКлиента.Ссылка) КАК Ссылка
ПОМЕСТИТЬ ВР4
ИЗ
ВР3 КАК ВР3
ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗаказКлиента КАК ЗаказКлиента
ПО ВР3.Контрагент = ЗаказКлиента.Контрагент
И ВР3.Ссылка.Дата > ЗаказКлиента.Дата
ГДЕ
НЕ ЗаказКлиента.Ссылка ЕСТЬ NULL
СГРУППИРОВАТЬ ПО
ВР3.Контрагент
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
ВР1.Контрагент КАК Контрагент,
ВР1.Заказ КАК Заказ
ИЗ
ВР1 КАК ВР1
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ВР2.Контрагент,
ВР2.Ссылка
ИЗ
ВР2 КАК ВР2
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ВР3.Контрагент,
ВР3.Ссылка
ИЗ
ВР3 КАК ВР3
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ВР4.Контрагент,
ВР4.Ссылка
ИЗ
ВР4 КАК ВР4
Показать
Вакансии
Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)