A1sCode библиотека 1С

A1sQ.CreateQSafe

Задача: быстро и безопасно создать объект Query из текста запроса, предварительно проверив синтаксис.
Поведение: при ошибке синтаксиса — возвращает Неопределено (без исключения); при успехе — то же, что 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)
❗ Исключения из последующих вызовов (Выполнить/ВыполнитьПакет) не перехватываются
  • CreateQ — базовое создание Query.
  • Validate / IsValid — проверки текста запроса.
  • SetQParams — установка параметров.
  • ExecuteQ / Unload — выполнение и выгрузка.