За пример возьмем кусок кода по сборке запроса для ТОРГ-12:
СтрокаВыборкиПоляСодержания = ОбработкаТабличныхЧастей.ПолучитьЧастьЗапросаДляВыбораСодержания("РеализацияТоваровУслуг");
ТекстЗапросаТовары = ТекстЗапросаТовары + "
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| РеализацияТоваровУслуг.Номенклатура КАК Номенклатура,
| " + СтрокаВыборкиПоляСодержания + " КАК ТоварНаименование,
| РеализацияТоваровУслуг.Номенклатура." + ТоварКод + " КАК ТоварКод,
| РеализацияТоваровУслуг.Номенклатура.ЕдиницаХраненияОстатков.Представление КАК БазоваяЕдиницаНаименование,
| РеализацияТоваровУслуг.Номенклатура.ЕдиницаХраненияОстатков.ЕдиницаПоКлассификатору.Код КАК БазоваяЕдиницаКодПоОКЕИ,
| РеализацияТоваровУслуг.Номенклатура.ЕдиницаХраненияОстатков КАК ЕдиницаИзмерения,
| NULL КАК ВидУпаковки,
| NULL КАК КоличествоВОдномМесте,
| 0.00 КАК МассаБрутто,
| NULL КАК Характеристика,
| NULL КАК Серия,
| РеализацияТоваровУслуг.СтавкаНДС КАК СтавкаНДС,
| РеализацияТоваровУслуг.Цена * &Курс / &Кратность КАК Цена,
| ВЫБОР КОГДА(РеализацияТоваровУслуг.ПроцентСкидкиНаценки = 0.00)
| ТОГДА ЛОЖЬ
| ИНАЧЕ Истина
| КОНЕЦ КАК ЕстьСкидкиПоСтроке,
| РеализацияТоваровУслуг.Количество КАК Количество,
| NULL КАК КоличествоМест,
| РеализацияТоваровУслуг.Сумма * &Курс / &Кратность КАК Сумма,
| РеализацияТоваровУслуг.СуммаНДС * &Курс / &Кратность КАК СуммаНДС,
| РеализацияТоваровУслуг.НомерСтроки КАК НомерСтроки,
| 1.00 КАК Метка
|ИЗ
| Документ.РеализацияТоваровУслуг.Услуги КАК РеализацияТоваровУслуг
|
|ГДЕ
| РеализацияТоваровУслуг.Ссылка = &ТекущийДокумент
|";
ТекстЗапросаТовары = ТекстЗапросаТовары + "
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| РеализацияТоваровУслуг.Номенклатура КАК Номенклатура,
| ВЫРАЗИТЬ(РеализацияТоваровУслуг.Номенклатура.НаименованиеПолное КАК Строка(1000)) КАК ТоварНаименование,
| РеализацияТоваровУслуг.Номенклатура." + ТоварКод + " КАК ТоварКод,
| РеализацияТоваровУслуг.Номенклатура.ЕдиницаХраненияОстатков.Представление КАК БазоваяЕдиницаНаименование,
| РеализацияТоваровУслуг.Номенклатура.ЕдиницаХраненияОстатков.ЕдиницаПоКлассификатору.Код КАК БазоваяЕдиницаКодПоОКЕИ,
| РеализацияТоваровУслуг.Номенклатура.ЕдиницаХраненияОстатков КАК ЕдиницаИзмерения,
| NULL КАК ВидУпаковки,
| NULL КАК КоличествоВОдномМесте,
| РеализацияТоваровУслуг.Количество * РеализацияТоваровУслуг.Номенклатура.ЕдиницаХраненияОстатков.Вес КАК МассаБрутто,
| NULL КАК Характеристика,
| NULL КАК Серия,
| ""Без НДС"" КАК СтавкаНДС,
| РеализацияТоваровУслуг.Цена * &Курс / &Кратность КАК Цена,
| Ложь КАК ЕстьСкидкиПоСтроке,
| РеализацияТоваровУслуг.Количество КАК Количество,
| NULL КАК КоличествоМест,
| РеализацияТоваровУслуг.Сумма * &Курс / &Кратность КАК Сумма,
| 0.00 КАК СуммаНДС,
| РеализацияТоваровУслуг.НомерСтроки КАК НомерСтроки,
| 2.00 КАК Метка
|ИЗ
| Документ.РеализацияТоваровУслуг.ВозвратнаяТара КАК РеализацияТоваровУслуг
|
|ГДЕ
| РеализацияТоваровУслуг.Ссылка = &ТекущийДокумент
|
|
|УПОРЯДОЧИТЬ ПО Метка ВОЗР, НомерСтроки ВОЗР
|
|";
Отредактировать этот запрос можно только ручками.
Основная идея в том, что мы помещаем результирующую выгрузку во временную таблицу и уже к ней добавляем все что нам надо.
Сразу после выгрузки результата типового запроса вставляем свой код.
В моем случае я прикручивал артикул и название товара покупателя:
Запрос.Текст = ТекстЗапросаТовары; ЗапросТовары = Запрос.Выполнить().Выгрузить(); //Добавляем свои реквизиты к результату запроса //( ЗапросНоменклатураКонтрагента = Новый Запрос; ЗапросНоменклатураКонтрагента.Текст = "//////////////////////////////////////////////////////////////////////////////// | ВЫБРАТЬ ТЗ.* ПОМЕСТИТЬ РеализацияТоваровУслугТовары ИЗ &ТЗ КАК ТЗ | ; | |ВЫБРАТЬ | РеализацияТоваровУслугТовары.*, | ЕСТЬNULL(всх_НоменклатураКонтрагентовСрезПоследних.НаименованиеНоменклатурыКонтрагента, всх_НоменклатураКонтрагентовСрезПоследнихБезХарактеристик.НаименованиеНоменклатурыКонтрагента) КАК НоменклатураКонтрагента, | ЕСТЬNULL(всх_АртикулыКонтрагентовСрезПоследних.АртикулНоменклатурыКонтрагента, всх_АртикулыКонтрагентовСрезПоследнихБезХарактеристик.АртикулНоменклатурыКонтрагента) КАК Артикул |ИЗ | РеализацияТоваровУслугТовары КАК РеализацияТоваровУслугТовары | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.всх_НоменклатураКонтрагентов.СрезПоследних(&Период, Контрагент = &Контрагент) КАК всх_НоменклатураКонтрагентовСрезПоследних | ПО РеализацияТоваровУслугТовары.Номенклатура = всх_НоменклатураКонтрагентовСрезПоследних.Номенклатура | И РеализацияТоваровУслугТовары.Характеристика = всх_НоменклатураКонтрагентовСрезПоследних.ХарактеристикаНоменклатуры | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.всх_НоменклатураКонтрагентов.СрезПоследних(&Период, Контрагент = &Контрагент) КАК всх_НоменклатураКонтрагентовСрезПоследнихБезХарактеристик | ПО РеализацияТоваровУслугТовары.Номенклатура = всх_НоменклатураКонтрагентовСрезПоследнихБезХарактеристик.Номенклатура | И (всх_НоменклатураКонтрагентовСрезПоследнихБезХарактеристик.ХарактеристикаНоменклатуры = ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка)) | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.всх_АртикулыКонтрагентов.СрезПоследних(&Период, Контрагент = &Контрагент) КАК всх_АртикулыКонтрагентовСрезПоследних | ПО РеализацияТоваровУслугТовары.Номенклатура = всх_АртикулыКонтрагентовСрезПоследних.Номенклатура | И РеализацияТоваровУслугТовары.Характеристика = всх_АртикулыКонтрагентовСрезПоследних.ХарактеристикаНоменклатуры | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.всх_АртикулыКонтрагентов.СрезПоследних(&Период, Контрагент = &Контрагент) КАК всх_АртикулыКонтрагентовСрезПоследнихБезХарактеристик | ПО РеализацияТоваровУслугТовары.Номенклатура = всх_АртикулыКонтрагентовСрезПоследних.Номенклатура | И (всх_АртикулыКонтрагентовСрезПоследнихБезХарактеристик.ХарактеристикаНоменклатуры = ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка)) |"; ЗапросНоменклатураКонтрагента.УстановитьПараметр("Контрагент", СсылкаНаОбъект.Контрагент); ЗапросНоменклатураКонтрагента.УстановитьПараметр("Период", СсылкаНаОбъект.Дата); ЗапросНоменклатураКонтрагента.УстановитьПараметр("ТЗ", ЗапросТовары); ЗапросТовары = ЗапросНоменклатураКонтрагента.Выполнить().Выгрузить(); //)
Итоговый текст запроса можно подготовить в конструкторе запросов, иначе в чем выгода тогда такого способа. И немного подправить ручками. Т.е. мы прикручиваем новые поля в запросе к РеализацияТоваровУслугТовары, которую потом меняем на временную таблицу. Оригинальные поля получаем через *:
| ВЫБРАТЬ ТЗ.* ПОМЕСТИТЬ РеализацияТоваровУслугТовары ИЗ &ТЗ КАК ТЗ
Правда, модифицированный запрос с передачей таблицы через параметр открыть в конструкторе не получится.
P.S. Во внешних печатных формах я еще начал использовать небольшую хитрось по передаче параметров
времСтруктура = Новый Структура;
времСтруктура.Вставить("ПредставлениеПодразделения", Шапка.Подразделение);
ОбластьМакета.Параметры.Заполнить(времСтруктура);
При таком способе никогда не вылетит ошибка, если вы используете несколько макетов, а данные формируете одинаково. Если в макете нет этого параметра то ничего страшного не произойдет.
P.P.S. Публикация для чтения за кружкой чая, вместо новостей.
Мне кажется лучше использовать способ из статьиhttp://infostart.ru/public/170935/
Минусом вашего подхода ясляется то что
— вы дважды выполняете запрос к базе данных
— в случае использования итогов ваш способ не прокатит
(1) Ну я позволю себе немного Вас поправить. Описанный Вами способ не оптимальный, для меня по крайней мере. Причем, он довольно часто используется в типовых конфигурациях и поэтому не несет для меня ничего нового.
>>- вы дважды выполняете запрос к базе данных
Да, дважды. Я дважды выполняю запрос, но я не дважды работаю с одними и теми же данными.
>>- в случае использования итогов ваш способ не прокатит
А вот тут я полностью согласен.
Возвращаясь к методу описанному в Вашей статье… Чтобы подменить запрос на наш, надо знать итоговые поля. А если текст запроса собирается по кускам, то сделать это не так то и просто. В моей статье упор делается на то, что мы можем даже не учитывать поля, которые выдает оригинальный запрос, для этого используем *.
(2)
Не соглашусь с данным выводом так как с успехом применял все что описано в статье на практике. Времени занимает не так и много, чтоб отказываться от такого метода.
Но в любом случае каждый из предложенных вариантов имеет право на жизнь )
Суть моего комментария не указать на то что Вы не правы, а показать сообществу что в данном способе есть некоторые недочеты и высказать свое мнение по этому поводу.
Спасибо
Спасибо!
Плюс за идею.
Спасибо!
За Идею — Плюс .
А я просто ставлю точку останова и потом копирую конечный результат запроса.
В итоге на разбор сложного запроса не тратится ни секунды.
Только потом когда запрос в консоле оттестировал руками дописки вставляю.
(6) Точка останова это хорошо… А как Вы через скопированный в точке останова запросе предусмотрите динамическое формирование типового запроса:
(7) ну что значит динамически. Варианты то всегда статические.
(8) Херши Кола, динамически в данном случае означает, что в формировании запроса участвуют переменные, значения которых на момент разбора запроса не известны. То что они выбираются из известного множества не означает, что они известны. Вот и получается, что «ТоварКод» может быть и Кодом номенклатуры и Артикулом, а может еще чем-то. Сегодня одно значение будет, а завтра другое.
Упор в статье именно на такие случаи, когда запрос может менять состав полей в зависимости от значения переменных на основании которых он собирается.