Помощь с запросом!

1. SnakePlisskin 3 17.12.14 09:14 Сейчас в теме
Доброго дня!
Помогите составить запрос по документам, в которых в табличной части будет встречаться номенклатура из списка значений.
Состав документов не большой вида 4 или 5 пока не определился. Просто интересует сама возможность составления такого запроса.
Спасибо!
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
3. l_user 17.12.14 10:15 Сейчас в теме
(1) alex_gus,
В качестве примера:
	Запрос = СоздатьОбъект("Запрос");
	ТекстЗапроса = 
	"//{{ЗАПРОС(Сформировать)
	|Период с Дата1 по Дата2;
	|Номенклатура = Документ.Реализация.Номенклатура, Документ.ПоступлениеТМЦ.Номенклатура;
	|КоличествоПриход = Документ.ПоступлениеТМЦ.Количество;
	|КоличествоРасход = Документ.Реализация.Количество;
	|Функция КолПриходСумма = Сумма(КоличествоПриход);
	|Функция КолРасходСумма = Сумма(КоличествоРасход);
	|Группировка Номенклатура без групп;
	|Условие(Номенклатура в ВыбНоменклатура);
	|"//}}ЗАПРОС
	;
	// Если ошибка в запросе, то выход из процедуры
	Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
		Возврат;
	КонецЕсли;
Показать

Примечания:
1. Типовая "Торговля и склад".
2. Пример можно рассматривать только как шаблон. Например, здесь не обрабатываются условия: "возвратов поставщику" или "возврата от покупателя", проведенный-непроведенный документ и тд.
4. Jill 17 17.12.14 11:07 Сейчас в теме
(3) l_user, а не проще, например, к регистру остатков (остаткиТМЦ) обратиться?
5. l_user 17.12.14 11:16 Сейчас в теме
(4) Jill,
а не проще

Если мы говорим о моем примере, то да проще. А если попытаемся помнить о вопросе, заданным топикстартером, то я, например, не знаю зачем ему понадобилось обращение к табличным частям нескольких документов. :)
6. SnakePlisskin 3 17.12.14 12:31 Сейчас в теме
(5) l_user, все очень просто просто надо выудить из базы документы в которых встречается номенклатура из заданной группы и заменить один реквизит на другой в шапке документа.
7. l_user 17.12.14 13:10 Сейчас в теме
(6) alex_gus,
Если у вас остается желание выполнить один запрос, то можно использовать следующую конструкцию:
	ТекстЗапроса = 
	"//{{ЗАПРОС(Сформировать)
	|Период с Дата1 по Дата2;
	|Номенклатура = Документ.Реализация.Номенклатура, Документ.ПоступлениеТМЦ.Номенклатура;
	|Функция Счётчик = Счётчик();
	|Группировка Документ;
	|Условие(Номенклатура в ВыбНоменклатура);
	|"//}}ЗАПРОС
Показать

Если документов в вашей базе много, то, как отмечают здесь многие, вполне может оказаться, что несколько запросов (каждый для отдельного документа) будут в сумме работать быстрее, чем один.
2. Cooler 22 17.12.14 09:50 Сейчас в теме
Состав документов не большой вида 4 или 5 пока не определился.
Определиться очень просто: даже 2 - уже чересчур.
8. SnakePlisskin 3 17.12.14 13:11 Сейчас в теме
Вот так вот отлично работает :
  Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса = 
    "//{{ЗАПРОС(Сформировать)
    |Период с Дата1 по Дата2;
    |Номенклатура = Документ.Реализация.Номенклатура, Документ.ПоступлениеТМЦ.Номенклатура, Документ.ВозвратОтПокупателя.Номенклатура;
    |ТекДок       = Документ.ПоступлениеТМЦ.ТекущийДокумент, Документ.Реализация.ТекущийДокумент, Документ.ВозвратОтПокупателя.ТекущийДокумент;
    |Группировка ТекДок;
    |Условие(Номенклатура в СписНоменк);
    |"//}}ЗАПРОС
    ;
Показать

Получил список документов!
9. Jill 17 17.12.14 15:33 Сейчас в теме
(8) alex_gus, а если номенклатура еще и в списании/оприходовании/перемещении и т.п. фигурирует? Тады ведь "ой" получится.
Я бы на Вашем месте, таки, сделал сначала запрос к регистрам и получил тот самый список документов.
10. vcv 89 17.12.14 18:39 Сейчас в теме
(9) Jill, Похоже автор заполняет какой-то новый добавленный реквизит в документах. Такие операции нужно делать на всех документах. Проведенных и нет. В таких случаях обработка документов по их содержимому оправдана.
11. hexus 3 18.12.14 11:55 Сейчас в теме
В типовых обработках, ктоторые встречаются на ИТС есть обработка которая может такое делать.
12. vcv 89 18.12.14 12:27 Сейчас в теме
(11) hexus, Да, UChoice может отобрать документы по номенклатуре в табличной части и заполнить реквизит по отобранным документам. Но список номенклатуры нужно задавать в ручную. А ТС про его размеры ничего не говорил. Может пять штук, а может и пять тысяч.
13. hexus 3 18.12.14 12:29 Сейчас в теме
(12) согласен, просто предложил один из вариантов. да и в коде там можно посмотреть как это реализовано
14. SnakePlisskin 3 18.12.14 12:47 Сейчас в теме
Ребят, спасибо за помощь! Уже все решено, список значений заполняется путем выбора Папки номенклатуры, там порядка 30 позиций, на выходе получается порядка 500-та документов, работает примерно секунд 20-30 (только поиск).
15. SnakePlisskin 3 12.01.15 09:15 Сейчас в теме
Оживим темку, как теперь оптимально сделать следующую вещь, выбрав документы, нужо из ТЧ этих документов убрать все позиции, оставив только те что будут в "списке значений"?
17. l_user 12.01.15 10:03 Сейчас в теме
(15) alex_gus,
Как вариант:
1. Запрос. Здесь нужно проверить как использовать условие "НЕ в списке" (давно не использовал).
	ТекстЗапроса = 
	"//{{ЗАПРОС(Сформировать)
	|Период с Дата1 по Дата2;
	|Номенклатура = Документ.Реализация.Номенклатура, Документ.ПоступлениеТМЦ.Номенклатура, Документ.ВозвратОтПокупателя.Номенклатура;
	|ТекДок = Документ.ПоступлениеТМЦ.ТекущийДокумент, Документ.Реализация.ТекущийДокумент, Документ.ВозвратОтПокупателя.ТекущийДокумент;
	|Группировка ТекДок;
	|Группировка СтрокаДокумента;
	|Условие (НЕ(Номенклатура в СписНоменк));
	|"//}}ЗАПРОС
	;
	// Если ошибка в запросе, то выход из процедуры
	Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
		Возврат;
	КонецЕсли;
	
Показать

2. Обработка результата запроса.
	ТЗ	= СоздатьОбъект("ТаблицаЗначений");
	Запрос.Выгрузить(ТЗ);
	ТЗ.Сортировать("ТекДок, СтрокаДокумента-");
Выгрузка в таблицу значений я использовал для предварительной сортировки номеров строк документа в обратном порядке, чтобы затем было легче удалять ненужные, то есть без лишних расчетов и проверок.
3. Дальше уже обработка документов и номеров строк по полученной таблице значений.
16. ivsher 12.01.15 09:31 Сейчас в теме
Группировка Номенклатура... не?
18. Cooler 22 12.01.15 10:11 Сейчас в теме
Если все равно в конце концов надо обрабатывать документы, то какой смысл громоздить запросы один на другой? Получили в первом список документов - и вперед обрабатывать один за другим по этому списку, все равно в каждом нужно удалить хоть одну строку.
20. l_user 12.01.15 10:44 Сейчас в теме
(18) Cooler,
Если в оставляемом списке номенклатуры есть группы справочника, то предлагаемый мною алгоритм реализуется проще и нагляднее.
То alex_gus:
Чем вас не устраивает группировка "СтрокаДокумента", в результате которой вы сразу получаете номер строки, которую затем можно удалить?
21. ivsher 12.01.15 11:55 Сейчас в теме
(20) l_user, может я что до конца не понял что хочет получить автор, но чем не устраивает вариант с Номенклатурой.
Код
 
    ТекстЗапроса = 
    "//{{ЗАПРОС(Сформировать)
    |Период с Дата1 по Дата2;
    |Номенклатура = Документ.Реализация.Номенклатура, Документ.ПоступлениеТМЦ.Номенклатура;
    |Функция Счётчик = Счётчик();
    |Группировка Документ;
    |Группировка Номенклатура;
    |Условие(Номенклатура в ВыбНоменклатура);
    |"//}}ЗАПРОС
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
        Возврат;
    КонецЕсли;
    Пока Группировка(1)=1 Цикл

        Пока Группиировка(2)Цикл

        КонецЦикла (по номенклатуре)   
    КонецЦикла (по документам)
Показать полностью

По-моему получаем то что надо, документы и номенклатуру только ту что в списке.
22. l_user 12.01.15 12:18 Сейчас в теме
(21) ivsher,
l_user, может я что до конца не понял что хочет получить автор, но чем не устраивает вариант с Номенклатурой.

Я попытаюсь объяснить так, как понял я.
Автору нужно убрать из табличных частей документов те строки, в которых находится номенклатура, не входящая в оставляемый список номенклатуры.
В вашем запросе имеется только лишь группировка по "Документам" и, внутри дополнительную группировку по "Номенклатуре". То есть получается, что идет "обход" по документам и номенклатуре из этих документов. При этом выбираются только документы и номенклатура, входящие в список оставляемой номенклатуры.
Для удаления строк из документов данный запрос неинформативен.
19. SnakePlisskin 3 12.01.15 10:17 Сейчас в теме
Все, понял, видимо как в цикле потом по результату запроса, с группировкой текдок, больше никак, перебор строк в документе.
23. SnakePlisskin 3 12.01.15 12:20 Сейчас в теме
Сррри, может не понятно изложил мысль. Хотелось в запросе потнайденным документам, из табличный частей документов удалить те строки, номенклатура которых не входит в список значений.
24. l_user 12.01.15 12:22 Сейчас в теме
(23) alex_gus,
Чем вас не устраивает группировка "СтрокаДокумента"?
25. SnakePlisskin 3 12.01.15 16:19 Сейчас в теме
(24) l_user, что-то не то на выходе получили, получили как раз те документы в которых вообще не встречается номенклатура из Списка значений, а должны получить список документов где встречается в ТЧ номенклатура из списка значений и удалить те строки из этих документов которые не входят в список значений.
26. SnakePlisskin 3 12.01.15 17:15 Сейчас в теме
С этим разобрался, ввел дополнительное условие. теперь на выходе из запроса, номера строк в документах, которые мне надо удалить. Вот только как теперь в цикле обработать документы не пойму.
Прикрепленные файлы:
27. l_user 12.01.15 18:33 Сейчас в теме
(26) alex_gus,
Например, но проверять и проверять(!):
Процедура ОбработкаТЗ(ТЗ)
	ТЗ.ВыбратьСтроки();
	ТекущийДокумент = ПолучитьПустоеЗначение("Документ");
	Док = СоздатьОбъект("Документ");
	Пока ТЗ.ПолучитьСтроку()=1 Цикл
		Если ТЗ.ТекДок.Выбран()=0 Тогда Продолжить; КонецЕсли;
		Если ТЗ.ТекДок<> ТекущийДокумент Тогда
			Если Док.Выбран()>0 Тогда
				Док.Записать();
				Если Док.Проведен()=1 Тогда
					Док.Провести(); 
				КонецЕсли;
			КонецЕсли;
			ТекущийДокумент = ТЗ.ТекДок;
			Док.НайтиДокумент(текущийДокумент);
		КонецЕсли;
		Док.УдалитьСтроку(ТЗ.СтрокаДокумента);
	КонецЦикла;
	Если Док.Выбран()>0 Тогда
		Док.Записать();
		Если Док.Проведен()=1 Тогда
			Док.Провести(); 
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры
Показать
Оставьте свое сообщение

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