При анализе сложных типовых механизмов (например, модулей отражения в регламентированном учете в КА 2.4 или ERP) разработчики часто сталкиваются с ситуацией, когда в запрос передается готовый МенеджерВременныхТаблиц. Внутри такого запроса таблицы могут называться совсем не так, как они выглядят в списке таблиц менеджера. Разберем подробно, почему так происходит, как в этом разобраться и какие инструменты использовать для эффективной отладки.
Первое, что нам необходимо усвоить: в языке запросов 1С существует различие между именем объекта (таблицы) и его псевдонимом. Проанализируем типичную строку кода:
ВЫБРАТЬ * ИЗ ВТ_ДанныеДокументов КАК ДанныеДокументов
В данном примере ВТ_ДанныеДокументов — это реальное имя временной таблицы, которая была создана ранее и помещена в МенеджерВременныхТаблиц. А ДанныеДокументов — это локальный псевдоним, который действует только внутри текущего запроса. Выясним причину, почему это сбивает с толку в конструкторе запросов: стандартный конструктор 1С в списке доступных таблиц показывает исходные имена временных таблиц, но в схеме запроса и на закладке "Связи" использует псевдонимы. Если псевдоним сильно отличается от имени (например, разработчик использовал сокращение ХЗ для таблицы Хозрасчетный), визуальная связь теряется.
Рассмотрим, как ведет себя стандартный конструктор. Когда мы открываем запрос, в который программно передается внешний МенеджерВременныхТаблиц, конструктор часто не может "подтянуть" структуру этих таблиц автоматически, если они не описаны в самом тексте пакета запроса. Посмотрим на важные нюансы:
Если конструктор не дает четкого ответа, разберем самый надежный способ — анализ текста запроса. Нам нужно найти секцию ИЗ (FROM). Рассмотрим пример:
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = ВременныеТаблицы; // Здесь лежат таблицы "ВТ_Товары" и "ВТ_Склады"
Запрос.Текст = "ВЫБРАТЬ
| Т.Номенклатура,
| С.Склад
|ИЗ
| ВТ_Товары КАК Т
|ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Склады КАК С ПО Т.Склад = С.Ссылка";
Здесь Т и С — краткие псевдонимы. Чтобы понять, что скрывается за Т, мы просто смотрим, что написано перед ключевым словом КАК. В больших запросах типовых конфигураций (например, при формировании проводок) таких соединений может быть более двадцати. В таких случаях рекомендуем использовать поиск (Ctrl+F) по тексту запроса, чтобы быстро найти точку объявления псевдонима.
Выясним, как посмотреть реальное содержимое менеджера в процессе отладки. Объект МенеджерВременныхТаблиц имеет коллекцию Таблицы. Мы можем проанализировать их программно:
Для Каждого Таблица Из Запрос.МенеджерВременныхТаблиц.Таблицы Цикл
Сообщить("В менеджере есть таблица: " + Таблица.Имя);
// Можно даже выгрузить структуру:
// ТЗ = Таблица.ПолучитьСхему().Выгрузить();
КонецЦикла;
Это помогает сопоставить список имен, которые вы видите в конструкторе (в левой колонке "База данных"), с тем, что фактически доступно в коде. Если вы используете функцию ПоказатьВременнуюТаблицу (популярный прием в среде 1С), вы сможете увидеть не только структуру, но и реальные данные, которые в данный момент передаются в запрос.
Проанализируем более эффективный подход. Опытные разработчики часто отказываются от стандартного конструктора в пользу консолей запросов из состава "Инструментов разработчика" (ИР). Посмотрим, какие преимущества это дает:
Когда мы работаем с модулями типа РеглУчетВыборкиСервер, мы сталкиваемся с многослойной архитектурой. Чтобы не запутаться, рекомендуем следующий алгоритм:
Запрос.МенеджерВременныхТаблиц. Обычно это происходит в нескольких функциях-предшественниках.ИНДЕКСИРОВАТЬ ПО, то в вашем текущем запросе соединения по этим полям будут медленными. Псевдонимы никак не влияют на индексы — индексы "привязаны" к именам в менеджере.Таким образом, для понимания структуры запроса в 1С 8.3 нам необходимо всегда разделять физическое имя таблицы в памяти (хранится в менеджере) и виртуальный псевдоним (определяется в тексте после слова "КАК"). Стандартный конструктор — это лишь визуализатор текста, и если текст сложный, самым надежным способом остается внимательное чтение секции ИЗ или использование продвинутых консолей запросов.