Как открыть старый конструктор запросов в управляемых формах 1С 8.3

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

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

КонструкторЗапроса = Новый КонструкторЗапроса(ТекстЗапросаВФорме);

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

Архитектурные причины изменения конструктора запросов

Проанализируем техническую сторону работы интерфейса платформы «1С:Предприятие 8.3». Классический конструктор запросов, к которому привыкли разработчики в «Конфигураторе» и в обычном приложении, представляет собой системное диалоговое окно (написанное на C++ с использованием Win32 API). Этот интерфейс жестко привязан к среде операционной системы Windows и нативному толстому клиенту.

С развитием управляемого интерфейса, кроссплатформенности (клиенты под Linux, macOS) и работы через веб-браузеры платформа потеряла возможность вызывать платформенное Win32-окно внутри тонкого или веб-клиента. Чтобы обеспечить функциональность конструирования запросов в режиме «1С:Предприятие», разработчики платформы реализовали отдельную управляемую форму, которая физически оформлена как служебная встроенная обработка. При вызове объекта КонструкторЗапроса в управляемом сеансе платформа открывает именно эту форму, функционирующую поверх модели СхемаЗапроса.

Таким образом, штатно переключить вид конструктора через параметры или свойства объекта КонструкторЗапроса невозможно — среда тонкого клиента просто не содержит кода старого диалога.

Способ 1. Запуск сеанса в режиме обычного приложения

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

  1. Настроим строку запуска базы, добавив ключ командной строки /RunModeOrdinaryApplication.
  2. Откроем классическую внешнюю консоль запросов, разработанную под обычные формы.
  3. При вызове метода КонструкторЗапроса в таком сеансе платформа запустит то самое нативное окно из «Конфигуратора».

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

Способ 2. Использование извлеченной внутренней обработки

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

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

  1. Вернуть структуру закладок вместо переключения страниц.
  2. Сделать удобное табличное отображение связей таблиц и условий объединений.
  3. Встроить полученную форму напрямую в свою рабочую консоль запросов в качестве подключаемой обработки или внутренней формы.

В коде консоли вместо прямого вызова Новый КонструкторЗапроса выполняется вызов формы собственной обработки с передачей текста запроса через параметры формы.

Способ 3. Взаимодействие через COM-соединение или внешний сеанс

Если требуется сохранить работу пользователей в тонком клиенте, но критически важно открывать именно классический конструктор, можно настроить вызов внешнего процесса. Разберем логику такого решения:

  1. В управляемой форме по кнопке вызывается фоновый запуск внешнего сеанса или создается COM-объект V83.Application с параметром запуска толстого клиента обычного приложения.
  2. Во внешнем процессе открывается классический диалог с переданным текстом запроса.
  3. После редактирования и закрытия диалога итоговый текст запроса возвращается в управляемую форму консоли.

Главный недостаток такого подхода — зависимость от Windows и необходимость установки толстого клиента на компьютере пользователя.

Способ 4. Программная модификация через объект «СхемаЗапроса»

Посмотрим на альтернативу визуальному конструктору. Если вызов конструктора требовался для автоматического добавления фильтров, колонок или группировок, лучше полностью отказаться от диалоговых форм в пользу объекта СхемаЗапроса.

Объект СхемаЗапроса позволяет разобрать строку запроса на составные синтаксические конструкции, программно обойти коллекции таблиц, полей, условий и соединений, внести правки и собрать результирующий текст:


Схема = Новый СхемаЗапроса;
Схема.УстановитьТекстЗапроса(ТекстЗапросаВФорме);

// Программная работа с операторами и пакетами
Пакет = Схема.ПакетЗапросов[0];
Таблица = Пакет.ВыбираемыеТаблицы[0];

ТекстРезультата = Схема.ПолучитьТекстЗапроса();

Данный подход полностью универсален, работает на любых клиентах и на сервере без интерактивных окон.

Решение проблемы с отсутствием подсветки синтаксиса

В стандартном элементе формы «Поле текстового документа» подсветка синтаксиса для языка запросов часто работает некорректно или отсутствует вовсе. Проанализируем, как решить эту сопутствующую проблему.

В современных консолях запросов стандартное текстовое поле заменяют на элемент «Поле HTML-документа», куда загружается компонент веб-редактора (например, Ace, CodeMirror или Monaco Editor). Это дает сразу несколько преимуществ:

  1. Полноценная цветовая подсветка всех ключевых слов языка запросов «1С:Предприятия».
  2. Возможность настройки автодополнения конструкций.
  3. Поддержка сворачивания блоков пакетов и форматирования текста по горячим клавишам.

Таким образом, прямого способа вернуть классический Win32-конструктор внутри веб- или тонкого клиента 1С не существует из-за архитектурных ограничений платформы, однако доработка извлеченной обработки или интеграция с веб-редактором позволяют получить инструмент, превосходящий стандартный конструктор по удобству.

← На главную