При работе с типовыми конфигурациями 1С программисты часто сталкиваются с ситуацией, когда запрос использует сложные параметры: массивы исключаемых ссылок, списки значений для фильтров или таблицы значений. Копировать такие параметры вручную в визуальный редактор параметров консоли — задача трудоемкая и неблагодарная, особенно если элементов в списке десятки. Рассмотрим, как автоматизировать этот процесс и перенести код инициализации параметров из конфигуратора в консоль запросов «Инструментов разработчика» (ИР) с минимальными усилиями.
Это самый мощный и гибкий метод, позволяющий использовать стандартный синтаксис 1С для подготовки данных. Разберем по шагам, как это работает. В консоли запросов ИР существует специальная закладка «Перед выполнением запроса». Код, написанный здесь, исполняется непосредственно перед тем, как запрос будет отправлен на сервер БД.
Рассмотрим алгоритм действий:
Проанализируем пример кода, который можно вставить в это окно:
// Код инициализации, скопированный из типовой конфигурации
ИсключаемыеЗаписи = Новый Массив;
ИсключаемыеЗаписи.Добавить(ПредопределенноеЗначение("Справочник.Номенклатура.ПустаяСсылка"));
// ... и так далее
// Ключевой момент: передача параметра в консоль
// В контексте этого окна нам доступен объект мОбъектЗапроса
мОбъектЗапроса.УстановитьПараметр("ИсключаемыеЗаписи", ИсключаемыеЗаписи);
Важное замечание: многие разработчики путаются, когда после выполнения кода визуальный список параметров в нижней части консоли не обновляется. Выясним причину: в ИР программная установка параметров через мОбъектЗапроса и визуальная таблица — это два разных слоя. Программная установка имеет приоритет. Даже если в таблице параметров пусто, запрос отработает корректно, так как параметр будет «подсунут» объекту запроса в момент выполнения. Чтобы убедиться в правильности заполнения, можно добавить в код строку Сообщить(ИсключаемыеЗаписи.Количество());.
Если нам нужно инициализировать параметр быстро и не хочется переходить на отдельные вкладки, мы можем воспользоваться механизмом выражений. В таблице параметров консоли ИР в колонке «Тип» выберем значение «Выражение».
Рассмотрим особенности этого подхода:
Пример выражения для создания массива на лету:
Новый Массив;
м = Результат; // В некоторых версиях используется переменная Результат
м.Добавить(Справочники.Валюты.НайтиПоКоду("643"));
Возврат м;
Этот способ удобен для небольших фрагментов кода, которые не загромождают общую логику подготовки запроса.
Это «профессиональный» путь, который экономит максимум времени. Если вы используете портативную или встроенную версию ИР, вам не обязательно копировать текст запроса и параметры вручную. Можно «выстрелить» объектом запроса прямо из конфигуратора в консоль.
Разберем, как это сделать:
Запрос уже инициализирован (параметры установлены).ирОбщий.От(Запрос) (для портативных версий префикс может отличаться, например, ирКл.От(Запрос)).Посмотрим на преимущества этого метода: вам вообще не нужно заботиться о коде Добавить(). Массив уже существует в памяти 1С, и ИР просто копирует его состояние в интерфейс консоли.
В контексте вкладки «Перед выполнением запроса» помимо объекта мОбъектЗапроса доступна также структура мПараметры. Рассмотрим, как можно манипулировать ею:
// Можно напрямую изменять структуру параметров консоли
мПараметры.Вставить("МойМассив", Новый Массив);
мПараметры.МойМассив.Добавить(1);
мПараметры.МойМассив.Добавить(100);
Отличие от мОбъектЗапроса.УстановитьПараметр() заключается в том, что в некоторых сборках ИР изменения в структуре мПараметры могут отобразиться в интерфейсе более наглядно, хотя поведение зависит от конкретной версии портативного инструмента.
Проанализируем ситуацию, когда код инициализации слишком велик. Чтобы не запутаться, следуйте этим правилам:
МенеджерВременныхТаблиц в мОбъектЗапроса.МенеджерВременныхТаблиц в той же вкладке «Перед выполнением».ирОбщий.СообщитьЛ(Значение), чтобы быстро увидеть содержимое объекта в окне сообщений.Таким образом, мы выяснили, что наиболее эффективным способом для разового переноса кода является вкладка «Перед выполнением запроса», а для работы «в потоке» лучше всего подходит использование метода отладки От().