При написании сложных запросов в консоли запросов (в режиме «1С:Предприятие») мы часто сталкиваемся с необходимостью использовать вложенные запросы. Типичная ситуация: нам нужно отфильтровать данные по списку ссылок, полученных из другой таблицы, используя конструкцию В (...). Однако при попытке вызвать конструктор запроса внутри скобок, система часто выдает ошибку {(1, 1)}: Ожидается выражение "ВЫБРАТЬ" и не открывает окно редактирования. Разберем подробно, почему так происходит и как эффективно решить эту проблему.
Рассмотрим ситуацию, описанную в вопросе. Мы пишем условие в тексте запроса или в окне произвольного выражения:
ФизическиеЛицаКонтактнаяИнформация.Ссылка В ( )
Наша цель — поставить курсор между скобками и вызвать конструктор, чтобы визуально собрать вложенный запрос. Но вместо открытия конструктора мы получаем ошибку синтаксического контроля. Это происходит потому, что стандартный механизм вызова конструктора запросов в управляемом приложении (в тонком клиенте) ожидает, что выделенный текст (или текст, на котором стоит курсор) является синтаксически верным запросом, начинающимся с ключевого слова ВЫБРАТЬ.
Пустые скобки или просто пробел внутри них не являются валидным запросом. Платформа пытается интерпретировать выделенную область как самостоятельный запрос, видит пустоту или мусор и сообщает, что ожидала команду выборки данных.
Самый быстрый способ обойти это ограничение, не покидая текущего окна редактирования — это «обмануть» валидатор, подставив ему простейший корректный запрос.
Разберем алгоритм действий по шагам:
В напишите вручную простейшую конструкцию: ВЫБРАТЬ 1.
Ваш код должен выглядеть так:
... Ссылка В ( ВЫБРАТЬ 1 )
ВЫБРАТЬ 1 целиком.ВЫБРАТЬ 1 является корректным запросом, конструктор успешно откроется.ВЫБРАТЬ 1 будет автоматически заменен на текст созданного вами сложного вложенного запроса.Этот метод работает в большинстве штатных консолей запросов и инструментов разработчика, так как мы подаем на вход обработке корректные данные.
Если по какой-то причине первый способ не срабатывает (например, особенности конкретной, нестандартной консоли запросов), можно пойти путем «отдельного конструирования».
Давайте проанализируем этот подход:
В вложенный запрос должен возвращать только одно поле).Ссылка В ( <ВставленныйТекст> ).Этот метод более трудоемкий, но гарантирует отсутствие ошибок валидации при вызове конструктора.
Важно понимать разницу между работой в Конфигураторе и в режиме Предприятия.
В, и при вызове конструктора автоматически переходит в режим создания вложенного запроса.ВЫБРАТЬ, платформенный вызов возвращает ошибку.Некоторые продвинутые консоли запросов (разработанные сообществом) умеют программно обрабатывать такие ситуации: они анализируют контекст вокруг курсора и, если видят оператор В, сами подставляют нужные заглушки перед вызовом системного окна. Однако штатная консоль 1С (например, из БСП) часто лишена такого функционала.
Хотя мы рассматриваем вопрос синтаксиса, нельзя не упомянуть аспект производительности. Использование вложенных запросов в конструкции В (...) часто приводит к неоптимальным планам выполнения SQL-запросов, особенно если во вложенном запросе много данных или сложные соединения.
Рассмотрим альтернативный, более профессиональный подход:
ПОМЕСТИТЬ), в которую отберите нужные вам ссылки.В.Пример схемы запроса:
ВЫБРАТЬ
Т.Ссылка
ПОМЕСТИТЬ ВТ_НужныеСсылки
ИЗ
Справочник.ФизическиеЛица КАК Т
ГДЕ
... условия ...
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
КИ.Представление
ИЗ
РегистрСведений.КонтактнаяИнформация КАК КИ
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_НужныеСсылки КАК ВТ
ПО КИ.Объект = ВТ.Ссылка
Такой подход не только упрощает отладку (вы можете посмотреть содержимое временной таблицы), но и позволяет избежать проблем с вызовом конструктора внутри скобок, так как каждый запрос пакета конструируется отдельно.