Как программно изменять текст запроса в 1С в зависимости от условий?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Часто в процессе разработки прикладных решений на платформе 1С возникает необходимость гибкого изменения логики выборки данных — для этого подойдёт инструмент для написания кода и проверки синтаксиса. Например, в зависимости от состояния флажка на форме или выбора пользователя, требуется добавить новые условия фильтрации, соединить дополнительные таблицы или изменить состав выбираемых полей. Рассмотрим, как реализовать такую динамику, не создавая десятки отдельных запросов.

Использование конструкции ВЫБОР внутри запроса

Самый элегантный и предпочтительный способ — использование встроенного оператора ВЫБОР. Этот метод позволяет держать структуру запроса в одном целостном виде, изменяя лишь параметры фильтрации. Это значительно повышает читаемость кода и позволяет проверять синтаксис запроса в Консоли запросов — для этого есть набор инструментов разработчика с консолью запросов.

Разберем пример, где условие меняется в зависимости от значения параметра:


ВЫБРАТЬ
    Реализация.Ссылка,
    Реализация.Контрагент
ИЗ
    Документ.РеализацияТоваровУслуг КАК Реализация
ГДЕ
    Реализация.Организация = ВЫБОР
        КОГДА &ИспользоватьОрганизацию ТОГДА &Организация
        ИНАЧЕ Реализация.Организация
    КОНЕЦ

При таком подходе запрос остается статичным с точки зрения формирования строки, что исключает ошибки синтаксиса, связанные с неверной склейкой строк.

Динамическое добавление условий через метод СтрЗаменить

Если структура запроса должна меняться существенно (например, добавляются сложные соединения ВНУТРЕННЕЕ СОЕДИНЕНИЕ), мы можем использовать механизм шаблонизации. Для этого в текст запроса заранее закладываются «метки» или «заглушки» вида 1=1 или //Условие1.

Рассмотрим пошаговую реализацию:

  1. Подготовим строку запроса с фиксированными метками.
  2. В коде на 1С проверим условия (флажки, значения на форме).
  3. Применим метод СтрЗаменить для вставки нужного фрагмента кода вместо метки.

ТекстЗапроса = "ВЫБРАТЬ * ИЗ Документ.РеализацияТоваровУслуг КАК Р ГДЕ 1=1";
Если ФлагФильтрацииПоКонтрагенту Тогда
    ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "1=1", "1=1 И Р.Контрагент = &Контрагент");
КонецЕсли;

Важно: При использовании этого метода всегда следите за операторами логики И и ИЛИ. Убедитесь, что после замены текст остается корректным синтаксически. Рекомендуется использовать конструкцию 1=1 как универсальный «нейтральный» элемент, который не влияет на результат при отсутствии дополнительных условий.

Конкатенация строк для сборки запроса

Для создания действительно сложных отчетов или выборок, где части запроса могут зависеть от множества факторов, используем конкатенацию (склейку) строковых переменных. Это наиболее гибкий метод, позволяющий собирать запрос «как конструктор».

Разберем, как мы можем собирать запрос по частям:


ТекстЗапроса = "ВЫБРАТЬ Ссылка ИЗ Документ.РеализацияТоваровУслуг";
Если БезВозвратов Тогда
    ТекстЗапроса = ТекстЗапроса + " ГДЕ Сделка НЕ В (ВЫБРАТЬ Сделка ИЗ Документ.ВозвратТоваров)";
КонецЕсли;
Запрос.Текст = ТекстЗапроса;

Этот метод дает максимальную свободу действий, однако требует от разработчика высокой дисциплины. Мы должны помнить следующее:

Рекомендации по отладке и безопасности

При работе с динамическими запросами в 1С придерживайтесь следующих правил:

1. Отладка. Поскольку конструктор не понимает динамические строки, если ваш запрос не работает, первым делом выведите текст переменной Запрос.Текст в сообщение Сообщить() — здесь поможет инструмент пошаговой отладки и просмотра переменных. Скопируйте полученный текст и вставьте его в Консоль запросов — платформа сразу укажет на место, где допущена синтаксическая ошибка.

2. Безопасность. Никогда не подставляйте значения, полученные непосредственно от пользователя (например, имена полей), напрямую в строку запроса. Это делает систему уязвимой для манипуляций. Используйте только параметры через Запрос.УстановитьПараметр(). Если требуется динамическое имя поля или таблицы, используйте проверку по списку разрешенных значений.

3. Читаемость. Если запрос начинает напоминать «лоскутное одеяло» из десятков СтрЗаменить, возможно, пора разделить логику на несколько функций или использовать шаблоны запросов. Помните, что код должен быть понятен не только вам, но и другим коллегам, которые будут поддерживать систему в будущем.

← На главную