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

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

При отладке сложных запросов в среде 1С:Предприятие разработчики часто сталкиваются с необходимостью заглянуть внутрь временных таблиц (ВТ). Поскольку временные таблицы создаются и хранятся в СУБД в рамках сеанса и не выводятся в стандартный результат запроса напрямую, их анализ в режиме «живой» отладки кода может вызвать затруднения. Особенно остро эта проблема встает при поддержке старых конфигураций или при работе на платформе версий ниже 8.3.8.

В этой статье мы подробно разберем все существующие способы программного просмотра содержимого временных таблиц прямо в процессе отладки: от простых однострочных команд в окне вычисления выражений до универсальных функций и специализированных инструментов.

Способ 1. Модификация текста исходного запроса «на лету» (для всех версий платформы)

Этот классический метод выручает разработчиков уже много лет. Он работает на абсолютно любых версиях платформы 1С:Предприятие, включая старые релизы 8.2 и ранние 8.3. Суть метода заключается в динамическом изменении текста запроса в окне Вычислить выражение (Shift + F9) в точке останова.

Рассмотрим этот процесс по шагам:

  1. Установим точку останова в конфигураторе сразу после того, как временная таблица была создана и записана в менеджер временных таблиц (например, на строке с вызовом Запрос.Выполнить() или сразу после нее).
  2. Запустим отладку и дождемся остановки программы на нашей точке.
  3. Нажмем комбинацию клавиш Shift + F9 для вызова окна «Вычислить выражение».
  4. Сначала нам необходимо подменить текст запроса, чтобы он выбирал данные из интересующей нас временной таблицы. Для этого в поле «Выражение» введем следующую конструкцию и нажмем кнопку Рассчитать: Запрос.Текст = "ВЫБРАТЬ * ИЗ ИмяВременнойТаблицы" Примечание: вместо «ИмяВременнойТаблицы» укажите реальное имя вашей таблицы в запросе.
  5. После того как свойство текста запроса изменилось, введем в поле вычисления новое выражение для получения результата и выгрузки его в таблицу значений: Запрос.Выполнить().Выгрузить()
  6. Нажмем кнопку Рассчитать. В окне результатов мы увидим полноценную таблицу значений со всем содержимым нашей временной таблицы. Мы можем детально изучить типы данных, состав колонок и строки.

Важное предупреждение: этот способ изменяет состояние исходного объекта Запрос. Если после вашей точки останова алгоритм программы продолжает использовать этот же объект Запрос, выполнение кода может завершиться ошибкой, так как его текст был изменен. Чтобы этого избежать, перед продолжением выполнения кода верните исходный текст запроса обратно тем же способом или предварительно скопируйте его значение.

Способ 2. Использование штатных методов платформы (начиная с 8.3.8)

Если ваша информационная база работает на современных версиях платформы (8.3.8 и выше), вам больше не нужно модифицировать текст запроса вручную и рисковать стабильностью выполнения программы. Фирма «1С» добавила встроенные методы, которые позволяют легко извлечь данные.

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

Для просмотра всех таблиц пакета в окне Shift + F9 достаточно вычислить следующее выражение:

Запрос.ВыполнитьПакетСПромежуточнымиДанными()

В результате мы получим массив объектов РезультатЗапроса. Каждый элемент массива соответствует определенному пакету запроса. Чтобы просмотреть конкретную таблицу из этого массива (например, первую по счету временную таблицу, которая обычно идет под определенным индексом), мы можем написать:

Запрос.ВыполнитьПакетСПромежуточнымиДанными()[0].Выгрузить()

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


Запрос.МенеджерВременныхТаблиц.Таблицы.Найти("ИмяВременнойТаблицы").ПолучитьДанные().Выгрузить()

Если нам точно известен индекс временной таблицы в менеджере, мы можем применить более короткую запись:

Запрос.МенеджерВременныхТаблиц.Таблицы[0].ПолучитьДанные().Выгрузить()

Этот способ абсолютно безопасен, не портит исходный объект запроса и работает мгновенно.

Способ 3. Универсальная функция для отладки всех временных таблиц

Если в вашем запросе создается большое количество временных таблиц и вы хотите видеть их структуру и состав одновременно, мы рекомендуем написать универсальную вспомогательную функцию. Ее можно разместить в любом общем модуле с признаком «Сервер» и «Вызов сервера» (например, в модуле ОбщегоНазначенияУчета или специально созданном для отладки ОтладкаСервер).

Рассмотрим код такой функции:


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

Теперь в любой точке останова, где у вас есть доступ к объекту запроса, вы можете просто написать в табло отладчика:

ОтладкаСервер.ПолучитьВсеВременныеТаблицы(Запрос.МенеджерВременныхТаблиц)

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

Способ 4. Готовые решения в типовых конфигурациях (БСП, ERP, УТ, БП)

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

Если вы ведете разработку в таких конфигурациях, как Управление торговлей 11 (УТ), Комплексная автоматизация 2 (КА) или ERP Управление предприятием 2, вы можете использовать встроенные инструменты:

Если вы работаете в конфигурации Бухгалтерия предприятия 3 (БП), воспользуйтесь специализированной функцией подсистемы учета затрат:


УчетЗатрат.ВыгрузитьВременнуюТаблицу(Запрос.МенеджерВременныхТаблиц, "ИмяВременнойТаблицы")

Использование штатных механизмов БСП гарантирует стабильность отладки и экономит ваше время на написание велосипедов.

Способ 5. Профессиональные инструменты разработчика (ИР)

Для тех, кто хочет максимального комфорта при отладке запросов, созданы внешние программные комплексы. Наиболее известным и мощным среди них является комплекс «Инструменты разработчика» (ИР).

В составе инструментов присутствует консоль запросов, которая умеет перехватывать менеджеры временных таблиц прямо из контекста отладки. Чтобы открыть запрос в специализированной консоли ИР с сохранением всех временных таблиц и параметров, достаточно в табло отладки вычислить функцию:

ПолВТ(Запрос)

Эта функция вернет структуру всех временных таблиц запроса. Если вы хотите открыть запрос со всеми связями во внешней интерактивной консоли ИР, введите команду:

От(Запрос)

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

Нюансы отладки на платформе 1С 8.3.21 и новее

Завершая наш разбор, обратим внимание на важную техническую особенность современных версий платформы. Начиная с релизов платформы 8.3.21, при попытке просмотреть большие таблицы значений (содержащие десятки тысяч строк или сложные типы данных), полученные из временных таблиц, стандартное окно отладчика может зависнуть. Вместо данных вы увидите бесконечный статус «Расчет значения».

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

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

← На главную