Перейти к содержимому

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

  • автор:

Функция просмотра временных таблиц запроса в отладчике

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

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

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

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

funkciya-prosmotra-vremennyx-tablic-zaprosa-v-otladchike_03

funkciya-prosmotra-vremennyx-tablic-zaprosa-v-otladchike_04

Функция предназначена для использования в окне «Вычислить выражение» отладчика — возвращает значение, удобное для просмотра в этом окне. Функция максимально автоматизирована и может работать с входными данными разных типов. Назначение аргументов функции понятно из их имён.

funkciya-prosmotra-vremennyx-tablic-zaprosa-v-otladchike_01

По кнопке «Показать значения в отдельном окне (F2)» можно просмотреть сами таблицы:

1С: просмотр содержимого временных таблиц в отладчике

Часто при отладке хитромудрых конфигураций необходимо подсмотреть содержимое временных таблиц. Начиная с платформы 8.13 это можно посмотреть прямо в отладчике. Пусть например временные тблицы у нас находятся в переменной МенеджерВТ. Нажимаем Shift-F9, вводим МенеджерВТ, нажимаем расчитать, проваливаемся в значение «Временные таблицы запроса» и видим названия временных таблиц:

Далее зная имена таблиц, можно получить содержимое каждой из них или по индексу или по имени:

Комментарии:

Добавить комментарий Отменить ответ

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

Отладка временных таблиц

Личный блог

После достаточно долгого отсутствия по причине полной занятости все таки решил написать очередной пост.

Отладка

Отладка

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

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

Все достаточно просто.

1. Получаем временные таблицы запроса

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

2. Получаем временную таблицу для отладки

Затем мы обращаемся к нужной нам для отладки временной таблице, добавляя Получить(<Индекс таблицы>)

3. Получаем непосредственно данные

Использование метода ПолучитьДанные() позволяет получить коллекцию РезультатЗапроса непосредственно для выбранной временной таблицы.

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

В случае отладки непосредственно таблицы с индексом 0 (как известно, индексы и нумерация в 1С начинается с нуля) получение данных выполняется с помощью вычисления следующей строки:

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

Отладка таким образом займет меньше времени, чем используя разные «костыли» ��

4 приема отладки запросов в типовых конфигурациях – на примере УТ 11.3 и УПП 1.3

В типовых конфигурациях используются массивные запросы до нескольких тысяч строк. Разобраться «с наскока» в таких запросах не получится.

Тексты этих запросов представляют собой пакеты с десятками временных таблиц.

Умение быстро просмотреть содержимое каждой временной таблицы (по сути – каждого отдельного этапа получения данных) существенно упрощает жизнь внедренцам, позволяет понять логику работы запроса, найти допущенную ошибку.

В текущей статье мы рассмотрим несколько приемов, которые помогут Вам анализировать и дорабатывать типовые конфигурации.

Начнем с ответа на популярный вопрос:

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

Для примера рассмотрим конфигурацию «Управление торговлей», редакция 11.3.

При закрытии кассовой смены пробитые чеки ККМ архивируются, все данные о продажах переносятся в документ Отчет о розничных продажах.

Проанализируем, какой запрос используется при закрытии кассовой смены.

В общем модуле РозничныеПродажи есть функция ЗаполнитьОтчетОРозничныхПродажах. Именно в ней и содержится текст запроса, который получает данные о чеках ККМ, пробитых за текущую кассовую смену. Приведем фрагмент этой процедуры.

В приведенном программном коде первым делом создается экземпляр менеджера временных таблиц. Именно в нем будут храниться создаваемые временные таблицы.

Далее создается запрос, осуществляется связь запроса с ранее созданным менеджером временных таблиц. Видно, что в тексте запроса несколько раз встречается ключевое слово ПОМЕСТИТЬ. Значит, при выполнении такого запроса происходит создание нескольких временных таблиц.

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

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

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

Выгрузим результат этого запроса в таблицу значений:

Можно увидеть, что в созданной временной таблице находятся три записи, но сами значения, помещенные во временную таблицу, отсутствуют, поскольку в результате запроса с ключевым словом ПОМЕСТИТЬ содержится только количество записей в созданной временной таблице, а не сами записи.

Чтобы просмотреть содержимое временной таблицы, в типовой конфигурации «Управление торговлей», редакция 11.3 была реализована вспомогательная экспортная функция ПоказатьВременнуюТаблицу общего модуля ОбщегоНазначенияУТ.

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

Функция выглядит следующим образом:

Итак, при помощи подобной функции можно при отладке просмотреть содержимое временной таблицы.

Функция ПоказатьВременнуюТаблицу из общего модуля ОбщегоНазначенияУТ присутствует в конфигурациях «Управление торговлей», редакция 11.3, «Комплексная автоматизация», редакция 2, «ERP Управление предприятием 2».

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

Свойства менеджера временных таблиц, появившиеся в платформе 8.3.8

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

У менеджера временных таблиц есть свойство Таблицы. Это коллекция, которая содержит временные таблицы, хранящиеся в менеджере временных таблиц:

Для каждой временной таблицы можно получить имя (свойство ПолноеИмя) и список колонок (свойство Колонки). Метод ПолучитьДанные() временной таблицы запроса возвращает значение типа РезультатЗапроса. Соответственно, можно вывести содержимое самой временной таблицы:

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

Результат работы этого метода аналогичен методу ВыполнитьПакет(), но есть важное отличие.

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

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

Просмотр временных таблиц при проведении документа Расчет себестоимости в УПП 1.3

В конфигурации «Управление производственным предприятием», редакция 1.3 документ Расчет себестоимости – один из самых сложных с точки зрения используемых алгоритмов. И в запросах, которые выполняются при проведении этого документа, используется достаточно большое количество временных таблиц. И зачастую при отладке нужно знать, какие именно данные в этих таблицах размещаются.

Рассмотрим, какие возможности есть в конфигурации УПП.

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

В конфигураторе устанавливаем точку останова в процедуре ОбработкаПроведения. В пользовательском режиме запускаем проведение документа. Происходит остановка на точке.

Теперь по шагам можно пройти все выполняемые строки программного кода, определить, где именно происходит расчет базы распределения. Это процедура ВыполнениеДействийДокумента в модуле объекта, где последовательно выполняются действия, указанные пользователем в форме документа. Для расчета базы происходит переход к процедуре РассчитатьБазуРаспределения общего модуля ПроцедурыРасчетаБазыРаспределенияЗатрат, в которой встречается следующий фрагмент программного кода:

Сама процедура ПоказатьВременнуюТаблицу() выглядит следующим образом:

Первым делом необходимо включить отладочный режим в структуре шапки документа. Для этого в окне Вычислить выражение (Shift + F9) указать:

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

Убедимся, что после вычисления этого выражения в структуре шапки документа свойство приняло нужное значение:

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

Такие возможности для просмотра содержимого временных таблиц предоставляет конфигурация «Управление производственным предприятием».

Передача запроса из отладчика в консоль запросов

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

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

Часто в программном коде итоговый текст запроса собирается из отдельных «кусочков» при помощи конкатенации строк. В таком случае можно установить точку останова в коде и при помощи функции отладчика Вычислить выражение (Shift + F9) получить готовый текст запроса, который и будет выполняться. Этот текст запроса можно переносить в консоль запросов, запущенную в пользовательском режиме.

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

Итак, в статье мы рассмотрели основные приемы, которые можно использовать при отладке запросов с временными таблицами.

Применяйте эти приемы на практике, это существенно облегчит задачи по анализу и доработке типовых конфигураций! 🙂

Об авторе

Автор статьи – Василий Ханевич

Автор и тренер курсов:

PDF-версия статьи для участников группы ВКонтакте

Если Вы еще не вступили в нее – сделайте это сейчас, и в блоке ниже (на этой странице) появятся ссылки на скачивание материалов.

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

Понимать, как работают запросы и уметь их строить — обязательный навык для всех, кто дорабатывает и внедряет 1С.

После курса Вы сможете:
  • Строить сложные запросы с несколькими источниками данных
  • Уверенно задействовать вложенные запросы и временные таблицы
  • Использовать встроенный язык для обработки результатов запроса
  • Учитывать особенности соединений и объединений нескольких таблиц.
  • Разрабатывать запросы на уровне задач Аттестации 1С:Специалист по платформе.

Комментарии / обсуждение (41):

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

ПакетЗаросов = Запрос.ВыполнитьПакетСПромежуточнымиДанными();
П = Новый Массив;
Для Каждого РезультатЗапроса Из ПакетЗаросов Цикл
Если ТипЗнч(РезультатЗапроса) = Тип(“РезультатЗапроса”) Тогда
П.Добавить(Новый Структура(“РезультатЗапросаТЧ, РезультатЗапроса”, РезультатЗапроса.Выгрузить(), РезультатЗапроса));
Иначе
П.Добавить(Новый Структура(“РезультатЗапросаТЧ, РезультатЗапроса”, Неопределено, РезультатЗапроса));
КонецЕсли;
КонецЦикла;

Добрый день!
Да, так можно использовать метод ВыполнитьПакетСПромежуточнымиДанными объекта типа Запрос.

Здравствуйте.
Спасибо за статью!
А вы не знаете, как посмотреть не содержимое временных таблиц (благодаря этой статье увидел, как)
А сам текст запроса временных таблиц?
То есть, можно ли увидеть весь итоговый текст запроса. который исполняется?

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

Можно ли как-то увидеть текст целиком?

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

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

А что делать, если в отладчике весь запрос не помещается в окно значения переменной?

Собственно запрос там режется и в конце показывает многоточие (…).

Добрый день!
Длинная строка может не помещаться в поле для просмотра значения, тогда отображается многоточие:
Выражение
При помощи кнопки с увеличительным стеклом можно открыть строку в отдельном окне, так поместится больше текста:
Просмотр
Однако и в этом отдельном окне может не поместиться весь текст большого запроса.
Тогда можно применить прием, подсмотренный в одной из консоли запросов.

Создаем внешнюю обработку ЗаписьСтрокиВФайл.epf. В модуле менеджера создаем экспортный метод:

Функция ЗаписатьТекстВФайл(ТекстоваяСтрока, ИмяФайла) Экспорт

Текст = Новый ЗаписьТекста(ИмяФайла, КодировкаТекста.UTF8);
Текст.ЗаписатьСтроку(ТекстоваяСтрока);
Текст.Закрыть();

При отладке вычисляем вот такое выражение:

Отладка
При этом в текстовый файл, указанный в параметре, будет записан целиком текст запроса.

Добрый день!
Если можно, добавлю свои пять копеек.
Для отладки запросов можно использовать расширения. Годится это, правда, только для конфигураций, совместимых с 8.3.10 и старше, но, если очень нужно, можно сделать копию базы и в копии снять ограничения на совместимость.
Итак, создаем новое расширение, расширяем в него интересующую нас процедуру с прагмой &после, в расширении процедуры имеем доступ к запросу и его менеджеру временных таблиц и можем делать любой анализ (хоть консоль запросов вызывай!).
Например, можно выгрузить все временные таблицы в Excel:

&После(“СоздатьДвижения”)
Процедура Отладка_СоздатьДвижения(МенеджерВременныхТаблиц, Затраты, Протокол)

ВывестиТаблицу(“Вершины”, Затраты.Вершины);
ВывестиТаблицу(“Ребра”, Затраты.Ребра);
ВывестиТаблицу(“Контуры”, Затраты.Контуры);
ВывестиТаблицу(“ЦелевоеСальдо”, Затраты.ЦелевоеСальдо);
Для каждого Таблица из МенеджерВременныхТаблиц.Таблицы Цикл
ВывестиТаблицу(Таблица.ПолноеИмя, Таблица.ПолучитьДанные().Выгрузить());
КонецЦикла;

Процедура ВывестиТаблицу(Имя, Таблица)

ТабДок = новый ТабличныйДокумент;

ТабДок.Область(1,1).Текст = Имя;
Для Инд=0 по Таблица.Колонки.Количество()-1 Цикл
ТабДок.Область(2,Инд+1).Текст = Таблица.Колонки[Инд].Имя;
КонецЦикла;

Для Инд1=0 по Таблица.Количество()-1 Цикл
Для Инд2=0 по Таблица.Колонки.Количество()-1 Цикл
ТабДок.Область(Инд1 + 3, Инд2 + 1).Текст = Строка(Таблица[Инд1][Инд2])
КонецЦикла
КонецЦикла;

ТабДок.Записать(“e:\XXX\Отладка\” + Имя + “.xlsx”, ТипФайлаТабличногоДокумента.XLSX)

С консолью запросов я, пожалуй, погорячился – процедуры с такими запросами исполняются на сервере, сорри…

Добрый день!
Да, вполне можно использовать такой подход.
Вопрос только в удобстве отладки таблиц в Excel.

Спасибо за статью!
Приемы и новшества актуальны, только ведь все понимают, что сопровождать, изменять, дорабатывать такие сложные запросы никому не хочется – я не прихожу в восторг от очередного задания разобраться в запросе – одно уныние от таких запросов: усложнять запросы можно до бесконечности. А выигрыш какой?!
Основная проблема (и потеря времени) происходит тогда, когда надо быстро понять (прочесть) запрос, затем отладить его в консоли запросов с текущими параметрами – понять для чего он был создан, почему именно такие связи между полями таблиц, где тот ключевой показатель, который надо изменить?
Я уверен, что временные виртуальные таблицы нужны, но не уверен, что нагромождать конфигурации большими кусочными запросами – это единственно правильный способ решить ту или иную задачу.
Почему я убежден, что есть другой способ конфигурировать базы, потому что в свое время, разрабатывая конфигурацию, пошел по самому простому пути – для получения определенных данных стал формировать большие запросы. Получение данных с каждым годом замедлялось в разы – терпение лопнуло, когда я сформировал отчет за 8 часов.
В результате я пошел от задачи и придумал механизм хранения промежуточных показателей в таблицах базы данных. Удобство заключалось еще и в том, что я мог в любой момент через пользовательский режим посмотреть регистры с отбором по нужным мне измерениям и провести визуальный анализ на предмет корректного расчета промежуточных сведений.
Спустя год я описал это в статье, почему до сих пор это не стало повсеместным – думаю, потому что способ так решать задачи до сих пор не популярен: проще написать большой и сложный запрос.
Вопрос к обсуждению: почему нельзя изменить сложные запросы УПП на схему хранения промежуточных сведений в самой базе данных?

Добрый день!
Резонный вопрос. Но скорее всего, в УПП уже ничего не поменяется, развивать это решение не будут.
А вот, например, в БП 3 я заметил движение в подобном направлении. В УПП понадобилось разобраться, почему декларация по налогу на имущество заполняется не так, как ожидается. Запросы там были достаточно сложные, выполнялись в цикле по периодам, состояли из отдельных временных таблиц и т.д. Потом смотрю, что в БП 3 есть отдельный регистр сведений РасчетНалогаНаИмущество, куда при закрытии месяца записываются уже подготовленные и структурированные данные. И декларация заполняется по этому регистру. Правда, сама процедура получения данных для записи в регистр достаточно сложная.
Так что хранение промежуточных данных используется. Но для этого могут потребоваться методические изменения в прикладном решении.
К тому же, чтобы подготовить эти промежуточные данные в общем случае может потребоваться также достаточно сложный алгоритм или объемный запрос, разделенный на отдельные кусочки.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *