При разработке внешних инструментов, таких как консоли запросов или отчеты для режима управляемого приложения, разработчики часто сталкиваются с неожиданным поведением платформы. Попытка инициализировать конструктор запросов привычной строкой кода приводит к открытию интерфейса, существенно отличающегося от классического диалога из «Конфигуратора»:
КонструкторЗапроса = Новый КонструкторЗапроса(ТекстЗапросаВФорме);
Вместо привычного компактного модального окна пользователь видит специализированную управляемую форму. Разберем по шагам, почему так происходит, как устроен этот механизм изнутри и какие существуют практические способы решения данной проблемы.
Проанализируем техническую сторону работы интерфейса платформы «1С:Предприятие 8.3». Классический конструктор запросов, к которому привыкли разработчики в «Конфигураторе» и в обычном приложении, представляет собой системное диалоговое окно (написанное на C++ с использованием Win32 API). Этот интерфейс жестко привязан к среде операционной системы Windows и нативному толстому клиенту.
С развитием управляемого интерфейса, кроссплатформенности (клиенты под Linux, macOS) и работы через веб-браузеры платформа потеряла возможность вызывать платформенное Win32-окно внутри тонкого или веб-клиента. Чтобы обеспечить функциональность конструирования запросов в режиме «1С:Предприятие», разработчики платформы реализовали отдельную управляемую форму, которая физически оформлена как служебная встроенная обработка. При вызове объекта КонструкторЗапроса в управляемом сеансе платформа открывает именно эту форму, функционирующую поверх модели СхемаЗапроса.
Таким образом, штатно переключить вид конструктора через параметры или свойства объекта КонструкторЗапроса невозможно — среда тонкого клиента просто не содержит кода старого диалога.
Выясним самый простой обходной путь, не требующий модификации кода платформы. Если конфигурация поддерживает режим обычного приложения (в свойствах конфигурации включена совместимость или разрешен запуск обычных форм), мы можем запустить базу в режиме толстого клиента обычного приложения.
КонструкторЗапроса в таком сеансе платформа запустит то самое нативное окно из «Конфигуратора».Этот вариант подходит для администраторов и программистов, занимающихся отладкой сложных алгоритмов на локальных рабочих станциях под управлением Windows.
Рассмотрим вариант доработки интерфейса под свои потребности прямо в управляемом режиме. Поскольку управляемый конструктор запросов — это обычная обработка, запакованная в бинарные ресурсы платформы, её можно извлечь и адаптировать.
После извлечения формы обработки разработчик получает полноценный проект управляемой формы, в котором можно изменить эргономику:
В коде консоли вместо прямого вызова Новый КонструкторЗапроса выполняется вызов формы собственной обработки с передачей текста запроса через параметры формы.
Если требуется сохранить работу пользователей в тонком клиенте, но критически важно открывать именно классический конструктор, можно настроить вызов внешнего процесса. Разберем логику такого решения:
V83.Application с параметром запуска толстого клиента обычного приложения.Главный недостаток такого подхода — зависимость от Windows и необходимость установки толстого клиента на компьютере пользователя.
Посмотрим на альтернативу визуальному конструктору. Если вызов конструктора требовался для автоматического добавления фильтров, колонок или группировок, лучше полностью отказаться от диалоговых форм в пользу объекта СхемаЗапроса.
Объект СхемаЗапроса позволяет разобрать строку запроса на составные синтаксические конструкции, программно обойти коллекции таблиц, полей, условий и соединений, внести правки и собрать результирующий текст:
Схема = Новый СхемаЗапроса;
Схема.УстановитьТекстЗапроса(ТекстЗапросаВФорме);
// Программная работа с операторами и пакетами
Пакет = Схема.ПакетЗапросов[0];
Таблица = Пакет.ВыбираемыеТаблицы[0];
ТекстРезультата = Схема.ПолучитьТекстЗапроса();
Данный подход полностью универсален, работает на любых клиентах и на сервере без интерактивных окон.
В стандартном элементе формы «Поле текстового документа» подсветка синтаксиса для языка запросов часто работает некорректно или отсутствует вовсе. Проанализируем, как решить эту сопутствующую проблему.
В современных консолях запросов стандартное текстовое поле заменяют на элемент «Поле HTML-документа», куда загружается компонент веб-редактора (например, Ace, CodeMirror или Monaco Editor). Это дает сразу несколько преимуществ:
Таким образом, прямого способа вернуть классический Win32-конструктор внутри веб- или тонкого клиента 1С не существует из-за архитектурных ограничений платформы, однако доработка извлеченной обработки или интеграция с веб-редактором позволяют получить инструмент, превосходящий стандартный конструктор по удобству.