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

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

При анализе сложных типовых механизмов (например, модулей отражения в регламентированном учете в КА 2.4 или ERP) разработчики часто сталкиваются с ситуацией, когда в запрос передается готовый МенеджерВременныхТаблиц. Внутри такого запроса таблицы могут называться совсем не так, как они выглядят в списке таблиц менеджера. Разберем подробно, почему так происходит, как в этом разобраться и какие инструменты использовать для эффективной отладки.

Причина несоответствия имен и псевдонимов

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

ВЫБРАТЬ * ИЗ ВТ_ДанныеДокументов КАК ДанныеДокументов

В данном примере ВТ_ДанныеДокументов — это реальное имя временной таблицы, которая была создана ранее и помещена в МенеджерВременныхТаблиц. А ДанныеДокументов — это локальный псевдоним, который действует только внутри текущего запроса. Выясним причину, почему это сбивает с толку в конструкторе запросов: стандартный конструктор 1С в списке доступных таблиц показывает исходные имена временных таблиц, но в схеме запроса и на закладке "Связи" использует псевдонимы. Если псевдоним сильно отличается от имени (например, разработчик использовал сокращение ХЗ для таблицы Хозрасчетный), визуальная связь теряется.

Ограничения стандартного конструктора запросов

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

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

Методика ручного сопоставления через текст запроса

Если конструктор не дает четкого ответа, разберем самый надежный способ — анализ текста запроса. Нам нужно найти секцию ИЗ (FROM). Рассмотрим пример:


Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = ВременныеТаблицы; // Здесь лежат таблицы "ВТ_Товары" и "ВТ_Склады"
Запрос.Текст = "ВЫБРАТЬ
               |    Т.Номенклатура,
               |    С.Склад
               |ИЗ
               |    ВТ_Товары КАК Т
               |ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Склады КАК С ПО Т.Склад = С.Ссылка";

Здесь Т и С — краткие псевдонимы. Чтобы понять, что скрывается за Т, мы просто смотрим, что написано перед ключевым словом КАК. В больших запросах типовых конфигураций (например, при формировании проводок) таких соединений может быть более двадцати. В таких случаях рекомендуем использовать поиск (Ctrl+F) по тексту запроса, чтобы быстро найти точку объявления псевдонима.

Программный анализ Менеджера временных таблиц

Выясним, как посмотреть реальное содержимое менеджера в процессе отладки. Объект МенеджерВременныхТаблиц имеет коллекцию Таблицы. Мы можем проанализировать их программно:


Для Каждого Таблица Из Запрос.МенеджерВременныхТаблиц.Таблицы Цикл
    Сообщить("В менеджере есть таблица: " + Таблица.Имя);
    // Можно даже выгрузить структуру:
    // ТЗ = Таблица.ПолучитьСхему().Выгрузить();
КонецЦикла;

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

Использование инструментов разработчика (ИР)

Проанализируем более эффективный подход. Опытные разработчики часто отказываются от стандартного конструктора в пользу консолей запросов из состава "Инструментов разработчика" (ИР). Посмотрим, какие преимущества это дает:

Рекомендации по работе в сложных модулях (КА 2 / ERP)

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

  1. Найти инициализацию менеджера. Выясним, где заполняется переменная, которая передается в Запрос.МенеджерВременныхТаблиц. Обычно это происходит в нескольких функциях-предшественниках.
  2. Индексация. Обратите внимание, что если в исходных запросах, наполнявших менеджер, не было инструкции ИНДЕКСИРОВАТЬ ПО, то в вашем текущем запросе соединения по этим полям будут медленными. Псевдонимы никак не влияют на индексы — индексы "привязаны" к именам в менеджере.
  3. Уникальность имен. Помните, что в рамках одного менеджера не может быть двух таблиц с одинаковым именем, но в разных запросах, использующих этот менеджер, у одной и той же таблицы могут быть разные псевдонимы.

Таким образом, для понимания структуры запроса в 1С 8.3 нам необходимо всегда разделять физическое имя таблицы в памяти (хранится в менеджере) и виртуальный псевдоним (определяется в тексте после слова "КАК"). Стандартный конструктор — это лишь визуализатор текста, и если текст сложный, самым надежным способом остается внимательное чтение секции ИЗ или использование продвинутых консолей запросов.

← На главную