Как программно передать текст запроса и его параметры в консоль запросов 1С?

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

При отладке и анализе сложных запросов в 1С разработчикам часто требуется программно передать текст запроса и его параметры в консоль запросов. Это позволяет быстро проверять работоспособность запросов, изменять параметры и анализировать результаты без ручного копирования. Мы рассмотрим несколько эффективных подходов для решения этой задачи, включая использование популярных "Инструментов разработчика" и стандартной консоли запросов 1С.

Метод 1: Использование "Инструментов разработчика" (ИР)

"Инструменты разработчика" (ИР) — это мощная и широко используемая подсистема для 1С, которая является отличной альтернативой стандартным консолям и специализированным обработкам, таким как "Toolkit". Если вы еще не используете ИР, мы настоятельно рекомендуем рассмотреть его к установке, так как он значительно упрощает отладку и разработку.

Передача запроса в ИР

Для программного открытия консоли запросов ИР с предзаполненным текстом запроса и параметрами, нам понадобится функция Отладить() или её короткая форма От(), доступная через общий модуль ИР (обычно ирОбщий или аналогичный, если вы переименовывали модули).

Разберем по шагам, как это сделать:

  1. Получите ссылку на общий модуль ИР. Обычно это ОбщийМодуль.ирОбщий.

    ИР = ОбщийМодуль.ирОбщий;
  2. Создайте объект Запрос и задайте его текст.

    
    Запрос = Новый Запрос;
    Запрос.Текст = 
    "ВЫБРАТЬ
    |    Номенклатура.Наименование,
    |    Номенклатура.Артикул
    |ИЗ
    |    Справочник.Номенклатура КАК Номенклатура
    |ГДЕ
    |    Номенклатура.ПометкаУдаления = &ПометкаУдаления
    |    И Номенклатура.Наименование ПОДОБНО &ИмяНоменклатуры";
    
  3. Установите необходимые параметры запроса. Для этого используем метод УстановитьПараметр().

    
    Запрос.УстановитьПараметр("ПометкаУдаления", Ложь);
    Запрос.УстановитьПараметр("ИмяНоменклатуры", "%Молоко%");
    

    Если у вас есть параметры типа "ТаблицаЗначений", их также можно установить:

    
    ТаблицаПараметр = Новый ТаблицаЗначений;
    ТаблицаПараметр.Колонки.Добавить("Код");
    ТаблицаПараметр.Колонки.Добавить("Значение");
    НоваяСтрока = ТаблицаПараметр.Добавить();
    НоваяСтрока.Код = "П001";
    НоваяСтрока.Значение = 100;
            
    Запрос.УстановитьПараметр("ТаблицаПараметров", ТаблицаПараметр);
    
  4. Вызовите функцию От() или Отладить() из ИР, передав ей объект Запрос.

    
    ИР.От(Запрос); // Откроет консоль запросов ИР с данным запросом и параметрами
    // или
    // ИР.Отладить(Запрос); // Тот же эффект
    

Что происходит при вызове ИР.От(Запрос)?

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

ИР поддерживает различные типы запросов: обычные 1С-запросы, построители запросов, компоновку данных, а также WQL (WMI) и ADO.

Метод 2: Стандартная консоль запросов 1С и XML-сериализация

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

Передача запроса через XML

Основной инструмент здесь — функция ОбщегоНазначения.ЗапросВСтрокуXML(Запрос) из Библиотеки стандартных подсистем (БСП). Эта функция сериализует объект Запрос в XML-строку.

Рассмотрим шаги:

  1. Создайте объект Запрос и задайте его текст и параметры, как описано выше.

    
    Запрос = Новый Запрос;
    Запрос.Текст = 
    "ВЫБРАТЬ
    |    Спр.Наименование,
    |    Спр.Код
    |ИЗ
    |    Справочник.Контрагенты КАК Спр
    |ГДЕ
    |    Спр.ИНН = &ИНН";
            
    Запрос.УстановитьПараметр("ИНН", "7707083893"); 
    
  2. Преобразуйте объект Запрос в XML-строку с помощью функции ОбщегоНазначения.ЗапросВСтрокуXML().

    ТекстXMLЗапроса = ОбщегоНазначения.ЗапросВСтрокуXML(Запрос);

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

  3. Скопируйте полученную XML-строку. Вы можете вывести её в Сообщения пользователю или в окно отладчика, а затем скопировать.

    Сообщить(ТекстXMLЗапроса);
  4. Откройте стандартную консоль запросов 1С.

  5. Вставьте скопированную XML-строку в поле "Текст запроса" консоли.

  6. Нажмите кнопку "Еще" (или аналогичное меню) и выберите команду "Заполнить из XML".

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

Работа с временными таблицами (ВТ)

Передача временных таблиц (ВТ) в консоль запросов для отладки — задача более сложная, чем передача обычных параметров, но "Инструменты разработчика" справляются с ней весьма эффективно.

  1. Использование "Инструментов разработчика" для ВТ:

    Как мы уже выяснили, ИР при вызове ИР.От(Запрос) сохраняет полный контекст запроса, включая сформированные временные таблицы. Он автоматически выводит их содержимое и понимает их структуру, позволяя вам отлаживать пакетные запросы, работающие с ВТ, так, как если бы вы выполняли их в исходном коде.

  2. Использование стандартной консоли запросов и XML для ВТ:

    Если временные таблицы передаются в запрос как параметры типа "ТаблицаЗначений", то метод с использованием ОбщегоНазначения.ЗапросВСтрокуXML() также сработает, так как табличные параметры успешно сериализуются в XML. Консоль запросов корректно воссоздаст их.

    Однако, если временные таблицы формируются в самом пакете запросов (например, в первом запросе пакета создается ВТ, а во втором она используется), то стандартный метод ЗапросВСтрокуXML сам по себе не сможет сохранить состояние этих временных таблиц. Для их отладки может потребоваться:

    • Использование МенеджераВременныхТаблиц: В консоли запросов можно явно указать, какой МенеджерВременныхТаблиц использовать, если он был предварительно инициализирован в программном коде. Но это требует дополнительных усилий по сохранению и передаче этого менеджера.

    • Доработки типовой функции: Существуют доработки типовой функции ОбщегоНазначения.ЗапросВСтрокуXML, которые позволяют сериализовать не только сам запрос, но и данные временных таблиц. Такие доработки внедряют в запрос вспомогательный код для заполнения временных таблиц на основании параметров запроса типа "ТаблицаЗначений". Это позволяет передавать не только структуру, но и фактические данные временных таблиц, что дает возможность их отладки через XML-метод.

Обработка больших объемов данных

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

Для решения этих проблем мы рекомендуем следующий подход:

  1. Сохранение данных во временный файл на сервере: Вместо того чтобы пытаться передать огромный текст запроса или сериализованные табличные параметры через буфер обмена или непосредственно отображать их в отладчике, сохраните эти данные во временный файл на сервере. Например, XML-строку запроса или данные таблицы значений можно записать в текстовый файл.

    
    ИмяВременногоФайла = ПолучитьИмяВременногоФайла(".xml");
    ТекстовыйДокумент = Новый ТекстовыйДокумент;
    ТекстовыйДокумент.УстановитьТекст(ТекстXMLЗапроса);
    ТекстовыйДокумент.Записать(ИмяВременногоФайла, КодировкаТекста.UTF8);
            
    Сообщить("Запрос сохранен во временный файл: " + ИмяВременногоФайла);
    
  2. Чтение из файла в консоли запросов: Затем в консоли запросов вы можете указать путь к этому временному файлу. Многие консоли запросов, особенно доработанные, поддерживают импорт запросов или параметров из внешнего файла. Пользователь просто открывает консоль и выбирает пункт "Загрузить из файла" или "Импортировать XML", указывая путь к файлу на сервере.

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

Общие рекомендации и альтернативы

При работе с запросами и их отладкой в 1С всегда полезно иметь в виду следующие моменты:

  1. Выбор консоли запросов: Существует множество консолей запросов. Помимо "Инструментов разработчика", есть типовые консоли (поставляемые с платформой или БСП), а также сторонние разработки. Ваш выбор может зависеть от специфических требований:

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

    
    РезультатЗапроса = Запрос.Выполнить().Выгрузить();
    // Установите точку останова здесь и просмотрите переменную РезультатЗапроса
    
  3. Передача параметров: Всегда используйте метод УстановитьПараметр() объекта Запрос для передачи значений. Это не только безопаснее (предотвращает SQL-инъекции), но и обеспечивает корректную типизацию данных. Для списочных параметров (например, передача списка значений для оператора В) вы можете использовать массивы или списки значений.

    
    МассивКодов = Новый Массив;
    МассивКодов.Добавить("001");
    МассивКодов.Добавить("005");
    Запрос.УстановитьПараметр("КодыНоменклатуры", МассивКодов);
    
  4. Пакетные запросы: Для выполнения нескольких запросов последовательно за один раз используйте пакетные запросы. Каждый запрос в пакете отделяется точкой с запятой. Это особенно полезно, когда нужно создать временные таблицы в одном запросе и использовать их в последующих запросах пакета.

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

В целом, хотя изначально вопрос был адресован "Toolkit", наиболее эффективные и широко используемые методы для программной передачи запросов и параметров в 1С связаны с использованием "Инструментов разработчика" или XML-сериализации для стандартной консоли. Дополните эти методы техниками работы с временными файлами для обработки больших объемов данных, и вы получите мощный арсенал для отладки ваших запросов.

← На главную