Суть задачи
Разработать расширение конфигурации, которое автоматизирует перенос сложных пакетных запросов из отладчика в обработку «Консоль запросов» и при этом сохраняет контекст менеджера временных таблиц.
Обычной сериализации текста и параметров недостаточно: временные таблицы существуют внутри менеджера текущего сеанса и недоступны в другой точке выполнения. Поэтому запрос, корректно работающий в отладчике, после переноса в консоль может завершиться ошибкой из-за отсутствующих таблиц.
Почему теряется контекст
Пакетный запрос может создавать несколько временных таблиц, последовательно дополнять их и использовать в следующих пакетах. Обработка «Консоль запросов» получает текст запроса и его параметры, но не может автоматически перенести содержимое объекта МенеджерВременныхТаблиц из памяти отлаживаемого сеанса.
Главная задача механизма — превратить необходимые временные таблицы в обычные параметры запроса и дополнить текст пакетами, которые восстановят эти таблицы перед выполнением исходного запроса.
Контракт функции
Расширение содержит общий модуль с экспортной функцией. На вход функция получает объект Запрос, а на выходе возвращает XML-строку с модифицированным текстом и полным набором параметров.
Если свойство МенеджерВременныхТаблиц не заполнено, функция сериализует запрос стандартным способом — аналогично методу ЗапросВСтрокуXML общего модуля ОбщегоНазначения.
Алгоритм работы
- Проверить наличие менеджера временных таблиц у переданного запроса.
- Получить из менеджера список имен всех хранящихся таблиц.
- Определить, какие из них действительно используются в тексте запроса.
- Выгрузить данные найденных таблиц и добавить их в новый набор параметров.
- Сформировать пакеты, восстанавливающие таблицы из параметров.
- Добавить эти пакеты перед исходным текстом запроса.
- Сериализовать новую структуру в XML-строку.
Исходный объект запроса остается неизменным: функция работает с новой структурой, отдельной копией параметров и новым текстом.
Поиск используемых временных таблиц
Из менеджера можно получить все созданные таблицы, но переносить нужно только те, к которым обращается текущий запрос. Это уменьшает размер XML и исключает лишние зависимости.
Для проверки имени используются встроенные методы работы с регулярными выражениями. Границы шаблона должны гарантировать, что имя найдено как самостоятельный идентификатор, а не как часть другого слова.
// Условный пример логики проверки
Шаблон = "(?<!\w)" + ЭкранироватьДляРегулярногоВыражения(ИмяТаблицы)
+ "(?!\w)";
Если СтрокаНайденаПоРегулярномуВыражению(ТекстЗапроса, Шаблон) Тогда
// Таблица используется в запросе.
КонецЕсли;Простой поиск подстроки не подходит. Например, таблица с именем ВТ_Товары не должна считаться найденной только потому, что в тексте присутствует идентификатор ВТ_ТоварыДокумента.
Формирование параметров
Новая структура параметров объединяет два источника данных:
- исходные параметры переданного запроса;
- данные необходимых временных таблиц из менеджера.
Для каждой найденной таблицы создается отдельный параметр с уникальным и предсказуемым именем. Значением параметра становится выгрузка данных таблицы, пригодная для последующего помещения во временную таблицу в новом сеансе.
Имена служебных параметров не должны конфликтовать с параметрами исходного запроса. При совпадении генератору следует использовать стабильный префикс или сформировать уникальное имя.
Дополнение текста запроса
Перед исходным текстом формируются служебные пакеты. Каждый пакет получает данные из соответствующего параметра и помещает их во временную таблицу с исходным именем.
ВЫБРАТЬ
Данные.*
ПОМЕСТИТЬ ВТ_ИмяТаблицы
ИЗ
&ПараметрВТ_ИмяТаблицы КАК Данные
;
////////////////////////////////////////////////////////////////////////////////
Исходный текст пакетного запросаПорядок служебных пакетов должен учитывать зависимости временных таблиц. После их выполнения исходная часть запроса обращается к тем же именам и получает данные, идентичные содержимому менеджера в отладчике.
Сериализация в XML
После подготовки параметров и текста функция создает структуру в формате, который понимает «Консоль запросов», и выполняет ее сериализацию.
ДанныеЗапроса = Новый Структура;
ДанныеЗапроса.Вставить("Текст", ДополненныйТекстЗапроса);
ДанныеЗапроса.Вставить("Параметры", НовыеПараметры);
// Сериализация структуры в XML-строку
Возврат СериализоватьЗапрос(ДанныеЗапроса);Полученную строку можно скопировать из отладчика и импортировать в консоль. Все изменения выполняются над новой структурой, поэтому текст и параметры исходного объекта Запрос не меняются.
Функциональные требования
- стандартная сериализация запроса без менеджера временных таблиц;
- получение полного списка таблиц менеджера;
- фильтрация таблиц по фактическому использованию в тексте;
- поиск имен с учетом границ идентификаторов;
- перенос исходных параметров без изменений;
- добавление данных временных таблиц в новые параметры;
- генерация служебных пакетов в начале запроса;
- возврат совместимой XML-строки.
Критерии успешности
- весь код расширения сформирован ИИ-агентом;
- XML-строка импортируется в «Консоль запросов» без ошибок;
- импортированный пакетный запрос выполняется без ошибок;
- восстановленные таблицы идентичны данным из памяти отладчика;
- исходный запрос и его параметры не изменяются;
- расширение работает на любых конфигурациях.
Результат
Готовое расширение содержит общий модуль с экспортной функцией, которая принимает объект Запрос и возвращает XML-строку для импорта в обработку «Консоль запросов».
Функция переносит только используемые временные таблицы, восстанавливает их через параметры и служебные пакеты, сохраняет исходный запрос неизменным и использует стандартную сериализацию, когда менеджер временных таблиц отсутствует.