В 1С подстановка значений в запрос — это ключевой навык для работы с данными. Он позволяет делать запросы более гибкими, динамическими и безопасными. Существует несколько способов подстановки значений в запрос в 1С, каждый из которых имеет свои особенности.
1. Параметры запроса:
Это самый безопасный и рекомендуемый способ подстановки значений в запрос. Параметры запроса позволяют передавать значения в запрос, не опасаясь SQL-инъекций и других проблем безопасности.
Запрос = Новый Запрос;
Запрос. Текст =
"ВЫБРАТЬ
| Номенклатура. Ссылка,
| Номенклатура. Наименование
|ИЗ
| Справочник. Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура. Цена > &Цена
| И Номенклатура. Наименование ПОДОБНО &Наименование";
Запрос. УстановитьПараметр("Цена", 100);
Запрос. УстановитьПараметр("Наименование", "%Компьютер%");
Результат = Запрос. Выполнить();
Выборка = Результат. Выбрать();
Пока Выборка. Следующий() Цикл
Сообщить(Выборка. Наименование);
КонецЦикла;
&Цена и &Наименование: Это параметры запроса. Они указываются в тексте запроса и обозначаются символом &.
Запрос. УстановитьПараметр("Цена", 100): Эта строка устанавливает значение параметра “Цена” равным 100.
Запрос. УстановитьПараметр("Наименование", "%Компьютер%"): Эта строка устанавливает значение параметра “Наименование” равным “%Компьютер%”. Символы % используются для поиска подстроки (аналог LIKE в SQL).
Преимущества:
Безопасность: Защита от SQL-инъекций.
Типизация: Значение параметра автоматически преобразуется к нужному типу данных.
Читаемость: Код становится более читаемым и понятным.
2. Строковая конкатенация (не рекомендуется):
Этот способ заключается в объединении строк для формирования текста запроса. Этот способ крайне не рекомендуется, так как он подвержен SQL-инъекциям и другим проблемам безопасности.
Цена = 100;
Наименование = "%Компьютер%";
Запрос = Новый Запрос;
Запрос. Текст =
"ВЫБРАТЬ
| Номенклатура. Ссылка,
| Номенклатура. Наименование
|ИЗ
| Справочник. Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура. Цена > " + Цена + "
| И Номенклатура. Наименование ПОДОБНО ‘" + Наименование + "’";
Результат = Запрос. Выполнить();
Выборка = Результат. Выбрать();
Пока Выборка. Следующий() Цикл
Сообщить(Выборка. Наименование);
КонецЦикла;
+: Оператор конкатенации строк.
Преимущества:
Простота (на первый взгляд).
Недостатки:
Безопасность: Уязвим для SQL-инъекций.
Сложность: Сложно читать и поддерживать код.
Ошибки: Легко допустить ошибки при форматировании строк.
НИКОГДА НЕ ИСПОЛЬЗУЙТЕ СТРОКОВУЮ КОНКАТЕНАЦИЮ ДЛЯ ПОДСТАНОВКИ ЗНАЧЕНИЙ В ЗАПРОСЫ, ЕСЛИ ЗНАЧЕНИЯ ПОЛУЧЕНЫ ОТ ПОЛЬЗОВАТЕЛЯ ИЛИ ИЗ ВНЕШНИХ ИСТОЧНИКОВ!
3. Использование “ВЫБОР” в запросе:
Этот способ позволяет подставлять различные значения в зависимости от условия.
Запрос = Новый Запрос;
Запрос. Текст =
"ВЫБРАТЬ
| Номенклатура. Ссылка,
| Номенклатура. Наименование,
| ВЫБОР
| КОГДА Номенклатура. Цена > 100
| ТОГДА ""Дорогой""
| ИНАЧЕ ""Дешевый""
| КОНЕЦ КАК Категория
|ИЗ
| Справочник. Номенклатура КАК Номенклатура";
Результат = Запрос. Выполнить();
Выборка = Результат. Выбрать();
Пока Выборка. Следующий() Цикл
Сообщить(Выборка. Наименование + " — " + Выборка. Категория);
КонецЦикла;
ВЫБОР…КОГДА…ТОГДА…ИНАЧЕ…КОНЕЦ: Это конструкция языка запросов 1С, позволяющая задавать условия и возвращать разные значения в зависимости от этих условий.
Преимущества:
Гибкость: Позволяет задавать сложные условия.
Недостатки:
Сложность: Может быть сложным для понимания и отладки.
Ограниченность: Подходит только для подстановки значений в пределах самого запроса.
4. Временные таблицы:
Этот способ позволяет загружать данные во временную таблицу и использовать ее в основном запросе.
// 1. Создание временной таблицы
ТекстЗапроса = "ВЫБРАТЬ * ИЗ &ВременнаяТаблица";
Запрос = Новый Запрос(ТекстЗапроса);
// 2. Заполнение временной таблицы
МассивДанных = Новый Массив;
МассивДанных. Добавить(Новый Структура("ID, Значение", 1, "Значение1"));
МассивДанных. Добавить(Новый Структура("ID, Значение", 2, "Значение2"));
// 3. Загрузка данных в временную таблицу
ТаблицаЗначений = Новый ТаблицаЗначений;
ТаблицаЗначений. Колонки. Добавить("ID", Новый ОписаниеТипов("Число"));
ТаблицаЗначений. Колонки. Добавить("Значение", Новый ОписаниеТипов("Строка"));
Для Каждого ЭлементМассива Из МассивДанных Цикл
НоваяСтрока = ТаблицаЗначений. Добавить();
НоваяСтрока. ID = ЭлементМассива. ID;
НоваяСтрока. Значение = ЭлементМассива. Значение;
КонецЦикла;
Запрос. УстановитьПараметр("ВременнаяТаблица", ТаблицаЗначений);
// 4. Основной запрос с использованием временной таблицы
ТекстЗапроса = "ВЫБРАТЬ
| Номенклатура. Ссылка,
| Номенклатура. Наименование
|ИЗ
| Справочник. Номенклатура КАК Номенклатура
| ЛЕВОЕ СОЕДИНЕНИЕ &ВременнаяТаблица КАК ВТ
| ПО Номенклатура. Код = ВТ. ID
|ГДЕ
| ВТ. Значение ЕСТЬ NULL";
Запрос = Новый Запрос(ТекстЗапроса);
Запрос. УстановитьПараметр("ВременнаяТаблица", ТаблицаЗначений);
// 5. Выполнение запроса
Выборка = Запрос. Выполнить().Выбрать();
Преимущества:
Гибкость: Позволяет передавать большие объемы данных в запрос.
Производительность: Может быть быстрее, чем другие способы, для сложных запросов.
Недостатки:
Сложность: Требует написания большего количества кода.
Ограниченность: Временные таблицы существуют только в рамках одного соединения с базой данных.
5. Использование конструктора запросов (для простых случаев):
Конструктор запросов предоставляет графический интерфейс для создания запросов. Он автоматически генерирует код запроса с использованием параметров.
Преимущества:
Простота: Не требует знания языка запросов 1С.
Недостатки:
Ограниченность: Подходит только для простых запросов.
Негибкость: Сложно создавать сложные запросы.
Рекомендации:
Всегда используйте параметры запроса (способ 1) для подстановки значений в запрос, если это возможно. Это самый безопасный и рекомендуемый способ.
Избегайте использования строковой конкатенации (способ 2) для подстановки значений в запрос. Этот способ подвержен SQL-инъекциям и другим проблемам безопасности.
Используйте “ВЫБОР” в запросе (способ 3) для подстановки различных значений в зависимости от условия.
Используйте временные таблицы (способ 4) для передачи больших объемов данных в запрос.
Используйте конструктор запросов (способ 5) для создания простых запросов.
Тщательно тестируйте все запросы, чтобы убедиться в их корректности и безопасности.
Следуя этим рекомендациям, вы сможете эффективно и безопасно подставлять значения в запросы в 1С.