A1sQ.CreateQSafe
Задача: быстро и безопасно создать объект Query из текста запроса, предварительно проверив синтаксис.
Поведение: при ошибке синтаксиса — возвращает Неопределено (без исключения); при успехе — то же, что CreateQ.
Поведение: при ошибке синтаксиса — возвращает Неопределено (без исключения); при успехе — то же, что CreateQ.
Сигнатура
Function CreateQSafe(QueryText = Undefined,
TempTablesManager = Undefined,
ValidateFirst = True) Export
Как работает (по исходному коду)
// Если задан текст и включена валидация — проверяем синтаксис
Если ЗначениеЗаполнено(QueryText) И ValidateFirst Тогда
Если Не Validate(QueryText, True) Тогда
Возврат Неопределено; // некорректный запрос
КонецЕсли;
КонецЕсли;
// Создаём обычный Query (с привязкой TempTablesManager при необходимости)
Возврат CreateQ(QueryText, TempTablesManager);
Что делает Validate: Validate(QueryText, ShowError) пробует присвоить текст QueryWizard.Text. При ошибке пишет в лог (A1sS.Print) и возвращает Ложь. Это проверка синтаксиса, а не исполнения: ошибки параметров/прав доступа всплывут уже на этапе Выполнить().
Параметры
- QueryText — текст запроса. Можно не передавать/оставить пустым — тогда вернётся пустой Query (см. CreateQ).
- TempTablesManager — менеджер временных таблиц. Если передан, будет установлен свойством Query.TempTablesManager (через Try/Except внутри CreateQ).
- ValidateFirst — логический флаг (по умолчанию Истина): выполнять ли проверку синтаксиса перед созданием запроса.
Возвращает
Query — готовый объект запроса, либо Неопределено, если валидация включена и провалена.
Примеры
1) Безопасно выполнить пользовательский запрос
QT = ПользовательВвёлТекст();
Q = A1sQ.CreateQSafe(QT);
Если Q = Неопределено Тогда
Сообщить("Ошибка в синтаксисе запроса");
Возврат;
КонецЕсли;
ТЗ = Q.Выполнить().Выгрузить();
2) Использовать TempTablesManager и параметры
TM = Новый TempTablesManager;
QT = "ПОМЕСТИТЬ ВТ КАК ВЫБРАТЬ ...; ВЫБРАТЬ * ИЗ ВТ";
Q = A1sQ.CreateQSafe(QT, TM);
Если Q <> Неопределено Тогда
A1sQ.SetQParams(Q, Новый Структура("D1, D2", Начало, Конец));
ТЗ = Q.Выполнить().Выгрузить();
A1sQ.DestroyAllTemps(TM);
КонецЕсли;
3) Отключить проверку (максимальная скорость)
Q = A1sQ.CreateQSafe(QT, Неопределено, Ложь); // эквивалентно CreateQ(QT)
Сравнение
| Функция | Проверка синтаксиса | Возврат при ошибке | Когда выбрать |
|---|---|---|---|
| CreateQ | Нет | Query (ошибки проявятся при Выполнить) | Контролируете текст сами, доверенная логика |
| CreateQSafe | Да (Validate) | Неопределено | Пользовательский ввод, динамически собранные запросы |
| Validate | Да (без создания Query) | Ложь | Нужна только проверка текста |
Нюансы и ограничения
✅ Безопаснее работы с пользовательскими запросами
✅ Поддерживает TempTablesManager «из коробки»
❗ Validate проверяет синтаксис, а не выполнение (права, параметры, объёмы данных)
❗ Если QueryText пуст — вернётся пустой Query (это корректно для CreateQ)
❗ Исключения из последующих вызовов (Выполнить/ВыполнитьПакет) не перехватываются