Как посмотреть результат запроса 1с в отладчике

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

Есть два основных метода отладки больших запросов.

Использование консоли запросов

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

Консоль запросов позволяет писать и отлаживать запросы в режиме 1С:Предприятия, не используя Конфигуратор. По ссылке доступна для скачивания одна из версий консоли запросов, скачиваем файл, разархивируем его и открываем через меню 1С:Предприятия «Файл – Открыть»

Для того чтобы разобраться в большом запросе с помощью консоли запросов, разбейте запрос на пакеты. Это позволит сразу отслеживать результат выполнения каждой части запроса. После выполнения запроса перейдите на закладку “Временные таблицы”, выберите нужную вам и нажмите “Отладить”, для виртуальной таблицы создастся отдельный запрос, который вы можете выполнить отдельно от основного.

Выгрузка результатов временных таблиц

Используется функция вида:

Ее можно расположить в модуле вашей обработки, либо в общем модуле 1С 8. Т.о. к ней можно обращаться из любого отлаживаемого запроса, вставив в нужное место модуля следующий код:

  • Запрос — отлаживаемый нами запрос;
  • втИмя — имя виртуальной таблицы отлаживаемого запроса.

Полученную таблицу значений можно просмотреть в отладке при помощи “Вычислить выражение”.

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

Рассмотрим 4 способа получения этой информации.

Данные: в наличии имеется бесполезный запрос с двумя временными таблицами (“Подразделения”, “Пользователи”):

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

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

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

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

Способ 2. Используя процедуру многих типовых конфигураций: “ПоказатьВременнуюТаблицу”. Если в вашей конфигурации таковой не имеется, то приведу полное её описание (смело копируйте в свой общий модуль):

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

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

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

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

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

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

Для примера рассмотрим конфигурацию «Управление торговлей», редакция 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-версия статьи для участников группы ВКонтакте

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

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

Добрый день!
Если можно, добавлю свои пять копеек.
Для отладки запросов можно использовать расширения. Годится это, правда, только для конфигураций, совместимых с 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 есть отдельный регистр сведений РасчетНалогаНаИмущество, куда при закрытии месяца записываются уже подготовленные и структурированные данные. И декларация заполняется по этому регистру. Правда, сама процедура получения данных для записи в регистр достаточно сложная.
Так что хранение промежуточных данных используется. Но для этого могут потребоваться методические изменения в прикладном решении.
К тому же, чтобы подготовить эти промежуточные данные в общем случае может потребоваться также достаточно сложный алгоритм или объемный запрос, разделенный на отдельные кусочки.

Кроме инструментов разработчика пользуюсь глобальной процедурой парсинга запросов. Позволяет на лету посмотреть результат выполнения любого пакета, вложенного, запроса объединения. А также сохранить в файл sel со всеми параметрами. Очень удобно! Вот скриншот примера использования: https://yadi.sk/i/oqNcK0IJ3Mimcu

Процедура парсинга и подробная инструкция внутри обработки ПарсерЗапроса_v2.16beta
https://yadi.sk/d/PLG8TPru3Mimbp

Уже и не помню, где ее скачал.

Василий, полезные приемчики, полезная статья. Спасибо

Adblock
detector