Редактирование запросов в 1С: код, Конструктор и СКД
Содержание
Текст запроса в 1С живёт в одном из двух мест: в коде модуля — строкой, которую присваивают свойству Запрос.Текст, либо в отчёте на СКД — внутри набора данных схемы компоновки. Чтобы его изменить, откройте Конфигуратор, найдите нужный объект, поправьте текст напрямую или через Конструктор запроса (правый клик по строке), а затем обновите конфигурацию базы данных клавишей F7.
Есть важная оговорка. Если конфигурация типовая и стоит на поддержке, прямая правка снимает объект с поддержки и ломает будущие обновления. Правильнее менять запрос через расширение конфигурации — к этому вернёмся отдельно.
Правка запросов идёт в Конфигураторе. В режиме «Предприятие» изменить сам текст запроса в типовом объекте нельзя — доступны только настройки готовых вариантов отчётов.
Где в конфигурации лежит нужный запрос
Прежде чем что-то менять, надо точно понять, какой именно запрос выполняется. Запросы в 1С встречаются в трёх типичных местах:
- 📄 Модули — общие модули, модули объектов, модули форм и команд. Там запрос собирается в коде: создаётся объект
Новый Запрос, его свойствуТекстприсваивается строка. - 📊 Схема компоновки данных (СКД) — наборы данных в отчётах и некоторых обработках. Запрос хранится внутри макета схемы компоновки.
- 📋 Динамические списки — формы списков справочников и документов. У динамического списка свой текст запроса в свойствах.
Чтобы найти конкретный запрос, не листайте дерево вручную. Откройте конфигурацию и воспользуйтесь глобальным поиском по текстам (меню Правка). Ищите не слово «запрос», а фрагмент, который точно есть в тексте: имя поля, таблицы или характерный псевдоним — например РеализацияТоваровУслуг или СуммаВзаиморасчетов. Поиск приведёт прямо к строке в модуле или к набору данных.
Если запрос выполняется при открытии формы списка, а в модулях его нет, смотрите реквизит формы типа «Динамический список»: текст лежит в его свойстве ТекстЗапроса.
Правка текста запроса прямо в модуле
Самый частый случай — запрос задан строкой в коде. Выглядит он обычно так:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Товар,
| Номенклатура.Цена КАК Цена
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.ПометкаУдаления = ЛОЖЬ";
Редактируете текст как обычную строку. Многострочный текст запроса в 1С оформляют так: каждая новая строка внутри кавычек начинается с вертикальной черты |. Её нельзя терять — без неё платформа посчитает перенос обрывом строковой константы и выдаст ошибку.
Порядок правки простой:
- Поставьте курсор внутрь строки запроса.
- Добавьте или уберите поле в секции
ВЫБРАТЬ, не забыв про запятые между полями. - Если меняете условие — правьте секцию
ГДЕ. - Проверьте, что все псевдонимы таблиц (после
КАК) совпадают вИЗ,ВЫБРАТЬиГДЕ.
Добавили в текст новый параметр через &ИмяПараметра? Значит, рядом в коде должна появиться строка Запрос.УстановитьПараметр("ИмяПараметра", Значение). Иначе при выполнении получите ошибку «Параметр не установлен».
Отдельно проверьте, не собирается ли текст запроса из кусков. Если в коде есть конкатенация строк, СтрШаблон или условная вставка секций, то правка одного литерала может не дать результата — выполнится совсем другой текст. Как увидеть итоговый вариант, разберём в разделе про отладку.
Конструктор запроса: визуальная сборка вместо ручного набора
Если не хочется держать в голове синтаксис соединений и группировок, используйте Конструктор. Поставьте курсор внутрь строки запроса, нажмите правую кнопку мыши и выберите Конструктор запроса. Когда платформа распознаёт текст как корректный запрос, она загрузит его в окно Конструктора; при нажатии ОК текст будет собран заново.
В окне Конструктора работа идёт по вкладкам:
- Таблицы и поля — выбираете источники и выводимые поля.
- Связи — соединения между таблицами (внутреннее, левое, полное).
- Условия — секция
ГДЕ, в том числе с параметрами. - Группировка — агрегатные функции (
СУММА,КОЛИЧЕСТВО) и поля группировки. - Объединения/Псевдонимы, Порядок, Итоги — по необходимости.
Есть и второй пункт меню — Конструктор запроса с обработкой результата. Он генерирует не только текст, но и готовый код обхода выборки (Выборка = Запрос.Выполнить().Выбрать() и цикл по ней). Удобно, когда запрос пишете с нуля.
Конструктор переписывает весь текст целиком. Он выровняет форматирование по-своему и удалит ваши комментарии внутри запроса. Сложный, вручную оптимизированный запрос после Конструктора может выглядеть иначе — для таких случаев правьте текст руками.
Ещё одно ограничение: Конструктор не умеет разбирать текст, в который вставлены выражения или куски кода (та самая сборка из частей). В этом случае он сообщит, что не может распознать запрос, и предложит начать новый. Тогда остаётся только текстовый режим.
Как изменить запрос в наборе данных СКД
В отчётах запрос чаще всего лежит не в модуле, а в схеме компоновки данных. Путь к нему такой:
- В дереве конфигурации найдите отчёт, раскройте его ветку Макеты.
- Двойным щелчком откройте макет
Основная схема компоновки данных. - Перейдите на вкладку Наборы данных.
- Выберите набор данных типа «Запрос» — его текст виден в нижней части окна.
Текст правите прямо здесь либо нажимаете кнопку Конструктор запроса над полем — она открывает тот же визуальный Конструктор.
После изменения текста нужно обновить список
полей набора данных. Для этого есть кнопка заполнения полей (значок над таблицей полей набора): она перечитает ВЫБРАТЬ и подтянет новые колонки. Если вы удалили поле, которое использовалось в настройках отчёта (на вкладке «Настройки» — в отборах, группировках или ресурсах), эти ссылки надо поправить вручную, иначе отчёт выдаст ошибку при формировании.
Проверьте смежные вкладки схемы компоновки:
- Ресурсы — агрегируемые поля (суммы, количества). Новое числовое поле часто надо добавить сюда.
- Параметры — если в запросе появился
&Параметр, он должен быть описан здесь, а не устанавливаться кодом. - Вычисляемые поля — если поле считается в СКД, а не в запросе.
Запрос динамического списка на форме
Третий случай стоит особняком. Формы списков справочников и документов строятся на объекте «Динамический список», и у него свой запрос — отдельный от модулей и отчётов. Чтобы его поменять:
- Откройте форму списка в Конфигураторе, выделите реквизит формы с типом «Динамический список» (обычно он называется
Список). - В его свойствах включите флажок
Произвольный запрос. - Рядом станет активной команда настройки списка — она открывает окно с текстом запроса и настройками.
- Правьте текст и основную таблицу так же, как обычный запрос; доступен и Конструктор.
У динамического списка есть обязательное свойство ОсновнаяТаблица. Если вы меняете источник в произвольном запросе, следите, чтобы основная таблица осталась согласованной — от неё зависит стандартная функциональность списка (ввод, пометка удаления, обновление).
Пока флажок Произвольный запрос снят, список строится по основной таблице автоматически и текста запроса у вас нет — поэтому первым шагом всегда идёт именно он.
Проверка и отладка изменённого запроса
Менять запрос вслепую опасно: ошибка вылезет уже у пользователя. Проверяйте результат до публикации.
Синтаксис модулей. Общую проверку кода запускают из меню Конфигурация → Проверить модули. Она поймает оборванную строку или явную опечатку в коде, но логику самого запроса не проверит.
Консоль запросов. Самый быстрый способ проверить именно текст — прогнать его в консоли запросов. Это внешняя обработка, которая выполняет произвольный текст запроса в режиме «Предприятие» и показывает результат таблицей. Удобно тем, что можно менять текст и перевыполнять его, не трогая конфигурацию. В консоли тоже есть свой Конструктор.
Отладчик — главный приём, когда текст собирается динамически. Если запрос строится из кусков, вы не знаете заранее, что именно выполнится. Поступайте так:
- Поставьте точку останова (
F9) на строке сразу после присвоенияЗапрос.Текст. - Запустите конфигурацию в режиме отладки и дойдите до этой точки.
- Через
Вычислить выражение(Shift+F9) посмотрите значениеЗапрос.Текст— это и есть итоговый текст. - Скопируйте его в консоль запросов и выполните.
Так вы увидите реальный запрос со всеми подставленными секциями, а не исходный шаблон.
Результат запроса в коде удобно смотреть выражением Запрос.Выполнить().Выгрузить() — оно вернёт таблицу значений, которую видно в отладчике.
Если запрос пакетный (несколько запросов через ; с временными таблицами), в консоли удобно разбить его на части и проверять по одному запросу: так сразу видно, на каком шаге пропадает нужная строка или появляется лишняя. Менеджер временных таблиц при этом задают в консоли автоматически, в коде — через свойство Запрос.МенеджерВременныхТаблиц.
Когда правка проверена, примените её: клавиша F7 (Обновить конфигурацию базы данных) принимает изменения. Для правки одного лишь текста запроса в модуле структура метаданных не меняется, поэтому монопольный режим не требуется — обновление пройдёт в обычном режиме. Монопольный доступ нужен только при изменении структуры объектов (новые реквизиты, таблицы), а не для правки кода.
Правите боевую базу — сначала снимите резервную копию конфигурации или всей базы. Откатить неудачную правку запроса проще, когда есть к чему вернуться.
Как менять запрос в типовой конфигурации без снятия с поддержки
Отдельный вопрос — что делать с типовой конфигурацией (БП 3.0, ЗУП 3.1, УТ 11). Прямая правка объекта снимает его с поддержки, и при следующем обновлении придётся вручную сливать ваши изменения с новой версией.
Чистый путь — расширение конфигурации (доступно с платформы 8.3.6). Коротко механика такая:
- Для отчёта на СКД: создаёте расширение, заимствуете в него отчёт, меняете запрос в его схеме компоновки. Основная конфигурация остаётся нетронутой.
- Для запроса в модуле: в расширении переопределяете нужную процедуру (аннотация
&Вместоили&После) и подставляете свой текст.
Расширение подключается отдельно, его файл имеет формат .cfe, а загрузка расширения и обновление конфигурации
базы данных — это два разных шага. Зато типовая конфигурация обновляется штатно, без конфликтов.
Частые ошибки при правке запросов
Большинство проблем после изменения запроса сводится к нескольким типовым симптомам. Ниже — что они означают и куда смотреть.
Частые вопросы
Нужен ли монопольный режим, чтобы изменить запрос?
Чем Конструктор запроса отличается от консоли запросов?
Можно ли изменить запрос прямо в режиме «Предприятие»?
Почему Конструктор «портит» мой запрос?
Как понять, какой именно запрос выполняется, если их в коде несколько?
Запрос.Текст и через Вычислить выражение (Shift+F9) посмотрите итоговое значение. Это снимает любые сомнения, когда текст собирается динамически.