Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
22 ноя 2024, 06:13

Запросы в цикле

Автор Zeed, 24 июн 2016, 09:30

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

Zeed

Все знают, что запросы в цикле это плохо. Как в таком случае правильно организовать общий запрос. Допустим, в документе есть табличная часть с номенклатурой. Далее, в самой номенклатуре есть две табличные части (контакты, составные части).
В печатную форму надо вывести каждую номенклатуру, в колонках напротив адреса/телефоны (в одну ячейку) и составные части номенклатуры(в другую ячейку).
В общий запрос можно передать список номенклатуры из документа, это понятно. А как поступать с несколькими табличными частями. Как потом обходить запрос и выводить результат в макет?

vitasw

В качестве примера

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

Запрос.УстановитьПараметр("Ссылка", Ссылка);

РезультатЗапроса = Запрос.Выполнить();

Макет=ПолучитьМакет("....");

ВыборкаНоменклатура = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

Пока ВыборкаНоменклатура.Следующий() Цикл

СтрокаСостав="";

ВыборкаСоставНоменклатура = ВыборкаНоменклатура.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам,"СоставНоменклатура");
Пока ВыборкаСоставНоменклатура.Следующий() Цикл
СтрокаСостав=СтрокаСостав+Строка(ВыборкаСоставНоменклатура.СоставНоменклатура)+":"+Строка(ВыборкаСоставНоменклатура.КоличествоВСоставе);
КонецЦикла;

ПростоСтрока="";
ВыборкаЗначениеРеквизита = ВыборкаНоменклатура.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам,"ЗначениеРеквизита");
Пока ВыборкаЗначениеРеквизита.Следующий() Цикл
ПростоСтрока=ПростоСтрока+Строка(ВыборкаЗначениеРеквизита.ЗначениеРеквизита)
КонецЦикла;
...
Область=Макет.ПолучитьОбласть("Строка");
Область.Параметры.Заполнить(ВыборкаНоменклатура);
Область.Параметры.Состав=СтрокаСостав;
Область.Параметры.Описание=ПростоСтрока;
                        ...
ТабДокумент.Вывести(Область);
КонецЦикла;

LexaK

просто не смог удержаться, не ответить.

Все знают что прежде чем что-то делать, этому надо сначала научиться! :befhbt:
Поэтому ноги в руки и на курсы(хорошие/качественные) программистов 1С!
Так как, ни какой форум, не научит вас, как правильно и профессионально программировать.

На форуме, помогут ошибку какую найти, идейку подкинут как ту или иную проблему решить,
но не объяснять/разжевывать прописные истины. :fdbsdfbsd:
если помогло нажмите: Спасибо!

Zeed

Цитата: vitasw от 24 июн 2016, 09:47
В качестве примера

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

Запрос.УстановитьПараметр("Ссылка", Ссылка);

РезультатЗапроса = Запрос.Выполнить();

Макет=ПолучитьМакет("....");

ВыборкаНоменклатура = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

Пока ВыборкаНоменклатура.Следующий() Цикл

СтрокаСостав="";

ВыборкаСоставНоменклатура = ВыборкаНоменклатура.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам,"СоставНоменклатура");
Пока ВыборкаСоставНоменклатура.Следующий() Цикл
СтрокаСостав=СтрокаСостав+Строка(ВыборкаСоставНоменклатура.СоставНоменклатура)+":"+Строка(ВыборкаСоставНоменклатура.КоличествоВСоставе);
КонецЦикла;

ПростоСтрока="";
ВыборкаЗначениеРеквизита = ВыборкаНоменклатура.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам,"ЗначениеРеквизита");
Пока ВыборкаЗначениеРеквизита.Следующий() Цикл
ПростоСтрока=ПростоСтрока+Строка(ВыборкаЗначениеРеквизита.ЗначениеРеквизита)
КонецЦикла;
...
Область=Макет.ПолучитьОбласть("Строка");
Область.Параметры.Заполнить(ВыборкаНоменклатура);
Область.Параметры.Состав=СтрокаСостав;
Область.Параметры.Описание=ПростоСтрока;
                        ...
ТабДокумент.Вывести(Область);
КонецЦикла;


Спасибо, что-то вроде этого я и искал!

temrmal

Цитата: LexaK от 24 июн 2016, 09:52
просто не смог удержаться, не ответить.

Все знают что прежде чем что-то делать, этому надо сначала научиться! :befhbt:
Поэтому ноги в руки и на курсы(хорошие/качественные) программистов 1С!
Так как, ни какой форум, не научит вас, как правильно и профессионально программировать.

На форуме, помогут ошибку какую найти, идейку подкинут как ту или иную проблему решить,
но не объяснять/разжевывать прописные истины. :fdbsdfbsd:

+10000

Теги: запросы  

Похожие темы (5)

Рейтинг@Mail.ru

Поиск