Содержание:
Файлы материала
Описание
При доработке конфигурации, периодически требуется изменить существующий “Запрос”. Раньше такая задача решалась с помощью строковой функции по типу СтрЗаменить(“ТекстЗапроса”, “Поле КАК Поле”, “Поле КАК Поле, МоеПоле КАК МоеПоле”).
Такой подход не всегда удобен и может привести к ошибкам после изменения исходного запроса в обновлении.
Начиная с платформы 8.3.5 появилась возможность работать с объектной моделью запроса, реализованная через объект с типом “СхемаЗапроса”. В который можно загрузить существующий запрос и откорректировать его или создать новый запрос с нуля.
Ниже приведены примеры по работе со схемой запроса:
Выбор: Разрешенные, Различные, Первые
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
// Инициализация схемы запроса СхемаЗапроса = Новый СхемаЗапроса; СхемаЗапроса.УстановитьТекстЗапроса(ТекстЗапросаДо); ПоследнийЗапросПакета = СхемаЗапроса.ПакетЗапросов[СхемаЗапроса.ПакетЗапросов.Количество() - 1]; ОператорПоследнегоЗапроса = ПоследнийЗапросПакета.Операторы[0]; // Установка выбора: Разрешенные, Различные, Первые ПоследнийЗапросПакета.ВыбиратьРазрешенные = Истина; ОператорПоследнегоЗапроса.ВыбиратьРазличные = Истина; ОператорПоследнегоЗапроса.КоличествоПолучаемыхЗаписей = 100; // Получение результата ТекстЗапросаПосле = СхемаЗапроса.ПолучитьТекстЗапроса(); |
Добавление поля в запрос
1 2 3 4 5 6 7 8 9 10 11 12 13 |
// Инициализация схемы запроса СхемаЗапроса = Новый СхемаЗапроса; СхемаЗапроса.УстановитьТекстЗапроса(ТекстЗапросаДо); ПоследнийЗапросПакета = СхемаЗапроса.ПакетЗапросов[СхемаЗапроса.ПакетЗапросов.Количество() - 1]; ОператорПоследнегоЗапроса = ПоследнийЗапросПакета.Операторы[0]; // Установка поля в схему запроса ОператорПоследнегоЗапроса.ВыбираемыеПоля.Добавить("Сотрудники.ФизическоеЛицо"); ПоследнийЗапросПакета.Колонки[ПоследнийЗапросПакета.Колонки.Количество()-1].Псевдоним = "ФизическоеЛицо"; // Получение результата ТекстЗапросаПосле = СхемаЗапроса.ПолучитьТекстЗапроса(); |
Группировка по полю
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
// Инициализация схемы запроса СхемаЗапроса = Новый СхемаЗапроса; СхемаЗапроса.УстановитьТекстЗапроса(ТекстЗапросаДо); ПоследнийЗапросПакета = СхемаЗапроса.ПакетЗапросов[СхемаЗапроса.ПакетЗапросов.Количество() - 1]; ОператорПоследнегоЗапроса = ПоследнийЗапросПакета.Операторы[0]; // Установка поля с агрегатной функцией в схему запроса // При появлении в полях выбора агрегатной функции, остальные поля автоматически попадают в раздел "СГРУППИРОВАТЬ ПО" ОператорПоследнегоЗапроса.ВыбираемыеПоля.Добавить("КОЛИЧЕСТВО(Сотрудники.Код)"); ПоследнийЗапросПакета.Колонки[ПоследнийЗапросПакета.Колонки.Количество()-1].Псевдоним = "КоличествоКод"; // Получение результата ТекстЗапросаПосле = СхемаЗапроса.ПолучитьТекстЗапроса(); |
Добавление условия
1 2 3 4 5 6 7 8 9 10 11 12 |
// Инициализация схемы запроса СхемаЗапроса = Новый СхемаЗапроса; СхемаЗапроса.УстановитьТекстЗапроса(ТекстЗапросаДо); ПоследнийЗапросПакета = СхемаЗапроса.ПакетЗапросов[СхемаЗапроса.ПакетЗапросов.Количество() - 1]; ОператорПоследнегоЗапроса = ПоследнийЗапросПакета.Операторы[0]; // Установка условия в схему запроса ОператорПоследнегоЗапроса.Отбор.Добавить("Сотрудники.ПометкаУдаления = Ложь"); // Получение результата ТекстЗапросаПосле = СхемаЗапроса.ПолучитьТекстЗапроса(); |
Добавление левого соединения
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
// Инициализация схемы запроса СхемаЗапроса = Новый СхемаЗапроса; СхемаЗапроса.УстановитьТекстЗапроса(ТекстЗапросаДо); ПоследнийЗапросПакета = СхемаЗапроса.ПакетЗапросов[СхемаЗапроса.ПакетЗапросов.Количество() - 1]; ОператорПоследнегоЗапроса = ПоследнийЗапросПакета.Операторы[0]; // Установка левого соединения в схему запроса ИсточникСотрудники = ОператорПоследнегоЗапроса.Источники[0]; ПсевдонимИсточникаСотрудники = ИсточникСотрудники.Источник.Псевдоним; ИсточникКадроваяИстория = ОператорПоследнегоЗапроса.Источники.Добавить("РегистрСведений.КадроваяИсторияСотрудников", "КадроваяИсторияСотрудников"); ИсточникКадроваяИстория.Соединения.Очистить(); УсловиеСоединения = ПсевдонимИсточникаСотрудники + ".Ссылка = КадроваяИсторияСотрудников.Сотрудник"; ИсточникСотрудники.Соединения.Добавить(ИсточникКадроваяИстория.Источник.Псевдоним, УсловиеСоединения); УсловиеСоединения = ПсевдонимИсточникаСотрудники + ".ФизическоеЛицо = КадроваяИсторияСотрудников.ФизическоеЛицо"; ИсточникСотрудники.Соединения.Добавить(ИсточникКадроваяИстория.Источник.Псевдоним, УсловиеСоединения); // Получение результата ТекстЗапросаПосле = СхемаЗапроса.ПолучитьТекстЗапроса(); |
Добавление вложенного запроса
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
// Инициализация схемы запроса СхемаЗапроса = Новый СхемаЗапроса; СхемаЗапроса.УстановитьТекстЗапроса(ТекстЗапросаДо); ПоследнийЗапросПакета = СхемаЗапроса.ПакетЗапросов[СхемаЗапроса.ПакетЗапросов.Количество() - 1]; ОператорПоследнегоЗапроса = ПоследнийЗапросПакета.Операторы[0]; // Добавление вложенного запроса в источники ВложенныйЗапрос = "ВЫБРАТЬ | ГрафикРаботыСотрудников.Сотрудник КАК Сотрудник, | ГрафикРаботыСотрудников.ГрафикРаботы КАК ГрафикРаботы |ИЗ | РегистрСведений.ГрафикРаботыСотрудников КАК ГрафикРаботыСотрудников"; ИсточникВложенныйЗапрос = ОператорПоследнегоЗапроса.Источники.Добавить(Тип("ВложенныйЗапросСхемыЗапроса"), "ВложенныйЗапросСГрафиками"); ИсточникВложенныйЗапрос.Источник.Запрос.УстановитьТекстЗапроса(ВложенныйЗапрос); // Установка левого соединения с вложенным запросом ИсточникСотрудники = ОператорПоследнегоЗапроса.Источники[0]; ИсточникВложенныйЗапрос.Соединения.Очистить(); УсловиеСоединения = ИсточникСотрудники.Источник.Псевдоним + ".Ссылка = " + ИсточникВложенныйЗапрос.Источник.Псевдоним + ".Сотрудник"; ИсточникСотрудники.Соединения.Добавить(ИсточникВложенныйЗапрос.Источник.Псевдоним, УсловиеСоединения); // Получение результата ТекстЗапросаПосле = СхемаЗапроса.ПолучитьТекстЗапроса(); |
Помещение во временную таблицу
1 2 3 4 5 6 7 8 9 10 11 |
// Инициализация схемы запроса СхемаЗапроса = Новый СхемаЗапроса; СхемаЗапроса.УстановитьТекстЗапроса(ТекстЗапросаДо); ПоследнийЗапросПакета = СхемаЗапроса.ПакетЗапросов[СхемаЗапроса.ПакетЗапросов.Количество() - 1]; // Установка временной таблицы ПоследнийЗапросПакета.ТаблицаДляПомещения = "ВТСотрудники"; // Получение результата ТекстЗапросаПосле = СхемаЗапроса.ПолучитьТекстЗапроса(); |
Далеко не полный перечень возможностей “Схемы запросов”. Со временем будет дополняться. Так же в начале описания доступна обработка для скачивания.
Спасибо! Очень хорошо и понятно расписано