В процессе разработки и оптимизации сложных запросов в 1С:Предприятие одной из самых трудоемких задач является отладка временных таблиц. Если на клиенте или в толстом клиенте мы можем легко выгрузить результат запроса в таблицу значений и отобразить её на экране, то при выполнении кода в серверных модулях (директива &НаСервере) ситуация усложняется. Мы не можем вызвать методы отображения форм, а содержимое переменной типа МенеджерВременныхТаблиц в окне отладки выглядит как «черный ящик».
Рассмотрим подробно несколько эффективных способов, которые позволяют заглянуть внутрь временных таблиц непосредственно в момент выполнения кода на сервере.
Начиная с определенных релизов платформы 8.3, у объекта МенеджерВременныхТаблиц появилась встроенная коллекция Таблицы. Это самый быстрый способ увидеть данные без написания дополнительного кода, используя только окно Вычислить выражение (Shift+F9).
Проанализируем алгоритм действий:
Запрос.Выполнить()).Запрос.МенеджерВременныхТаблиц.Таблицы
ПолучитьДанные(). Например, для первой таблицы в списке выражение будет выглядеть так:
Запрос.МенеджерВременныхТаблиц.Таблицы[0].ПолучитьДанные().Выгрузить()
Важный момент: если вы работаете в старых версиях платформы или в режиме совместимости с 8.2, коллекция Таблицы может быть недоступна. В этом случае перейдем к следующим вариантам.
Если нам нужно посмотреть содержимое таблицы по её имени, и мы находимся в контексте сервера, мы можем программно «подключиться» к существующему менеджеру временных таблиц. Разберем, как это сделать прямо в окне вычисления выражений.
Предположим, у нас есть объект МВТ (Менеджер Временных Таблиц), в котором должна лежать таблица с именем ВТ_Данные. Напишем и вычислим следующее выражение:
НовыйЗапрос = Новый Запрос("ВЫБРАТЬ * ИЗ ВТ_Данные");
НовыйЗапрос.МенеджерВременныхТаблиц = МВТ;
Результат = НовыйЗапрос.Выполнить().Выгрузить();
После вычисления переменная Результат будет содержать ТаблицаЗначений. Хотя на сервере мы не можем её визуализировать через Выбрать(), мы можем просмотреть её структуру и количество строк в окне отладки, или использовать приемы сериализации, описанные ниже.
Когда данных в таблице много, смотреть их через дерево свойств в отладчике неудобно. Выясним, как быстро преобразовать данные в текстовый вид, который можно скопировать в любой текстовый редактор (Notepad++, VS Code) и проанализировать.
Рассмотрим пример использования СериализаторXDTO для получения XML-представления таблицы:
ТЗ = Запрос.МенеджерВременныхТаблиц.Таблицы[0].ПолучитьДанные().Выгрузить();
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();
СериализаторXDTO.ЗаписатьXML(ЗаписьXML, ТЗ);
РезультатСтрокой = ЗаписьXML.Закрыть();
Полученную переменную РезультатСтрокой можно скопировать из отладчика. Если таблица очень большая, и отладчик обрезает строку, можно воспользоваться методом ЗаписьJSON, так как JSON обычно компактнее XML.
Если вы ведете разработку в современных типовых конфигурациях (например, УТ 11, ERP 2, КА 2), разработчики фирмы 1С уже предусмотрели вспомогательные инструменты. В общем модуле ОбщегоНазначения (или специализированных модулях отладки) часто присутствуют экспортные функции для вывода таблиц.
Например, проанализируем функцию ПоказатьВременнуюТаблицу. В окне вычисления выражений вы можете написать:
ОбщегоНазначенияУТ.ПоказатьВременнуюТаблицу(МенеджерВТ, "ИмяВременнойТаблицы")
Такие функции обычно возвращают ТаблицуЗначений, подготовленную к просмотру, или даже могут записывать данные во временный файл на сервере для последующего анализа.
В ситуациях, когда отладка на сервере затруднена (например, из-за таймаутов или особенностей серверного окружения), мы можем применить метод «логирования». Разберем пример кода, который можно временно вставить в процедуру:
ТекстЗапроса = "ВЫБРАТЬ * ИЗ ВТ_Данные";
ЗапросОтладки = Новый Запрос(ТекстЗапроса);
ЗапросОтладки.МенеджерВременныхТаблиц = МВТ;
ТаблицаДляАнализа = ЗапросОтладки.Выполнить().Выгрузить();
// Запись в файл на сервере
ТаблицаДляАнализа.Записать("C:\Debug\vt_dump.txt");
// Или запись количества строк в Журнал регистрации для быстрой проверки
ЗаписьЖурналаРегистрации("ОтладкаВТ", УровеньЖурналаРегистрации.Примечание, , , "Строк в ВТ_Данные: " + ТаблицаДляАнализа.Количество());
Использование метода Записать() для таблицы значений создаст файл во внутреннем формате 1С, который потом можно открыть в любом приложении 1С через Файл -> Открыть и увидеть полноценную таблицу с данными.
При работе с временными таблицами на сервере следует помнить о нескольких критических моментах:
МенеджераВременныхТаблиц, в котором она была создана. Если вы создали таблицу в одном запросе без назначения менеджера, она удалится сразу после завершения выполнения запроса.ПОМЕСТИТЬ). Если поставить точку останова перед Запрос.Выполнить(), таблицы в менеджере еще не будет.УНИЧТОЖИТЬ. Если точка останова стоит после такой команды, данные будут потеряны.ВЫБРАТЬ ПЕРВЫЕ 100).Таким образом, мы рассмотрели основные инструменты для «визуализации» невидимых на сервере данных. Комбинируя стандартные возможности платформы и простые приемы сериализации, можно значительно ускорить поиск ошибок в сложных алгоритмах запросов.