Редактирование запросов в 1С: код, Конструктор и СКД

· 9 мин

Содержание

Текст запроса в 1С живёт в одном из двух мест: в коде модуля — строкой, которую присваивают свойству Запрос.Текст, либо в отчёте на СКД — внутри набора данных схемы компоновки. Чтобы его изменить, откройте Конфигуратор, найдите нужный объект, поправьте текст напрямую или через Конструктор запроса (правый клик по строке), а затем обновите конфигурацию базы данных клавишей F7.

Есть важная оговорка. Если конфигурация типовая и стоит на поддержке, прямая правка снимает объект с поддержки и ломает будущие обновления. Правильнее менять запрос через расширение конфигурации — к этому вернёмся отдельно.

Правка запросов идёт в Конфигураторе. В режиме «Предприятие» изменить сам текст запроса в типовом объекте нельзя — доступны только настройки готовых вариантов отчётов.

Где в конфигурации лежит нужный запрос

Прежде чем что-то менять, надо точно понять, какой именно запрос выполняется. Запросы в 1С встречаются в трёх типичных местах:

  • 📄 Модули — общие модули, модули объектов, модули форм и команд. Там запрос собирается в коде: создаётся объект Новый Запрос, его свойству Текст присваивается строка.
  • 📊 Схема компоновки данных (СКД) — наборы данных в отчётах и некоторых обработках. Запрос хранится внутри макета схемы компоновки.
  • 📋 Динамические списки — формы списков справочников и документов. У динамического списка свой текст запроса в свойствах.

Чтобы найти конкретный запрос, не листайте дерево вручную. Откройте конфигурацию и воспользуйтесь глобальным поиском по текстам (меню Правка). Ищите не слово «запрос», а фрагмент, который точно есть в тексте: имя поля, таблицы или характерный псевдоним — например РеализацияТоваровУслуг или СуммаВзаиморасчетов. Поиск приведёт прямо к строке в модуле или к набору данных.

Если запрос выполняется при открытии формы списка, а в модулях его нет, смотрите реквизит формы типа «Динамический список»: текст лежит в его свойстве ТекстЗапроса.

Правка текста запроса прямо в модуле

Самый частый случай — запрос задан строкой в коде. Выглядит он обычно так:

Запрос = Новый Запрос;
Запрос.Текст =
    "ВЫБРАТЬ
    |   Номенклатура.Ссылка КАК Товар,
    |   Номенклатура.Цена КАК Цена
    |ИЗ
    |   Справочник.Номенклатура КАК Номенклатура
    |ГДЕ
    |   Номенклатура.ПометкаУдаления = ЛОЖЬ";

Редактируете текст как обычную строку. Многострочный текст запроса в 1С оформляют так: каждая новая строка внутри кавычек начинается с вертикальной черты |. Её нельзя терять — без неё платформа посчитает перенос обрывом строковой константы и выдаст ошибку.

Порядок правки простой:

  1. Поставьте курсор внутрь строки запроса.
  2. Добавьте или уберите поле в секции ВЫБРАТЬ, не забыв про запятые между полями.
  3. Если меняете условие — правьте секцию ГДЕ.
  4. Проверьте, что все псевдонимы таблиц (после КАК) совпадают в ИЗ, ВЫБРАТЬ и ГДЕ.

Добавили в текст новый параметр через &ИмяПараметра? Значит, рядом в коде должна появиться строка Запрос.УстановитьПараметр("ИмяПараметра", Значение). Иначе при выполнении получите ошибку «Параметр не установлен».

Отдельно проверьте, не собирается ли текст запроса из кусков. Если в коде есть конкатенация строк, СтрШаблон или условная вставка секций, то правка одного литерала может не дать результата — выполнится совсем другой текст. Как увидеть итоговый вариант, разберём в разделе про отладку.

Конструктор запроса: визуальная сборка вместо ручного набора

Если не хочется держать в голове синтаксис соединений и группировок, используйте Конструктор. Поставьте курсор внутрь строки запроса, нажмите правую кнопку мыши и выберите Конструктор запроса. Когда платформа распознаёт текст как корректный запрос, она загрузит его в окно Конструктора; при нажатии ОК текст будет собран заново.

В окне Конструктора работа идёт по вкладкам:

  • Таблицы и поля — выбираете источники и выводимые поля.
  • Связи — соединения между таблицами (внутреннее, левое, полное).
  • Условия — секция ГДЕ, в том числе с параметрами.
  • Группировка — агрегатные функции (СУММА, КОЛИЧЕСТВО) и поля группировки.
  • Объединения/Псевдонимы, Порядок, Итоги — по необходимости.

Есть и второй пункт меню — Конструктор запроса с обработкой результата. Он генерирует не только текст, но и готовый код обхода выборки (Выборка = Запрос.Выполнить().Выбрать() и цикл по ней). Удобно, когда запрос пишете с нуля.

Конструктор переписывает весь текст целиком. Он выровняет форматирование по-своему и удалит ваши комментарии внутри запроса. Сложный, вручную оптимизированный запрос после Конструктора может выглядеть иначе — для таких случаев правьте текст руками.

Ещё одно ограничение: Конструктор не умеет разбирать текст, в который вставлены выражения или куски кода (та самая сборка из частей). В этом случае он сообщит, что не может распознать запрос, и предложит начать новый. Тогда остаётся только текстовый режим.

Как изменить запрос в наборе данных СКД

В отчётах запрос чаще всего лежит не в модуле, а в схеме компоновки данных. Путь к нему такой:

  1. В дереве конфигурации найдите отчёт, раскройте его ветку Макеты.
  2. Двойным щелчком откройте макет Основная схема компоновки данных.
  3. Перейдите на вкладку Наборы данных.
  4. Выберите набор данных типа «Запрос» — его текст виден в нижней части окна.

Текст правите прямо здесь либо нажимаете кнопку Конструктор запроса над полем — она открывает тот же визуальный Конструктор.

После изменения текста нужно обновить список полей набора данных. Для этого есть кнопка заполнения полей (значок над таблицей полей набора): она перечитает ВЫБРАТЬ и подтянет новые колонки. Если вы удалили поле, которое использовалось в настройках отчёта (на вкладке «Настройки» — в отборах, группировках или ресурсах), эти ссылки надо поправить вручную, иначе отчёт выдаст ошибку при формировании.

Проверьте смежные вкладки схемы компоновки:

  • Ресурсы — агрегируемые поля (суммы, количества). Новое числовое поле часто надо добавить сюда.
  • Параметры — если в запросе появился &Параметр, он должен быть описан здесь, а не устанавливаться кодом.
  • Вычисляемые поля — если поле считается в СКД, а не в запросе.

Запрос динамического списка на форме

Третий случай стоит особняком. Формы списков справочников и документов строятся на объекте «Динамический список», и у него свой запрос — отдельный от модулей и отчётов. Чтобы его поменять:

  1. Откройте форму списка в Конфигураторе, выделите реквизит формы с типом «Динамический список» (обычно он называется Список).
  2. В его свойствах включите флажок Произвольный запрос.
  3. Рядом станет активной команда настройки списка — она открывает окно с текстом запроса и настройками.
  4. Правьте текст и основную таблицу так же, как обычный запрос; доступен и Конструктор.

У динамического списка есть обязательное свойство ОсновнаяТаблица. Если вы меняете источник в произвольном запросе, следите, чтобы основная таблица осталась согласованной — от неё зависит стандартная функциональность списка (ввод, пометка удаления, обновление).

Пока флажок Произвольный запрос снят, список строится по основной таблице автоматически и текста запроса у вас нет — поэтому первым шагом всегда идёт именно он.

Проверка и отладка изменённого запроса

Менять запрос вслепую опасно: ошибка вылезет уже у пользователя. Проверяйте результат до публикации.

Синтаксис модулей. Общую проверку кода запускают из меню Конфигурация → Проверить модули. Она поймает оборванную строку или явную опечатку в коде, но логику самого запроса не проверит.

Консоль запросов. Самый быстрый способ проверить именно текст — прогнать его в консоли запросов. Это внешняя обработка, которая выполняет произвольный текст запроса в режиме «Предприятие» и показывает результат таблицей. Удобно тем, что можно менять текст и перевыполнять его, не трогая конфигурацию. В консоли тоже есть свой Конструктор.

Отладчик — главный приём, когда текст собирается динамически. Если запрос строится из кусков, вы не знаете заранее, что именно выполнится. Поступайте так:

  1. Поставьте точку останова (F9) на строке сразу после присвоения Запрос.Текст.
  2. Запустите конфигурацию в режиме отладки и дойдите до этой точки.
  3. Через Вычислить выражение (Shift+F9) посмотрите значение Запрос.Текст — это и есть итоговый текст.
  4. Скопируйте его в консоль запросов и выполните.

Так вы увидите реальный запрос со всеми подставленными секциями, а не исходный шаблон.

Результат запроса в коде удобно смотреть выражением Запрос.Выполнить().Выгрузить() — оно вернёт таблицу значений, которую видно в отладчике.

Если запрос пакетный (несколько запросов через ; с временными таблицами), в консоли удобно разбить его на части и проверять по одному запросу: так сразу видно, на каком шаге пропадает нужная строка или появляется лишняя. Менеджер временных таблиц при этом задают в консоли автоматически, в коде — через свойство Запрос.МенеджерВременныхТаблиц.

Когда правка проверена, примените её: клавиша F7 (Обновить конфигурацию базы данных) принимает изменения. Для правки одного лишь текста запроса в модуле структура метаданных не меняется, поэтому монопольный режим не требуется — обновление пройдёт в обычном режиме. Монопольный доступ нужен только при изменении структуры объектов (новые реквизиты, таблицы), а не для правки кода.

Правите боевую базу — сначала снимите резервную копию конфигурации или всей базы. Откатить неудачную правку запроса проще, когда есть к чему вернуться.

Как менять запрос в типовой конфигурации без снятия с поддержки

Отдельный вопрос — что делать с типовой конфигурацией (БП 3.0, ЗУП 3.1, УТ 11). Прямая правка объекта снимает его с поддержки, и при следующем обновлении придётся вручную сливать ваши изменения с новой версией.

Чистый путь — расширение конфигурации (доступно с платформы 8.3.6). Коротко механика такая:

  • Для отчёта на СКД: создаёте расширение, заимствуете в него отчёт, меняете запрос в его схеме компоновки. Основная конфигурация остаётся нетронутой.
  • Для запроса в модуле: в расширении переопределяете нужную процедуру (аннотация &Вместо или &После) и подставляете свой текст.

Расширение подключается отдельно, его файл имеет формат .cfe, а загрузка расширения и обновление конфигурации базы данных — это два разных шага. Зато типовая конфигурация обновляется штатно, без конфликтов.

Частые ошибки при правке запросов

Большинство проблем после изменения запроса сводится к нескольким типовым симптомам. Ниже — что они означают и куда смотреть.

Диагностика: выберите симптом

Частые вопросы

Нужен ли монопольный режим, чтобы изменить запрос?
Нет, если вы правите только текст запроса в модуле или в СКД — это обычное изменение кода. Монопольный доступ требуется лишь при изменении структуры метаданных (новые реквизиты, таблицы) или при тестировании и исправлении базы.
Чем Конструктор запроса отличается от консоли запросов?
Конструктор встроен в Конфигуратор и редактирует текст внутри конфигурации. Консоль запросов — внешняя обработка, она выполняет произвольный текст в режиме «Предприятие» и показывает результат, ничего не меняя в конфигурации. Консолью удобно проверять, Конструктором — собирать.
Можно ли изменить запрос прямо в режиме «Предприятие»?
Текст запроса типового объекта — нет, это делается в Конфигураторе. В «Предприятии» пользователь может настроить готовый вариант отчёта (отборы, группировки, поля), но не переписать сам запрос набора данных.
Почему Конструктор «портит» мой запрос?
Он пересобирает весь текст по своим правилам: меняет форматирование и удаляет комментарии внутри запроса. Для сложных, вручную оптимизированных запросов это нежелательно — такие тексты правьте напрямую, а Конструктор используйте для простых изменений структуры.
Как понять, какой именно запрос выполняется, если их в коде несколько?
Поставьте точку останова после присвоения Запрос.Текст и через Вычислить выражение (Shift+F9) посмотрите итоговое значение. Это снимает любые сомнения, когда текст собирается динамически.