Проверить на наличие заказов поставщику в запросе динамического списка заказов клиентов

1. iposerg 25.05.23 09:36 Сейчас в теме
Здравствуйте! УТ 11.5.
Нужна помощь. Есть список заказов клиентов, формируется произвольным запросом. Есть необходимость при наличии связанного документа Заказа поставщику выводить определенное состояние. Проблема в том что при подключении связи заказов поставщику список открывается по 10 минут. Какую хитрость можно применить чтобы обойтись малой кровью? Делаю в расширении.
Сам запрос:
Динамический список заказы клиентов
По теме из базы знаний
Найденные решения
15. DENSKR 16 25.05.23 11:39 Сейчас в теме
Нужно отдельное внимание оказывать на связи. Вот твой запрос...
ВЫБРАТЬ
	ДокументЗаказКлиента.Ссылка КАК Ссылка,
	ДокументЗаказКлиента.ПометкаУдаления КАК ПометкаУдаления,
	ДокументЗаказКлиента.Номер КАК Номер,
	ДокументЗаказКлиента.Дата КАК Дата,
	ДокументЗаказКлиента.НомерПоДаннымКлиента КАК НомерПоДаннымКлиента,
	ДокументЗаказКлиента.ДатаПоДаннымКлиента КАК ДатаПоДаннымКлиента,
	ДокументЗаказКлиента.Проведен КАК Проведен,
	ДокументЗаказКлиента.Приоритет КАК Приоритет,
	ДокументЗаказКлиента.Партнер КАК Партнер,
	ДокументЗаказКлиента.Контрагент КАК Контрагент,
	ДокументЗаказКлиента.Организация КАК Организация,
	ДокументЗаказКлиента.Соглашение КАК Соглашение,
	ДокументЗаказКлиента.Договор КАК Договор,
	ДокументЗаказКлиента.Сделка КАК Сделка,
	ДокументЗаказКлиента.Валюта КАК Валюта,
	ДокументЗаказКлиента.СуммаДокумента КАК СуммаДокумента,
	ДокументЗаказКлиента.СуммаВозвратнойТары КАК СуммаВозвратнойТары,
	ДокументЗаказКлиента.ГрафикОплаты КАК ГрафикОплаты,
	ДокументЗаказКлиента.Склад КАК Склад,
	ДокументЗаказКлиента.Статус КАК Статус,
	ДокументЗаказКлиента.Менеджер КАК Менеджер,
	ДокументЗаказКлиента.ДополнительнаяИнформация КАК ДополнительнаяИнформация,
	ДокументЗаказКлиента.СуммаАвансаДоОбеспечения КАК СуммаАвансаДоОбеспечения,
	ДокументЗаказКлиента.СуммаПредоплатыДоОтгрузки КАК СуммаПредоплатыДоОтгрузки,
	ДокументЗаказКлиента.ДатаОтгрузки КАК ДатаОтгрузки,
	ДокументЗаказКлиента.ХозяйственнаяОперация КАК ХозяйственнаяОперация,
	ДокументЗаказКлиента.ПорядокРасчетов КАК ПорядокРасчетов,
	ДокументЗаказКлиента.Комментарий КАК Комментарий,
	ВЫБОР
		КОГДА НЕ ДокументЗаказКлиента.Проведен
			ТОГДА ЗНАЧЕНИЕ(Перечисление.СостоянияЗаказовКлиентов.ПустаяСсылка)
		КОГДА Таб_ЗКЗП.ЕстьЗаказПоставщику
			ТОГДА ЗНАЧЕНИЕ(Перечисление.СостоянияЗаказовКлиентов.Заказан)
		ИНАЧЕ ЕСТЬNULL(СостоянияЗаказовКлиентов.Состояние, ЗНАЧЕНИЕ(Перечисление.СостоянияЗаказовКлиентов.Закрыт))
	КОНЕЦ КАК Состояние,
	ВЫБОР
		КОГДА НЕ ДокументЗаказКлиента.Проведен
			ТОГДА ЛОЖЬ
		КОГДА СостоянияЗаказовКлиентов.ДатаСобытия <> ДАТАВРЕМЯ(1, 1, 1)
				И &ДатаАктуальности > СостоянияЗаказовКлиентов.ДатаСобытия
			ТОГДА ИСТИНА
		ИНАЧЕ ЛОЖЬ
	КОНЕЦ КАК Просрочен,
	ВЫБОР
		КОГДА ДокументЗаказКлиента.Приоритет В
				(ВЫБРАТЬ ПЕРВЫЕ 1
					Приоритеты.Ссылка КАК Приоритет
				ИЗ
					Справочник.Приоритеты КАК Приоритеты
				УПОРЯДОЧИТЬ ПО
					Приоритеты.РеквизитДопУпорядочивания)
			ТОГДА 0
		КОГДА ДокументЗаказКлиента.Приоритет В
				(ВЫБРАТЬ ПЕРВЫЕ 1
					Приоритеты.Ссылка КАК Приоритет
				ИЗ
					Справочник.Приоритеты КАК Приоритеты
				УПОРЯДОЧИТЬ ПО
					Приоритеты.РеквизитДопУпорядочивания УБЫВ)
			ТОГДА 2
		ИНАЧЕ 1
	КОНЕЦ КАК КартинкаПриоритета,
	ЕСТЬNULL(СостоянияЗаказовКлиентов.СуммаОплаты, 0) КАК СуммаОплаты,
	ЕСТЬNULL(СостоянияЗаказовКлиентов.ПроцентОплаты, 0) КАК ПроцентОплаты,
	ЕСТЬNULL(СостоянияЗаказовКлиентов.СуммаОтгрузки, 0) КАК СуммаОтгрузки,
	ЕСТЬNULL(СостоянияЗаказовКлиентов.ПроцентОтгрузки, 0) КАК ПроцентОтгрузки,
	ВЫБОР
		КОГДА ЕСТЬNULL(СостоянияЗаказовКлиентов.СуммаДолга, 0) < 0
			ТОГДА ЕСТЬNULL(СостоянияЗаказовКлиентов.СуммаДолга, 0)
		ИНАЧЕ 0
	КОНЕЦ КАК НашДолг,
	ВЫБОР
		КОГДА ЕСТЬNULL(СостоянияЗаказовКлиентов.СуммаДолга, 0) > 0
			ТОГДА ЕСТЬNULL(СостоянияЗаказовКлиентов.СуммаДолга, 0)
		ИНАЧЕ 0
	КОНЕЦ КАК ДолгКлиента,
	ЕСТЬNULL(СостоянияЗаказовКлиентов.ПроцентДолга, 0) КАК ПроцентДолга,
	ЕСТЬNULL(СостоянияЗаказовКлиентов.ДатаСобытия, ДАТАВРЕМЯ(1, 1, 1)) КАК ДатаСобытия,
	ЕСТЬNULL(СостоянияЗаказовКлиентов.ЕстьРасхожденияОрдерНакладная, ЛОЖЬ) КАК ЕстьРасхожденияОрдерНакладная,
	СостоянияЭД.СостояниеЭДО КАК СостояниеЭДО,
	СостоянияЭД.ПредставлениеСостояния КАК ПредставлениеСостояния,
	ДокументЗаказКлиента.Автор КАК Автор,
	&ДополнительныеПоляСостояниеEDI КАК ДополнительныеПоляСостояниеEDI
ИЗ
	Документ.ЗаказКлиента КАК ДокументЗаказКлиента
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СостоянияЗаказовКлиентов КАК СостоянияЗаказовКлиентов
		ПО (СостоянияЗаказовКлиентов.Заказ = ДокументЗаказКлиента.Ссылка)
		{ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СостоянияПоОбъектамУчетаЭДО КАК СостоянияЭД
		ПО (СостоянияЭД.СсылкаНаОбъект = ДокументЗаказКлиента.Ссылка)}
		ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ РАЗЛИЧНЫЕ
			ЗаказыКлиентов.Ссылка КАК Ссылка,
			НЕ ЗаказыПоставщикам.Ссылка ЕСТЬ NULL КАК ЕстьЗаказПоставщику
		ИЗ
			Документ.ЗаказКлиента КАК ЗаказыКлиентов
				ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗаказПоставщику КАК ЗаказыПоставщикам
				ПО ЗаказыКлиентов.Ссылка = ЗаказыПоставщикам.ДокументОснование) КАК Таб_ЗКЗП
		ПО ДокументЗаказКлиента.Ссылка = Таб_ЗКЗП.Ссылка 
Показать
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. nomad_irk 76 25.05.23 09:52 Сейчас в теме
(1)Святая корова.....
Если на каждый заказ клиента может быть не больше одного заказа поставщику:
Выбрать
     Т1.Ссылка,
     НЕ Т2.Ссылка ЕСТЬ NULL КАК ЕстьЗаказПоставщику
ИЗ
     Документ.ЗаказКлиента КАК Т1
       ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗаказПоставщику КАК Т2
       ПО Т1.Ссылка = Т2.ДокументОснование


Если будет несколько заказов поставщику, то необходимо определять один из них и выводить в конечном результате
3. iposerg 25.05.23 09:56 Сейчас в теме
(2) То есть основную таблицу тоже виртуальной сделать далее уже сделать отдельную основную чтобы 2 виртуальные соединить?
4. nomad_irk 76 25.05.23 09:59 Сейчас в теме
(3)не нужно ничего делать. Основную таблицу заказов клиентов соединить левым соединение с таблицей заказов поставщику
7. iposerg 25.05.23 10:14 Сейчас в теме
(4) Сделал вот так, но теперь на ссылку ругается, нужно вложенный запрос делать по ссылке на заказ клиента, но думаю работать будет не быстрее...
Запрос
8. nomad_irk 76 25.05.23 10:34 Сейчас в теме
(7)нет, ругается из-за того, что существуют несколько заказов поставщику на один заказ клиента
Лечится построением 2-х вложенных запросов, но производительность заметно снизится.

Выбрать
    Т1.Ссылка,
    НЕ Т2.Ссылка ЕСТЬ NULL КАК ЕстьЗаказПоставщику
ИЗ
    Документ.ЗаказКлиента КАК Т1
        ЛЕВОЕ СОЕДИНЕНИЕ (
           ВЫБРАТЬ 
               Т2.Ссылка,
               Т2.ДокументОснование
           ИЗ
                (ВЫБРАТЬ
                      МАКСИМУМ(Номер) КАК Номер,
                      ДокументОснование,
                  ИЗ
                       Документ.ЗаказПоставщику
                  СГРУППИРОВАТЬ ПО
                       ДокументОснование) КАК Т1
                 ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗаказПоставщику КАК Т2
                      ПО Т1.Номер = Т2.Номер
                             И Т1.ДокументОснование = Т2.ДокументОснование) КАК Т2
           ПО Т1.Ссылка = Т2.ДокументОснование
Показать


Запрос накидал "на коленке", отладка строго обязательна
9. iposerg 25.05.23 10:46 Сейчас в теме
(8) Может применить "Различные" Мне же по сути нужно найти список различных ссылок чтобы проставить нужное состояние
Сделал вот так но работает очень долго...
Запрос с внутренней таблицей
10. nomad_irk 76 25.05.23 10:50 Сейчас в теме
(9)В данном случае РАЗЛИЧНЫЕ не поможет, т.к. несколько заказов поставщику по одному заказу клиента и так различны
11. iposerg 25.05.23 10:57 Сейчас в теме
(10) Вот посмотрите выше, во внутренней таблице я выбираю по вашей наводке Есть заказ поставщику или нет, далее соединяю эту вложенную таблицу по ссылке на сам заказ основной таблицы, если Истина то состояние "Заказан" Если ложь то иное, но этот запрос не оптимизирован, он работает очень медленно и сжирает кучу памяти, голову сломал уже...
15. DENSKR 16 25.05.23 11:39 Сейчас в теме
Нужно отдельное внимание оказывать на связи. Вот твой запрос...
ВЫБРАТЬ
	ДокументЗаказКлиента.Ссылка КАК Ссылка,
	ДокументЗаказКлиента.ПометкаУдаления КАК ПометкаУдаления,
	ДокументЗаказКлиента.Номер КАК Номер,
	ДокументЗаказКлиента.Дата КАК Дата,
	ДокументЗаказКлиента.НомерПоДаннымКлиента КАК НомерПоДаннымКлиента,
	ДокументЗаказКлиента.ДатаПоДаннымКлиента КАК ДатаПоДаннымКлиента,
	ДокументЗаказКлиента.Проведен КАК Проведен,
	ДокументЗаказКлиента.Приоритет КАК Приоритет,
	ДокументЗаказКлиента.Партнер КАК Партнер,
	ДокументЗаказКлиента.Контрагент КАК Контрагент,
	ДокументЗаказКлиента.Организация КАК Организация,
	ДокументЗаказКлиента.Соглашение КАК Соглашение,
	ДокументЗаказКлиента.Договор КАК Договор,
	ДокументЗаказКлиента.Сделка КАК Сделка,
	ДокументЗаказКлиента.Валюта КАК Валюта,
	ДокументЗаказКлиента.СуммаДокумента КАК СуммаДокумента,
	ДокументЗаказКлиента.СуммаВозвратнойТары КАК СуммаВозвратнойТары,
	ДокументЗаказКлиента.ГрафикОплаты КАК ГрафикОплаты,
	ДокументЗаказКлиента.Склад КАК Склад,
	ДокументЗаказКлиента.Статус КАК Статус,
	ДокументЗаказКлиента.Менеджер КАК Менеджер,
	ДокументЗаказКлиента.ДополнительнаяИнформация КАК ДополнительнаяИнформация,
	ДокументЗаказКлиента.СуммаАвансаДоОбеспечения КАК СуммаАвансаДоОбеспечения,
	ДокументЗаказКлиента.СуммаПредоплатыДоОтгрузки КАК СуммаПредоплатыДоОтгрузки,
	ДокументЗаказКлиента.ДатаОтгрузки КАК ДатаОтгрузки,
	ДокументЗаказКлиента.ХозяйственнаяОперация КАК ХозяйственнаяОперация,
	ДокументЗаказКлиента.ПорядокРасчетов КАК ПорядокРасчетов,
	ДокументЗаказКлиента.Комментарий КАК Комментарий,
	ВЫБОР
		КОГДА НЕ ДокументЗаказКлиента.Проведен
			ТОГДА ЗНАЧЕНИЕ(Перечисление.СостоянияЗаказовКлиентов.ПустаяСсылка)
		КОГДА Таб_ЗКЗП.ЕстьЗаказПоставщику
			ТОГДА ЗНАЧЕНИЕ(Перечисление.СостоянияЗаказовКлиентов.Заказан)
		ИНАЧЕ ЕСТЬNULL(СостоянияЗаказовКлиентов.Состояние, ЗНАЧЕНИЕ(Перечисление.СостоянияЗаказовКлиентов.Закрыт))
	КОНЕЦ КАК Состояние,
	ВЫБОР
		КОГДА НЕ ДокументЗаказКлиента.Проведен
			ТОГДА ЛОЖЬ
		КОГДА СостоянияЗаказовКлиентов.ДатаСобытия <> ДАТАВРЕМЯ(1, 1, 1)
				И &ДатаАктуальности > СостоянияЗаказовКлиентов.ДатаСобытия
			ТОГДА ИСТИНА
		ИНАЧЕ ЛОЖЬ
	КОНЕЦ КАК Просрочен,
	ВЫБОР
		КОГДА ДокументЗаказКлиента.Приоритет В
				(ВЫБРАТЬ ПЕРВЫЕ 1
					Приоритеты.Ссылка КАК Приоритет
				ИЗ
					Справочник.Приоритеты КАК Приоритеты
				УПОРЯДОЧИТЬ ПО
					Приоритеты.РеквизитДопУпорядочивания)
			ТОГДА 0
		КОГДА ДокументЗаказКлиента.Приоритет В
				(ВЫБРАТЬ ПЕРВЫЕ 1
					Приоритеты.Ссылка КАК Приоритет
				ИЗ
					Справочник.Приоритеты КАК Приоритеты
				УПОРЯДОЧИТЬ ПО
					Приоритеты.РеквизитДопУпорядочивания УБЫВ)
			ТОГДА 2
		ИНАЧЕ 1
	КОНЕЦ КАК КартинкаПриоритета,
	ЕСТЬNULL(СостоянияЗаказовКлиентов.СуммаОплаты, 0) КАК СуммаОплаты,
	ЕСТЬNULL(СостоянияЗаказовКлиентов.ПроцентОплаты, 0) КАК ПроцентОплаты,
	ЕСТЬNULL(СостоянияЗаказовКлиентов.СуммаОтгрузки, 0) КАК СуммаОтгрузки,
	ЕСТЬNULL(СостоянияЗаказовКлиентов.ПроцентОтгрузки, 0) КАК ПроцентОтгрузки,
	ВЫБОР
		КОГДА ЕСТЬNULL(СостоянияЗаказовКлиентов.СуммаДолга, 0) < 0
			ТОГДА ЕСТЬNULL(СостоянияЗаказовКлиентов.СуммаДолга, 0)
		ИНАЧЕ 0
	КОНЕЦ КАК НашДолг,
	ВЫБОР
		КОГДА ЕСТЬNULL(СостоянияЗаказовКлиентов.СуммаДолга, 0) > 0
			ТОГДА ЕСТЬNULL(СостоянияЗаказовКлиентов.СуммаДолга, 0)
		ИНАЧЕ 0
	КОНЕЦ КАК ДолгКлиента,
	ЕСТЬNULL(СостоянияЗаказовКлиентов.ПроцентДолга, 0) КАК ПроцентДолга,
	ЕСТЬNULL(СостоянияЗаказовКлиентов.ДатаСобытия, ДАТАВРЕМЯ(1, 1, 1)) КАК ДатаСобытия,
	ЕСТЬNULL(СостоянияЗаказовКлиентов.ЕстьРасхожденияОрдерНакладная, ЛОЖЬ) КАК ЕстьРасхожденияОрдерНакладная,
	СостоянияЭД.СостояниеЭДО КАК СостояниеЭДО,
	СостоянияЭД.ПредставлениеСостояния КАК ПредставлениеСостояния,
	ДокументЗаказКлиента.Автор КАК Автор,
	&ДополнительныеПоляСостояниеEDI КАК ДополнительныеПоляСостояниеEDI
ИЗ
	Документ.ЗаказКлиента КАК ДокументЗаказКлиента
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СостоянияЗаказовКлиентов КАК СостоянияЗаказовКлиентов
		ПО (СостоянияЗаказовКлиентов.Заказ = ДокументЗаказКлиента.Ссылка)
		{ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СостоянияПоОбъектамУчетаЭДО КАК СостоянияЭД
		ПО (СостоянияЭД.СсылкаНаОбъект = ДокументЗаказКлиента.Ссылка)}
		ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ РАЗЛИЧНЫЕ
			ЗаказыКлиентов.Ссылка КАК Ссылка,
			НЕ ЗаказыПоставщикам.Ссылка ЕСТЬ NULL КАК ЕстьЗаказПоставщику
		ИЗ
			Документ.ЗаказКлиента КАК ЗаказыКлиентов
				ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗаказПоставщику КАК ЗаказыПоставщикам
				ПО ЗаказыКлиентов.Ссылка = ЗаказыПоставщикам.ДокументОснование) КАК Таб_ЗКЗП
		ПО ДокументЗаказКлиента.Ссылка = Таб_ЗКЗП.Ссылка 
Показать
16. iposerg 25.05.23 12:15 Сейчас в теме
(15) Спасибо Вам! Век живи, век учись...
5. SlavaKron 25.05.23 10:04 Сейчас в теме
Если связь документов не 1:1, то лучше через вложенный запрос (вроде бы СУБД оптимизирует вложенные запросы).
6. iposerg 25.05.23 10:10 Сейчас в теме
(5) Можно попросить вас пример на основании моего запроса прислать?
12. nomad_irk 76 25.05.23 11:06 Сейчас в теме
(11)в текущих условиях - по другому никак, т.к. заказ клиента и заказ поставщику - это связь 1-много в общем случае.

есть другой путь: создать периодический подчиненный РС и в него записывать заказы поставщикам, сформированные на основании заказов клиентов, получать срез последних по заказу клиента
13. iposerg 25.05.23 11:10 Сейчас в теме
(12) Это первое решение которое я хотел реализовать, но увы так как задача стоит и по старым заказам смотреть состояния, для отслеживания незакрытых заказов приходится велосибед с квадратными колесами делать....
14. nomad_irk 76 25.05.23 11:17 Сейчас в теме
(13)так регистр можно заполнить по всем документам и уже из него получать нужные данные, если они действительно нужны на постоянной основе. Если это действие разовое, то проще запросом получить данные и закрыть заказы
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот