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

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

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

Способ 1: Получение параметров запроса в отладчике

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

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

  1. Установим точку останова: Откроем конфигуратор и найдем код, где формируется и выполняется наш запрос. Установим точку останова непосредственно перед строкой, где вызывается метод Запрос.Выполнить() или Запрос.ВыполнитьПакет().

  2. Запустим отладку: Запустим базу данных в режиме отладки (F5) и доведем выполнение до установленной точки останова.

  3. Используем окно Табло: Как только выполнение остановится на точке останова, откроем окно "Табло" (обычно доступно через меню "Отладка" -> "Табло" или сочетанием клавиш Shift+F9). В этом окне мы можем ввести выражение Запрос.Параметры.

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

  4. Программное извлечение параметров: Если параметров очень много или нам нужно их сохранить для последующего автоматического заполнения, мы можем сделать это программно. Создадим переменную типа Структура или Соответствие и скопируем в нее параметры из свойства Запрос.Параметры.

    Вот пример кода, который позволит нам сохранить параметры в виде структуры:

    
    // Предполагаем, что переменная Запрос уже инициализирована и параметры установлены
    СтруктураПараметров = Новый Структура();
    Для Каждого Параметр Из Запрос.Параметры Цикл
        СтруктураПараметров.Вставить(Параметр.Ключ, Параметр.Значение);
    КонецЦикла;
    // Теперь СтруктураПараметров содержит все параметры запроса
    // Мы можем посмотреть ее содержимое в Табло или в окне Выражения
    
  5. Метод Запрос.НайтиПараметры(): Дополнительно, для анализа текста запроса и поиска всех объявленных параметров (даже если они еще не установлены), мы можем использовать метод Запрос.НайтиПараметры(). Этот метод возвращает коллекцию имен параметров, которые присутствуют в тексте запроса. Это полезно, когда нам нужно программно заполнить параметры, но мы не знаем их точного списка заранее.

    Например:

    
    ТекстЗапроса = "ВЫБРАТЬ Документ.Ссылка ИЗ Документ.РеализацияТоваровУслуг КАК Документ ГДЕ Документ.Дата >= &НачалоПериода И Документ.Дата <= &КонецПериода";
    Запрос = Новый Запрос(ТекстЗапроса);
    ИменаПараметров = Запрос.НайтиПараметры();
    Для Каждого ИмяПараметра Из ИменаПараметров Цикл
        Сообщить("Найден параметр: " + ИмяПараметра);
    КонецЦикла;
    

Способ 2: Использование стандартной консоли запросов

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

Давайте разберем основные функции:

  1. Автоматическое заполнение параметров: В стандартной консоли запросов обычно присутствует кнопка "Заполнить параметры" или аналогичная. После того как мы вставим текст запроса в соответствующее поле и нажмем эту кнопку, консоль автоматически просканирует текст и выделит все объявленные параметры (начинающиеся с &). Они появятся в отдельной секции, где мы можем установить их значения.

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

  3. Заполнение сложных типов параметров: Для параметров сложных типов, таких как МоментВремени, Граница, ссылки на объекты или списки значений, консоль запросов может предлагать специализированные элементы управления для их удобного заполнения. Например, для дат часто присутствует календарь, для ссылок — выбор из справочника или документа.

  4. Использование выражений на встроенном языке: В некоторых консолях запросов предусмотрена возможность указывать значения параметров не только константами, но и выражениями на встроенном языке 1С. Это может быть очень удобно для динамического получения значений, например, "ТекущаяДата()" или "Константы.ОсновнойСклад.Получить()".

  5. Изучение справки: Если мы работаем с типовой конфигурацией на БСП, всегда полезно изучить встроенную справку по консоли запросов. В ней могут быть описаны специфические функции и особенности, которые помогут нам более эффективно использовать этот инструмент.

Способ 3: Использование специализированных внешних инструментов

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

Эти инструменты часто обладают расширенными возможностями:

  1. Копирование параметров из отладчика: Многие из них умеют принимать скопированные из отладчика структуры или текстовые представления параметров и автоматически заполнять ими свою форму. Это значительно экономит время, избавляя от ручного ввода.

  2. Сохранение и загрузка наборов параметров: Мы можем сохранить текущий набор параметров запроса в файл или в хранилище, а затем загрузить его для другого запроса или в другой сессии. Это полезно, когда мы отлаживаем разные сценарии одного и того же запроса.

  3. Расширенная работа с временными таблицами: Некоторые продвинутые консоли предоставляют более удобные интерфейсы для просмотра и анализа данных во временных таблицах, а также для модификации их содержимого.

  4. Улучшенное взаимодействие с конфигуратором: Отдельные инструменты могут иметь функции для более глубокой интеграции с конфигуратором, например, для быстрого получения текста запроса из модуля или для выполнения запроса в контексте текущего объекта.

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

Программное получение и установка параметров запроса

Для более глубокого понимания и возможности создания собственных инструментов для работы с параметрами, давайте подробнее рассмотрим программные методы.

  1. Свойство Запрос.Параметры: Как мы уже выяснили, это свойство объекта Запрос представляет собой коллекцию установленных параметров. Оно ведет себя как структура, где ключом является имя параметра (без символа &), а значением — его текущее значение. Мы можем программно обращаться к этой коллекции, перебирать ее, добавлять или удалять параметры.

    Пример перебора и вывода параметров:

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

    Пример:

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

    Пример использования для программного заполнения:

    
    Функция ЗаполнитьПараметрыЗапроса(Запрос, ИсточникЗначений)
        // ИсточникЗначений - может быть структурой, соответствием или другим объектом
        // содержащим значения для параметров.
        ИменаПараметров = Запрос.НайтиПараметры();
        Для Каждого ИмяПараметра Из ИменаПараметров Цикл
            Если ИсточникЗначений.Свойство(ИмяПараметра) Тогда
                Запрос.УстановитьПараметр(ИмяПараметра, ИсточникЗначений[ИмяПараметра]);
            Иначе
                Сообщить("Внимание! Для параметра '" + ИмяПараметра + "' не найдено значение.");
            КонецЕсли;
        КонецЦикла;
    КонецФункции
    
    // Пример использования:
    МойЗапрос = Новый Запрос();
    МойЗапрос.Текст = "ВЫБРАТЬ ... ГДЕ ... &Параметр1 И ... &Параметр2";
    
    ЗначенияДляЗаполнения = Новый Структура("Параметр1,Параметр2", "Значение1", "Значение2");
    ЗаполнитьПараметрыЗапроса(МойЗапрос, ЗначенияДляЗаполнения);
    

Работа с пакетами запросов и временными таблицами

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

  1. Концепция пакетных запросов: Пакет запросов состоит из нескольких операторов ВЫБРАТЬ, ВСТАВИТЬ, СОЗДАТЬ ВРЕМЕННУЮ ТАБЛИЦУ и других, разделенных точкой с запятой. Они выполняются последовательно, и временные таблицы, объявленные в одном запросе с помощью ПОМЕСТИТЬ ИмяВременнойТаблицы, становятся доступными для всех последующих запросов в пакете.

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

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

Дополнительные рекомендации

Для повышения эффективности работы с запросами и их отладкой, особенно в контексте отчетов СКД, мы можем учесть следующие моменты:

  1. Консоль компоновки данных: Этот инструмент является незаменимым при отладке отчетов на СКД. Он позволяет не только просмотреть финальный запрос, который будет выполнен базой данных, но и проанализировать структуру данных, параметры компоновки, настройки отчета и другие аспекты, влияющие на результат. Использование этой консоли помогает понять, как параметры отчета СКД трансформируются в параметры запроса.

  2. Программное получение параметров СКД: Если мы работаем с параметрами СКД программно, например, для формирования предустановленных значений или для анализа, мы можем использовать следующие подходы:

    • Объект Справочники.ПараметрыСистемы: В некоторых конфигурациях (особенно на БСП) используются общие параметры, которые могут быть доступны через этот справочник.

    • Методы ПолучитьЗначениеПараметра() и УстановитьЗначениеПараметра(): Эти методы обычно применяются к объектам НастройкиКомпоновкиДанных или к ПараметрыДанных схемы компоновки, позволяя управлять значениями параметров отчета.

  3. Структурирование запросов: Всегда стремимся писать структурированные и легкочитаемые запросы. Используем понятные имена для параметров и временных таблиц. Это значительно облегчит отладку как для нас, так и для наших коллег.

Мы выяснили, что для получения параметров запроса в отладчике достаточно обратиться к свойству Запрос.Параметры. Для использования этих параметров в консоли без ручного ввода у нас есть несколько путей: это возможности стандартной консоли запросов (автозаполнение, работа с пакетами и ВТ), использование специализированных внешних обработок для расширенной автоматизации, а также программные методы для извлечения и установки параметров.

← На главную