Часто в процессе разработки прикладных решений на платформе 1С возникает необходимость гибкого изменения логики выборки данных — для этого подойдёт инструмент для написания кода и проверки синтаксиса. Например, в зависимости от состояния флажка на форме или выбора пользователя, требуется добавить новые условия фильтрации, соединить дополнительные таблицы или изменить состав выбираемых полей. Рассмотрим, как реализовать такую динамику, не создавая десятки отдельных запросов.
Самый элегантный и предпочтительный способ — использование встроенного оператора ВЫБОР. Этот метод позволяет держать структуру запроса в одном целостном виде, изменяя лишь параметры фильтрации. Это значительно повышает читаемость кода и позволяет проверять синтаксис запроса в Консоли запросов — для этого есть набор инструментов разработчика с консолью запросов.
Разберем пример, где условие меняется в зависимости от значения параметра:
ВЫБРАТЬ
Реализация.Ссылка,
Реализация.Контрагент
ИЗ
Документ.РеализацияТоваровУслуг КАК Реализация
ГДЕ
Реализация.Организация = ВЫБОР
КОГДА &ИспользоватьОрганизацию ТОГДА &Организация
ИНАЧЕ Реализация.Организация
КОНЕЦ
При таком подходе запрос остается статичным с точки зрения формирования строки, что исключает ошибки синтаксиса, связанные с неверной склейкой строк.
Если структура запроса должна меняться существенно (например, добавляются сложные соединения ВНУТРЕННЕЕ СОЕДИНЕНИЕ), мы можем использовать механизм шаблонизации. Для этого в текст запроса заранее закладываются «метки» или «заглушки» вида 1=1 или //Условие1.
Рассмотрим пошаговую реализацию:
СтрЗаменить для вставки нужного фрагмента кода вместо метки.
ТекстЗапроса = "ВЫБРАТЬ * ИЗ Документ.РеализацияТоваровУслуг КАК Р ГДЕ 1=1";
Если ФлагФильтрацииПоКонтрагенту Тогда
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "1=1", "1=1 И Р.Контрагент = &Контрагент");
КонецЕсли;
Важно: При использовании этого метода всегда следите за операторами логики И и ИЛИ. Убедитесь, что после замены текст остается корректным синтаксически. Рекомендуется использовать конструкцию 1=1 как универсальный «нейтральный» элемент, который не влияет на результат при отсутствии дополнительных условий.
Для создания действительно сложных отчетов или выборок, где части запроса могут зависеть от множества факторов, используем конкатенацию (склейку) строковых переменных. Это наиболее гибкий метод, позволяющий собирать запрос «как конструктор».
Разберем, как мы можем собирать запрос по частям:
ТекстЗапроса = "ВЫБРАТЬ Ссылка ИЗ Документ.РеализацияТоваровУслуг";
Если БезВозвратов Тогда
ТекстЗапроса = ТекстЗапроса + " ГДЕ Сделка НЕ В (ВЫБРАТЬ Сделка ИЗ Документ.ВозвратТоваров)";
КонецЕсли;
Запрос.Текст = ТекстЗапроса;
Этот метод дает максимальную свободу действий, однако требует от разработчика высокой дисциплины. Мы должны помнить следующее:
Символы.ПС для формирования читабельного текста запроса, чтобы в случае ошибки можно было легко отладить код.Конструкторе запросов, поэтому для отладки всегда выводите Запрос.Текст в окно сообщений.При работе с динамическими запросами в 1С придерживайтесь следующих правил:
1. Отладка. Поскольку конструктор не понимает динамические строки, если ваш запрос не работает, первым делом выведите текст переменной Запрос.Текст в сообщение Сообщить() — здесь поможет инструмент пошаговой отладки и просмотра переменных. Скопируйте полученный текст и вставьте его в Консоль запросов — платформа сразу укажет на место, где допущена синтаксическая ошибка.
2. Безопасность. Никогда не подставляйте значения, полученные непосредственно от пользователя (например, имена полей), напрямую в строку запроса. Это делает систему уязвимой для манипуляций. Используйте только параметры через Запрос.УстановитьПараметр(). Если требуется динамическое имя поля или таблицы, используйте проверку по списку разрешенных значений.
3. Читаемость. Если запрос начинает напоминать «лоскутное одеяло» из десятков СтрЗаменить, возможно, пора разделить логику на несколько функций или использовать шаблоны запросов. Помните, что код должен быть понятен не только вам, но и другим коллегам, которые будут поддерживать систему в будущем.