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