Способ модификации запросов, которые собираются по частям

16.08.13

Разработка - Запросы

При создании внешних печатных форм часто приходится модифицировать типовой запрос, который собирается по частям. Такие запросы сложно редактировать. Но есть один способ, которым я пользуюсь.

За пример возьмем кусок кода по сборке запроса для ТОРГ-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. Публикация для чтения за кружкой чая, вместо новостей.

временные таблицы внешняя печатная форма ВПФ

См. также

SALE! 20%

Infostart Toolkit: Инструменты разработчика 1С 8.3 на управляемых формах

Инструментарий разработчика Роли и права Запросы СКД Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

10000 8000 руб.

02.09.2020    122405    673    389    

716

Для чего используют конструкцию запроса "ГДЕ ЛОЖЬ" в СКД на примере конфигурации 1С:ERP

Запросы СКД Платформа 1С v8.3 Запросы Система компоновки данных 1С:ERP Управление предприятием 2 Бесплатно (free)

В типовых конфигурациях разработчики компании 1С иногда используют в отчетах, построенных на СКД, такую конструкцию, как "ГДЕ ЛОЖЬ". Такая конструкция говорит о том, что данные в запросе не будут получены совсем. Для чего же нужен тогда запрос?

13.02.2024    5757    KawaNoNeko    23    

23

Набор-объект для СКД по тексту или запросу

Запросы СКД Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Абонемент ($m)

Есть список полей в виде текста, или запрос - закидываем в набор СКД.

1 стартмани

31.01.2024    2007    2    Yashazz    0    

29

Запрос 1С copilot

Инструментарий разработчика Запросы Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Абонемент ($m)

Пишем на человеческом языке, что нам надо, и получаем текст запроса на языке 1С. Используются большие языковые модели (LLM GPT) от OpenAI или Яндекс на выбор.

5 стартмани

15.01.2024    6300    31    mkalimulin    25    

50

PrintWizard: поддержка представлений ЗУП в конструкторе

Инструментарий разработчика Запросы Платформа 1С v8.3 Бесплатно (free)

Одной из интересных задач, стоящих в процессе разработки, была поддержка механизма представлений в ЗУП. Но не просто возможность исполнения запросов с ними. Основная проблема была в том, чтобы с ними было удобно работать, а именно: создавать, модифицировать и отлаживать. Кратко о том, что в итоге получилось...

14.12.2023    1750    vandalsvq    7    

29

Объектная модель запроса "Схема запроса" 2

Запросы Платформа 1С v8.3 Запросы Конфигурации 1cv8 Бесплатно (free)

Далеко уже не новый тип данных "Схема запроса". Статья о том, как использовать его "попроще". Примеры создания текста запроса с нуля и изменение имеющегося запроса.

06.12.2023    5398    user1923546    26    

43

Начните уже использовать хранилище запросов

HighLoad оптимизация Запросы

Очень немногие из тех, кто занимается поддержкой MS SQL, работают с хранилищем запросов. А ведь хранилище запросов – это очень удобный, мощный и, главное, бесплатный инструмент, позволяющий быстро найти и локализовать проблему производительности и потребления ресурсов запросами. В статье расскажем о том, как использовать хранилище запросов в MS SQL и какие плюсы и минусы у него есть.

11.10.2023    16201    skovpin_sa    14    

98
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. MarSeN 984 16.08.13 20:39 Сейчас в теме
Мне кажется лучше использовать способ из статьи http://infostart.ru/public/170935/
Минусом вашего подхода ясляется то что
- вы дважды выполняете запрос к базе данных
- в случае использования итогов ваш способ не прокатит
2. Yimaida 37 17.08.13 01:03 Сейчас в теме
(1) Ну я позволю себе немного Вас поправить. Описанный Вами способ не оптимальный, для меня по крайней мере. Причем, он довольно часто используется в типовых конфигурациях и поэтому не несет для меня ничего нового.
>>- вы дважды выполняете запрос к базе данных
Да, дважды. Я дважды выполняю запрос, но я не дважды работаю с одними и теми же данными.
>>- в случае использования итогов ваш способ не прокатит
А вот тут я полностью согласен.

Возвращаясь к методу описанному в Вашей статье... Чтобы подменить запрос на наш, надо знать итоговые поля. А если текст запроса собирается по кускам, то сделать это не так то и просто. В моей статье упор делается на то, что мы можем даже не учитывать поля, которые выдает оригинальный запрос, для этого используем *.
3. MarSeN 984 17.08.13 11:33 Сейчас в теме
(2)
Чтобы подменить запрос на наш, надо знать итоговые поля. А если текст запроса собирается по кускам, то сделать это не так то и просто.

Не соглашусь с данным выводом так как с успехом применял все что описано в статье на практике. Времени занимает не так и много, чтоб отказываться от такого метода.

Но в любом случае каждый из предложенных вариантов имеет право на жизнь )
Суть моего комментария не указать на то что Вы не правы, а показать сообществу что в данном способе есть некоторые недочеты и высказать свое мнение по этому поводу.
Спасибо
4. serge_focus 4 24.08.13 20:35 Сейчас в теме
Спасибо!
Плюс за идею.
5. serge_focus 4 24.08.13 20:35 Сейчас в теме
Спасибо!
За Идею - Плюс .
6. Xershi 1475 26.11.15 08:50 Сейчас в теме
А я просто ставлю точку останова и потом копирую конечный результат запроса.
В итоге на разбор сложного запроса не тратится ни секунды.
Только потом когда запрос в консоле оттестировал руками дописки вставляю.
7. Yimaida 37 26.11.15 12:42 Сейчас в теме
(6) Точка останова это хорошо... А как Вы через скопированный в точке останова запросе предусмотрите динамическое формирование типового запроса:
...
  |    " + СтрокаВыборкиПоляСодержания + "                  КАК ТоварНаименование,
    |    РеализацияТоваровУслуг.Номенклатура." + ТоварКод + " КАК ТоварКод,
...
8. Xershi 1475 26.11.15 12:44 Сейчас в теме
(7) ну что значит динамически. Варианты то всегда статические.
9. Yimaida 37 26.11.15 13:31 Сейчас в теме
(8) Херши Кола, динамически в данном случае означает, что в формировании запроса участвуют переменные, значения которых на момент разбора запроса не известны. То что они выбираются из известного множества не означает, что они известны. Вот и получается, что "ТоварКод" может быть и Кодом номенклатуры и Артикулом, а может еще чем-то. Сегодня одно значение будет, а завтра другое.
Упор в статье именно на такие случаи, когда запрос может менять состав полей в зависимости от значения переменных на основании которых он собирается.
Оставьте свое сообщение