Предисловие 

Доброго всем времени! Поскольку я сейчас в большей степени занимаюсь работой в конфигурации 1С:Управление торговлей 8 (11.5), хотел бы вам сделать один обзор на совершенно типовой функционал этой конфигурации, а именно - работе с запросами по "схемам запросов".

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

Я почти уверен, что многие из вас не используют данные возможности, а они будут вам очень полезны при разработке новых и доработке существующих листингов запросов. Отмечу, что похожий модуль так же доступен и в других типовых - например, в БП 3.0 (однако, он там содержит несколько другие методы).

Отмечу, что это не функционал Библиотеки стандартных подсистем (БСП), а функционал типовых, БСП ничего не знает об этом.

В своем обзоре я буду приводить примеры используя конфигурацию 1С:Управление торговлей 11.5.22.92 (длительной поддержки) на Платформе 1С 8.3.27.1688. 

Если статья вам "зайдет" - сделаю обзор по методам работы со схемами запросов в БП 3.0... а так же можно далее детально рассмотреть "чистый код" работы по схемам запросов.

Я уверен, что данный материал заинтересует всех желающих - от пользователей до "матерых" кодеров. Перехожу к описанию функционала нескольких методов:

Описание функционала

В основе описания функционала лежит обзор функций общего модуля "СхемыЗапросов". Для начала создадим простой запрос, который будем менять:

Начальный запрос, его будем менять
// ==== основной подготовленный запрос для изменений =======
Запрос = "ВЫБРАТЬ
	|	Контрагенты.Ссылка КАК Ссылка,
	|	Контрагенты.ЮридическоеФизическоеЛицо КАК ЮридическоеФизическоеЛицо,
	|	Контрагенты.ИНН КАК ИНН,
	|	Контрагенты.КПП КАК КПП,
	|	Контрагенты.ЮрФизЛицо КАК ЮрФизЛицо
	|ИЗ
	|	Справочник.Контрагенты КАК Контрагенты";

1.Использование функций добавление в поля выборки ДобавитьПолеВыборкиВЗапрос:

Добавить поле выборки
// ===== Добавить поле новой выборки в запрос

ПолеВыборки1 		= "Контрагенты.НаименованиеПолное";
НовыйТекстЗапроса 	= СхемыЗапросов.ДобавитьПолеВыборкиВЗапрос(Запрос,ПолеВыборки1,"НаименованиеПолное");

//Результат, автоматом добавляем поле "НаименованиеПолное":
ВЫБРАТЬ
	Контрагенты.Ссылка КАК Ссылка,
	Контрагенты.ЮридическоеФизическоеЛицо КАК ЮридическоеФизическоеЛицо,
	Контрагенты.ИНН КАК ИНН,
	Контрагенты.КПП КАК КПП,
	Контрагенты.ЮрФизЛицо КАК ЮрФизЛицо,
	Контрагенты.НаименованиеПолное КАК НаименованиеПолное
ИЗ
	Справочник.Контрагенты КАК Контрагенты

2.Выборка первых записей

Выбрать ПЕРВЫЕ
// ===== Количество записей ПЕРВЫЕ 5 ===
НовыйТекстЗапроса1 = СхемыЗапросов.УстановитьКоличествоПолучаемыхЗаписей(НовыйТекстЗапроса,5);

// Результат - добавит ключевое слово ПЕРВЫЕ с параметром 5:
ВЫБРАТЬ ПЕРВЫЕ 5
	Контрагенты.Ссылка КАК Ссылка,
	Контрагенты.ЮридическоеФизическоеЛицо КАК ЮридическоеФизическоеЛицо,
	Контрагенты.ИНН КАК ИНН,
	Контрагенты.КПП КАК КПП,
	Контрагенты.ЮрФизЛицо КАК ЮрФизЛицо,
	Контрагенты.НаименованиеПолное КАК НаименованиеПолное
ИЗ
	Справочник.Контрагенты КАК Контрагенты

3.Выборка разрешенных записей

Выбрать РАЗРЕШЕННЫЕ
// ==== Установить разрешенные в ВЫБРАТЬ ===
	
НовыйТекстЗапроса2 = СхемыЗапросов.УстановитьВыборкуРазрешенныхЗаписей(НовыйТекстЗапроса1,ИСТИНА);

//Результат (Если ЛОЖЬ - РАЗРЕШЕННЫЕ удалит):
ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 5
	Контрагенты.Ссылка КАК Ссылка,
	Контрагенты.ЮридическоеФизическоеЛицо КАК ЮридическоеФизическоеЛицо,
	Контрагенты.ИНН КАК ИНН,
	Контрагенты.КПП КАК КПП,
	Контрагенты.ЮрФизЛицо КАК ЮрФизЛицо,
	Контрагенты.НаименованиеПолное КАК НаименованиеПолное
ИЗ
	Справочник.Контрагенты КАК Контрагенты

4. Помещение запроса во временную таблицу

Подготовка текста создания временной таблицы с индексированием и без индексирования
// ==== Поместить во временную таблицу ===
НовыйТекстЗапроса3 = СхемыЗапросов.УстановитьПомещениеВоВременнуюТаблицу(НовыйТекстЗапроса2,"ВТ_Контрагенты");


//Результат - создал временную таблицу:
ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 5
	Контрагенты.Ссылка КАК Ссылка,
	Контрагенты.ЮридическоеФизическоеЛицо КАК ЮридическоеФизическоеЛицо,
	Контрагенты.ИНН КАК ИНН,
	Контрагенты.КПП КАК КПП,
	Контрагенты.ЮрФизЛицо КАК ЮрФизЛицо,
	Контрагенты.НаименованиеПолное КАК НаименованиеПолное
ПОМЕСТИТЬ ВТ_Контрагенты
ИЗ
	Справочник.Контрагенты КАК Контрагенты



// ==== Индексировать ===
НовыйТекстЗапроса4 = СхемыЗапросов.УстановитьИндексациюПолейЗапроса(НовыйТекстЗапроса3,"ИНН,КПП");


//Результат - а затем, проиндексировал ее по двум полям:
ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 5
	Контрагенты.Ссылка КАК Ссылка,
	Контрагенты.ЮридическоеФизическоеЛицо КАК ЮридическоеФизическоеЛицо,
	Контрагенты.ИНН КАК ИНН,
	Контрагенты.КПП КАК КПП,
	Контрагенты.ЮрФизЛицо КАК ЮрФизЛицо,
	Контрагенты.НаименованиеПолное КАК НаименованиеПолное
ПОМЕСТИТЬ ВТ_Контрагенты
ИЗ
	Справочник.Контрагенты КАК Контрагенты

ИНДЕКСИРОВАТЬ ПО
	ИНН,
	КПП

5. Упорядочение по полям запроса

Устанавливаем порядок
// === Порядок ====
НовыйТекстЗапроса5 	= СхемыЗапросов.ДобавитьПоляУпорядочиванияВЗапрос(НовыйТекстЗапроса2,"ИНН,КПП");


//Результат - сортировка/ порядок по полям:
ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 5
	Контрагенты.Ссылка КАК Ссылка,
	Контрагенты.ЮридическоеФизическоеЛицо КАК ЮридическоеФизическоеЛицо,
	Контрагенты.ИНН КАК ИНН,
	Контрагенты.КПП КАК КПП,
	Контрагенты.ЮрФизЛицо КАК ЮрФизЛицо,
	Контрагенты.НаименованиеПолное КАК НаименованиеПолное
ИЗ
	Справочник.Контрагенты КАК Контрагенты

УПОРЯДОЧИТЬ ПО
	ИНН,
	КПП

6. Конструкции соединений в запросах

Соединения в запросах
// === Левое соединение с таблицей контактная информация ====
	
ОписаниеТаблицы = СхемыЗапросов.ОписаниеТаблицы(
					Тип("ТаблицаСхемыЗапроса"),
					"Справочник.Контрагенты.КонтактнаяИнформация",
					"КонтрагентыКонтактнаяИнформация",
					"Ссылка");
				
ОписаниеСоединения = СхемыЗапросов.ОписаниеСоединения(
					ОписаниеТаблицы,
					"КонтрагентыКонтактнаяИнформация.Ссылка = &Ссылка",
					ТипСоединенияСхемыЗапроса.ЛевоеВнешнее);
				
ТекстЗапроса =  СхемыЗапросов.ДобавитьСоединениеВЗапрос(
					НовыйТекстЗапроса2,
					"Контрагенты",
					ОписаниеСоединения,
					0);

//Результат - "автоматом" собрал вот такое ЛЕВОЕ соединение:
ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 5
	Контрагенты.Ссылка КАК Ссылка,
	Контрагенты.ЮридическоеФизическоеЛицо КАК ЮридическоеФизическоеЛицо,
	Контрагенты.ИНН КАК ИНН,
	Контрагенты.КПП КАК КПП,
	Контрагенты.ЮрФизЛицо КАК ЮрФизЛицо,
	Контрагенты.НаименованиеПолное КАК НаименованиеПолное
ИЗ
	Справочник.Контрагенты КАК Контрагенты
		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты.КонтактнаяИнформация КАК КонтрагентыКонтактнаяИнформация
		ПО (КонтрагентыКонтактнаяИнформация.Ссылка = &Ссылка)

Далее, приведу разбор структур ОписаниеТаблицы:

Описание таблиц
ОписаниеТаблицы = СхемыЗапросов.ОписаниеТаблицы(
					Тип("ТаблицаСхемыЗапроса"),
					"Справочник.Контрагенты.КонтактнаяИнформация",
					"КонтрагентыКонтактнаяИнформация",
					"Ссылка");


"Справочник.Контрагенты.КонтактнаяИнформация" - соединяемая таблица;

"КонтрагентыКонтактнаяИнформация" - псевдоним соединяемой таблицы;

"Ссылка" - Доступные поля;

и ОписаниеСоединения:

Описание соединений
ОписаниеСоединения = СхемыЗапросов.ОписаниеСоединения(
					ОписаниеТаблицы,
					"КонтрагентыКонтактнаяИнформация.Ссылка = &Ссылка",
					ТипСоединенияСхемыЗапроса.ЛевоеВнешнее);

ОписаниеТаблицы - конструктор описания таблицы (см выше)

"КонтрагентыКонтактнаяИнформация.Ссылка = &Ссылка" - связь таблиц

ТипСоединенияСхемыЗапроса.ЛевоеВнешнее - тип соединения, где возможно

Внутреннее, ПолноеВнешнее, ЛевоеВнешнее и ПравоеВнешнее

7. Далее, привожу еще один метод, который меняет псевдоним поля в тексте запроса:

Замена псевдонима поля
НовыйТекстЗапроса5 	= СхемыЗапросов.ИзменитьПсевдонимПоляВыборкиВЗапросе(НовыйТекстЗапроса2,"ЮридическоеФизическоеЛицо","юфЛицо1");

//Результат - переименовал псевдоним поля:
ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 5
	Контрагенты.Ссылка КАК Ссылка,
	Контрагенты.ЮридическоеФизическоеЛицо КАК юфЛицо1,
	Контрагенты.ИНН КАК ИНН,
	Контрагенты.КПП КАК КПП,
	Контрагенты.ЮрФизЛицо КАК ЮрФизЛицо,
	Контрагенты.НаименованиеПолное КАК НаименованиеПолное
ИЗ
	Справочник.Контрагенты КАК Контрагенты

8. И еще один метод, удаление псевдонимов из запроса:

Удаление псевонимов из запроса
НовыйТекстЗапроса5 	= СхемыЗапросов.УдалитьПоляИзЗапроса(НовыйТекстЗапроса2, "ИНН,КПП");

//Результат - удалил "колонки" по наименованию ИНН, КПП:
ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 5
	Контрагенты.Ссылка КАК Ссылка,
	Контрагенты.ЮридическоеФизическоеЛицо КАК ЮридическоеФизическоеЛицо,
	Контрагенты.ЮрФизЛицо КАК ЮрФизЛицо,
	Контрагенты.НаименованиеПолное КАК НаименованиеПолное
ИЗ
	Справочник.Контрагенты КАК Контрагенты

Итак, мы рассмотрели несколько методов по доработке и "сборке" запроса, приведены несколько примеров и результаты их выполнения. Теперь, перейдем к заключению и сделаем выводы.

 

Выводы

В данном материале я сделал небольшой обзор 8 методов на основные типовые возможности по доработке и сборке запросов, использовав конфигурацию 1С:УТ 11.5. Уверен, что кто-то узнал об этом впервые, а кто-то давно использует, но в любом случае - данная шпаргалка будет вам полезна. Хочу так же отметить, что в типовых почему-то не сильно используется данных подход, суда по "глобальному" поиску.

Считаю, что базовое представление об этом функционале поможет вам сэкономить время и силы вместо того, чтобы пересобирать весь запрос традиционным методом и неоправданно усложнять его листинг до нескольких страниц. Вообще любые методы и способы будут хороши, если они сокращают вам время разработки и "убыстряют" выполнение кода.

Более сложные примеры вы по этой теме и другие методы работы по схемам запросов вы можете найти на нашем персональном тг-канале.