При отладке и анализе сложных запросов в 1С разработчикам часто требуется программно передать текст запроса и его параметры в консоль запросов. Это позволяет быстро проверять работоспособность запросов, изменять параметры и анализировать результаты без ручного копирования. Мы рассмотрим несколько эффективных подходов для решения этой задачи, включая использование популярных "Инструментов разработчика" и стандартной консоли запросов 1С.
"Инструменты разработчика" (ИР) — это мощная и широко используемая подсистема для 1С, которая является отличной альтернативой стандартным консолям и специализированным обработкам, таким как "Toolkit". Если вы еще не используете ИР, мы настоятельно рекомендуем рассмотреть его к установке, так как он значительно упрощает отладку и разработку.
Для программного открытия консоли запросов ИР с предзаполненным текстом запроса и параметрами, нам понадобится функция Отладить() или её короткая форма От(), доступная через общий модуль ИР (обычно ирОбщий или аналогичный, если вы переименовывали модули).
Разберем по шагам, как это сделать:
Получите ссылку на общий модуль ИР. Обычно это ОбщийМодуль.ирОбщий.
ИР = ОбщийМодуль.ирОбщий;
Создайте объект Запрос и задайте его текст.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Наименование,
| Номенклатура.Артикул
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.ПометкаУдаления = &ПометкаУдаления
| И Номенклатура.Наименование ПОДОБНО &ИмяНоменклатуры";
Установите необходимые параметры запроса. Для этого используем метод УстановитьПараметр().
Запрос.УстановитьПараметр("ПометкаУдаления", Ложь);
Запрос.УстановитьПараметр("ИмяНоменклатуры", "%Молоко%");
Если у вас есть параметры типа "ТаблицаЗначений", их также можно установить:
ТаблицаПараметр = Новый ТаблицаЗначений;
ТаблицаПараметр.Колонки.Добавить("Код");
ТаблицаПараметр.Колонки.Добавить("Значение");
НоваяСтрока = ТаблицаПараметр.Добавить();
НоваяСтрока.Код = "П001";
НоваяСтрока.Значение = 100;
Запрос.УстановитьПараметр("ТаблицаПараметров", ТаблицаПараметр);
Вызовите функцию От() или Отладить() из ИР, передав ей объект Запрос.
ИР.От(Запрос); // Откроет консоль запросов ИР с данным запросом и параметрами
// или
// ИР.Отладить(Запрос); // Тот же эффект
Что происходит при вызове ИР.От(Запрос)?
ИР создает "снимок" запроса на сервере, включая его текст, параметры и даже временные таблицы, если они были сформированы в пакете запросов. Это позволяет открыть запрос в консоли ИР, сохраняя его полную работоспособность. ИР автоматически выводит содержимое временных таблиц и понимает их структуру, что делает отладку пакетных запросов значительно проще. Для такой фиксации временных таблиц и параметров запроса также подойдёт обработка для отладки сложных запросов в консоли.
ИР поддерживает различные типы запросов: обычные 1С-запросы, построители запросов, компоновку данных, а также WQL (WMI) и ADO.
Для стандартной консоли запросов 1С, особенно в управляемом приложении, существует надежный подход, основанный на использовании XML. Этот метод позволяет перенести текст запроса и все его параметры, включая большие таблицы значений, без использования сторонних обработок типа ИР. В качестве альтернативы для работы с запросами из модулей можно использовать инженерную консоль запросов для управляемых форм.
Основной инструмент здесь — функция ОбщегоНазначения.ЗапросВСтрокуXML(Запрос) из Библиотеки стандартных подсистем (БСП). Эта функция сериализует объект Запрос в XML-строку.
Рассмотрим шаги:
Создайте объект Запрос и задайте его текст и параметры, как описано выше.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Спр.Наименование,
| Спр.Код
|ИЗ
| Справочник.Контрагенты КАК Спр
|ГДЕ
| Спр.ИНН = &ИНН";
Запрос.УстановитьПараметр("ИНН", "7707083893");
Преобразуйте объект Запрос в XML-строку с помощью функции ОбщегоНазначения.ЗапросВСтрокуXML().
ТекстXMLЗапроса = ОбщегоНазначения.ЗапросВСтрокуXML(Запрос);
Эта функция доступна в конфигурациях, использующих БСП. Если ваша конфигурация не содержит БСП или этой функции, вам может потребоваться реализовать аналогичную логику самостоятельно или использовать другие методы.
Скопируйте полученную XML-строку. Вы можете вывести её в Сообщения пользователю или в окно отладчика, а затем скопировать.
Сообщить(ТекстXMLЗапроса);
Откройте стандартную консоль запросов 1С.
Вставьте скопированную XML-строку в поле "Текст запроса" консоли.
Нажмите кнопку "Еще" (или аналогичное меню) и выберите команду "Заполнить из XML".
После этого текст запроса и все его параметры, включая табличные параметры, будут автоматически заполнены в соответствующих полях консоли. Этот метод успешно переносит таблицы значений, переданные как параметры, даже для очень больших объемов данных (десятки тысяч строк), что делает его очень удобным.
Передача временных таблиц (ВТ) в консоль запросов для отладки — задача более сложная, чем передача обычных параметров, но "Инструменты разработчика" справляются с ней весьма эффективно.
Использование "Инструментов разработчика" для ВТ:
Как мы уже выяснили, ИР при вызове ИР.От(Запрос) сохраняет полный контекст запроса, включая сформированные временные таблицы. Он автоматически выводит их содержимое и понимает их структуру, позволяя вам отлаживать пакетные запросы, работающие с ВТ, так, как если бы вы выполняли их в исходном коде.
Использование стандартной консоли запросов и XML для ВТ:
Если временные таблицы передаются в запрос как параметры типа "ТаблицаЗначений", то метод с использованием ОбщегоНазначения.ЗапросВСтрокуXML() также сработает, так как табличные параметры успешно сериализуются в XML. Консоль запросов корректно воссоздаст их.
Однако, если временные таблицы формируются в самом пакете запросов (например, в первом запросе пакета создается ВТ, а во втором она используется), то стандартный метод ЗапросВСтрокуXML сам по себе не сможет сохранить состояние этих временных таблиц. Для их отладки может потребоваться:
Использование МенеджераВременныхТаблиц: В консоли запросов можно явно указать, какой МенеджерВременныхТаблиц использовать, если он был предварительно инициализирован в программном коде. Но это требует дополнительных усилий по сохранению и передаче этого менеджера.
Доработки типовой функции: Существуют доработки типовой функции ОбщегоНазначения.ЗапросВСтрокуXML, которые позволяют сериализовать не только сам запрос, но и данные временных таблиц. Такие доработки внедряют в запрос вспомогательный код для заполнения временных таблиц на основании параметров запроса типа "ТаблицаЗначений". Это позволяет передавать не только структуру, но и фактические данные временных таблиц, что дает возможность их отладки через XML-метод.
При работе с очень большими текстами запросов или объемными таблицами значений, переданными как параметры, могут возникнуть проблемы с отображением и производительностью. Окно отладчика может обрезать огромный текст, а работа с такими данными в интерфейсе может быть медленной.
Для решения этих проблем мы рекомендуем следующий подход:
Сохранение данных во временный файл на сервере: Вместо того чтобы пытаться передать огромный текст запроса или сериализованные табличные параметры через буфер обмена или непосредственно отображать их в отладчике, сохраните эти данные во временный файл на сервере. Например, XML-строку запроса или данные таблицы значений можно записать в текстовый файл.
ИмяВременногоФайла = ПолучитьИмяВременногоФайла(".xml");
ТекстовыйДокумент = Новый ТекстовыйДокумент;
ТекстовыйДокумент.УстановитьТекст(ТекстXMLЗапроса);
ТекстовыйДокумент.Записать(ИмяВременногоФайла, КодировкаТекста.UTF8);
Сообщить("Запрос сохранен во временный файл: " + ИмяВременногоФайла);
Чтение из файла в консоли запросов: Затем в консоли запросов вы можете указать путь к этому временному файлу. Многие консоли запросов, особенно доработанные, поддерживают импорт запросов или параметров из внешнего файла. Пользователь просто открывает консоль и выбирает пункт "Загрузить из файла" или "Импортировать XML", указывая путь к файлу на сервере.
Этот подход значительно снижает нагрузку на клиентский интерфейс и обходные пути с буфером обмена, делая работу с большими объемами данных более стабильной и эффективной.
При работе с запросами и их отладкой в 1С всегда полезно иметь в виду следующие моменты:
Выбор консоли запросов: Существует множество консолей запросов. Помимо "Инструментов разработчика", есть типовые консоли (поставляемые с платформой или БСП), а также сторонние разработки. Ваш выбор может зависеть от специфических требований:
Отладка без консоли: В некоторых случаях, когда переносить запрос в консоль слишком сложно (например, из-за огромного количества специфических параметров, которые сложно сериализовать, или очень сложного программного формирования текста запроса), можно прибегнуть к альтернативному методу. Выгрузите результат выполнения запроса в обычную таблицу значений, а затем просмотрите её содержимое непосредственно в отладчике. Это позволит вам убедиться в корректности данных, возвращаемых запросом, даже если вы не видите его в консоли.
РезультатЗапроса = Запрос.Выполнить().Выгрузить();
// Установите точку останова здесь и просмотрите переменную РезультатЗапроса
Передача параметров: Всегда используйте метод УстановитьПараметр() объекта Запрос для передачи значений. Это не только безопаснее (предотвращает SQL-инъекции), но и обеспечивает корректную типизацию данных. Для списочных параметров (например, передача списка значений для оператора В) вы можете использовать массивы или списки значений.
МассивКодов = Новый Массив;
МассивКодов.Добавить("001");
МассивКодов.Добавить("005");
Запрос.УстановитьПараметр("КодыНоменклатуры", МассивКодов);
Пакетные запросы: Для выполнения нескольких запросов последовательно за один раз используйте пакетные запросы. Каждый запрос в пакете отделяется точкой с запятой. Это особенно полезно, когда нужно создать временные таблицы в одном запросе и использовать их в последующих запросах пакета.
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК НоменклатураСсылка
|ПОМЕСТИТЬ ВТ_ВыбраннаяНоменклатура
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.ПометкаУдаления = ЛОЖЬ
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТ_ВыбраннаяНоменклатура.НоменклатураСсылка.Наименование,
| ВТ_ВыбраннаяНоменклатура.НоменклатураСсылка.Артикул
|ИЗ
| ВТ_ВыбраннаяНоменклатура КАК ВТ_ВыбраннаяНоменклатура";
В целом, хотя изначально вопрос был адресован "Toolkit", наиболее эффективные и широко используемые методы для программной передачи запросов и параметров в 1С связаны с использованием "Инструментов разработчика" или XML-сериализации для стандартной консоли. Дополните эти методы техниками работы с временными файлами для обработки больших объемов данных, и вы получите мощный арсенал для отладки ваших запросов.