При отладке сложных запросов в среде 1С:Предприятие разработчики часто сталкиваются с необходимостью заглянуть внутрь временных таблиц (ВТ). Поскольку временные таблицы создаются и хранятся в СУБД в рамках сеанса и не выводятся в стандартный результат запроса напрямую, их анализ в режиме «живой» отладки кода может вызвать затруднения. Особенно остро эта проблема встает при поддержке старых конфигураций или при работе на платформе версий ниже 8.3.8.
В этой статье мы подробно разберем все существующие способы программного просмотра содержимого временных таблиц прямо в процессе отладки: от простых однострочных команд в окне вычисления выражений до универсальных функций и специализированных инструментов.
Этот классический метод выручает разработчиков уже много лет. Он работает на абсолютно любых версиях платформы 1С:Предприятие, включая старые релизы 8.2 и ранние 8.3. Суть метода заключается в динамическом изменении текста запроса в окне Вычислить выражение (Shift + F9) в точке останова.
Рассмотрим этот процесс по шагам:
Запрос.Выполнить() или сразу после нее).Запрос.Текст = "ВЫБРАТЬ * ИЗ ИмяВременнойТаблицы"
Примечание: вместо «ИмяВременнойТаблицы» укажите реальное имя вашей таблицы в запросе.
Запрос.Выполнить().Выгрузить()
Важное предупреждение: этот способ изменяет состояние исходного объекта Запрос. Если после вашей точки останова алгоритм программы продолжает использовать этот же объект Запрос, выполнение кода может завершиться ошибкой, так как его текст был изменен. Чтобы этого избежать, перед продолжением выполнения кода верните исходный текст запроса обратно тем же способом или предварительно скопируйте его значение.
Если ваша информационная база работает на современных версиях платформы (8.3.8 и выше), вам больше не нужно модифицировать текст запроса вручную и рисковать стабильностью выполнения программы. Фирма «1С» добавила встроенные методы, которые позволяют легко извлечь данные.
Проанализируем первый системный метод — ВыполнитьПакетСПромежуточнымиДанными(). Этот метод выполняет весь пакет запросов последовательно и возвращает массив результатов, в котором присутствуют результаты как для конечных выборок, так и для всех промежуточных временных таблиц.
Для просмотра всех таблиц пакета в окне Shift + F9 достаточно вычислить следующее выражение:
Запрос.ВыполнитьПакетСПромежуточнымиДанными()
В результате мы получим массив объектов РезультатЗапроса. Каждый элемент массива соответствует определенному пакету запроса. Чтобы просмотреть конкретную таблицу из этого массива (например, первую по счету временную таблицу, которая обычно идет под определенным индексом), мы можем написать:
Запрос.ВыполнитьПакетСПромежуточнымиДанными()[0].Выгрузить()
Если вы хотите получить данные конкретной временной таблицы по ее имени без выполнения всего пакета заново, обратите внимание на метод ПолучитьДанные() объекта ВременнаяТаблицаЗапроса. Мы можем обратиться к менеджеру временных таблиц напрямую:
Запрос.МенеджерВременныхТаблиц.Таблицы.Найти("ИмяВременнойТаблицы").ПолучитьДанные().Выгрузить()
Если нам точно известен индекс временной таблицы в менеджере, мы можем применить более короткую запись:
Запрос.МенеджерВременныхТаблиц.Таблицы[0].ПолучитьДанные().Выгрузить()
Этот способ абсолютно безопасен, не портит исходный объект запроса и работает мгновенно.
Если в вашем запросе создается большое количество временных таблиц и вы хотите видеть их структуру и состав одновременно, мы рекомендуем написать универсальную вспомогательную функцию. Ее можно разместить в любом общем модуле с признаком «Сервер» и «Вызов сервера» (например, в модуле ОбщегоНазначенияУчета или специально созданном для отладки ОтладкаСервер).
Рассмотрим код такой функции:
Функция ПолучитьВсеВременныеТаблицы(МенеджерВременныхТаблиц) Экспорт
РезультатСтруктура = Новый Структура;
// Предотвращаем падение платформы при пустом менеджере
Если МенеджерВременныхТаблиц = Неопределено Тогда
Возврат РезультатСтруктура;
КонецЕсли;
Для Каждого ЭлементТаблица Из МенеджерВременныхТаблиц.Таблицы Цикл
ИмяТаблицы = ЭлементТаблица.ПолноеИмя;
ЗапросДебаг = Новый Запрос;
ЗапросДебаг.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;
ЗапросДебаг.Текст = "ВЫБРАТЬ * ИЗ " + ИмяТаблицы;
Попытка
ТаблицаЗначений = ЗапросДебаг.Выполнить().Выгрузить();
РезультатСтруктура.Вставить(ИмяТаблицы, ТаблицаЗначений);
Исключение
// В случае ошибки (например, если таблица пуста или заблокирована) запишем текст ошибки
РезультатСтруктура.Вставить(ИмяТаблицы, КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
КонецЦикла;
Возврат РезультатСтруктура;
КонецФункции
Теперь в любой точке останова, где у вас есть доступ к объекту запроса, вы можете просто написать в табло отладчика:
ОтладкаСервер.ПолучитьВсеВременныеТаблицы(Запрос.МенеджерВременныхТаблиц)
Функция вернет удобную структуру, где ключами будут имена всех временных таблиц, а значениями — их содержимое в виде таблиц значений. Вы сможете развернуть любую таблицу и проанализировать промежуточные данные расчета.
Перед тем как писать собственный программный код или внешние обработки, выясним, не позаботились ли о нас разработчики типовых решений от «1С». В современных конфигурациях, построенных на базе Библиотеки Стандартных Подсистем (БСП), уже присутствуют готовые экспортные методы в общих модулях.
Если вы ведете разработку в таких конфигурациях, как Управление торговлей 11 (УТ), Комплексная автоматизация 2 (КА) или ERP Управление предприятием 2, вы можете использовать встроенные инструменты:
ОбщегоНазначенияУТ.ПоказатьВременнуюТаблицу(Запрос.МенеджерВременныхТаблиц, "ИмяВременнойТаблицы")
ПроведениеСервер.ПоказатьВременнуюТаблицу(Запрос.МенеджерВременныхТаблиц, "ИмяВременнойТаблицы")
ПроведениеСервер.ОтладитьЗапрос(Запрос)
Этот метод автоматически выполнит запрос и вернет вам массив с результатами всех промежуточных шагов.
Если вы работаете в конфигурации Бухгалтерия предприятия 3 (БП), воспользуйтесь специализированной функцией подсистемы учета затрат:
УчетЗатрат.ВыгрузитьВременнуюТаблицу(Запрос.МенеджерВременныхТаблиц, "ИмяВременнойТаблицы")
Использование штатных механизмов БСП гарантирует стабильность отладки и экономит ваше время на написание велосипедов.
Для тех, кто хочет максимального комфорта при отладке запросов, созданы внешние программные комплексы. Наиболее известным и мощным среди них является комплекс «Инструменты разработчика» (ИР).
В составе инструментов присутствует консоль запросов, которая умеет перехватывать менеджеры временных таблиц прямо из контекста отладки. Чтобы открыть запрос в специализированной консоли ИР с сохранением всех временных таблиц и параметров, достаточно в табло отладки вычислить функцию:
ПолВТ(Запрос)
Эта функция вернет структуру всех временных таблиц запроса. Если вы хотите открыть запрос со всеми связями во внешней интерактивной консоли ИР, введите команду:
От(Запрос)
После этого откроется полноценная форма консоли запросов, где вы сможете визуально просматривать связи, структуру метаданных и выполнять любые дополнительные запросы к вашим временным таблицам на лету. Для этой задачи можно использовать инструмент для фиксации временных таблиц и параметров запросов прямо из отладки.
Завершая наш разбор, обратим внимание на важную техническую особенность современных версий платформы. Начиная с релизов платформы 8.3.21, при попытке просмотреть большие таблицы значений (содержащие десятки тысяч строк или сложные типы данных), полученные из временных таблиц, стандартное окно отладчика может зависнуть. Вместо данных вы увидите бесконечный статус «Расчет значения».
Это связано с оптимизацией сетевого трафика и изменением модели взаимодействия конфигуратора с сервером отладки. Чтобы избежать зависаний при анализе больших временных таблиц, рекомендуем придерживаться следующих правил:
ПЕРВЫЕ. Например:
Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 100 * ИЗ МояВременнаяТаблица"
Мы детально разобрали все ключевые подходы к анализу временных таблиц в 1С. Выберите тот метод, который лучше всего подходит под стек технологий вашего проекта и текущую версию платформы, и сделайте процесс отладки быстрым и эффективным!