Как заставить конструктор запросов в расширении 1С видеть метаданные основной конфигурации?

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

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

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

Выясняем причину: почему конструктор запросов «слепнет»?

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

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

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

Решение 1. Официальный механизм в платформе (начиная с версии 8.3.23)

Если вы работаете на современных релизах платформы (начиная с версии 8.3.23 и выше), фирма «1С» наконец-то устранила это неудобство на уровне ядра. Разработчикам больше не нужно использовать обходные пути.

Разберем по шагам, как устроен новый механизм:

  1. Откройте модуль расширения (например, общий модуль или модуль объекта) и вызовите Конструктор запроса.
  2. Обратите внимание на панель инструментов конструктора. В версии 8.3.23 там появилась специальная кнопка-переключатель — «Отображать таблицы и поля расширяемой конфигурации».
  3. При активации этой кнопки в левой панели (в дереве доступных таблиц) отобразятся абсолютно все объекты основной конфигурации, даже если они не были заимствованы в ваше расширение.
  4. Составьте необходимый вам запрос, связывая таблицы основной конфигурации и новые таблицы из расширения.
  5. Нажмите кнопку «ОК» для завершения работы с конструктором.
  6. В этот момент платформа автоматически проанализирует текст созданного запроса. На экране появится диалоговое окно с вопросом: «Добавить используемые объекты в расширение?».
  7. Нажмите «Да», и система автоматически перенесет (заимствует) все используемые в запросе таблицы и их реквизиты в ваше расширение. Это полностью исключает рутину по самостоятельному поиску и добавлению каждого отдельного поля.

Решение 2. Обходной путь через внешние обработки (для платформ ниже 8.3.23)

Если ваш проект привязан к более старой версии платформы или работает в режиме совместимости, не позволяющем использовать новые функции, лучшим решением будет составление запроса во «внешней среде».

Рассмотрим подробнее данный алгоритм:

  1. В главном меню конфигуратора выберите пункт Файл — Новый — Внешняя обработка. Важно создавать её в контексте основной конфигурации, а не расширения.
  2. В созданной обработке перейдите на вкладку «Модуль объекта» или создайте временную форму и откройте ее модуль.
  3. Нажмите правой кнопкой мыши внутри модуля и выберите «Конструктор запроса...».
  4. Поскольку внешняя обработка создается в контексте основной конфигурации, конструктор увидит абсолютно все метаданные вашей информационной базы.
  5. Спроектируйте необходимый вам запрос любой сложности (используя связи, временные таблицы, виртуальные таблицы регистров).
  6. Нажмите «ОК». Платформа сгенерирует готовый текст запроса в модуле внешней обработки. Например, вы получите следующий код:

Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	ПродажиОбороты.Номенклатура КАК Номенклатура,
    |	ПродажиОбороты.КоличествоОборот КАК Количество,
    |	ПродажиОбороты.СуммаОборот КАК Сумма
    |ИЗ
    |	РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, Авто, ) КАК ПродажиОбороты";
  1. Выделите и скопируйте полученный текст запроса.
  2. Перейдите в ваш модуль расширения и вставьте скопированный код туда.

Важное примечание: Если в дальнейшем вы попытаетесь открыть конструктор запроса непосредственно внутри расширения на этом фрагменте кода, платформа выдаст предупреждение о том, что некоторые таблицы ей неизвестны. Игнорируйте это предупреждение. Сам код в режиме 1С:Предприятие выполнится абсолютно корректно и без ошибок.

Решение 3. Вызов конструктора через шаблоны текста

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

Выполните следующие действия:

  1. В модуле расширения напишите специальную конструкцию автоподстановки шаблона запроса: <?"ТекстЗапроса", Запрос>.
  2. Выделите эту строку и нажмите комбинацию клавиш Ctrl + Shift + T (или выберите соответствующий пункт в контекстном меню для вызова шаблонов).
  3. Платформа распознает системный шаблон и запустит глобальный конструктор запросов, который инициализируется в контексте всей базы данных, а не изолированного расширения.
  4. После настройки запроса нажмите кнопку «ОК», и сгенерированный текст автоматически подставится вместо вашей временной конструкции.

Решение 4. Использование консоли запросов в режиме «Предприятие»

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

Для разработки сложных запросов рекомендуем использовать следующий подход:

  1. Запустите базу данных в режиме «1С:Предприятие».
  2. Откройте любую универсальную Консоль запросов (ее можно скачать на ИТС или использовать встроенную в инструменты разработчика).
  3. В консоли запросов вам будут доступны как типовые справочники и документы, так и новые реквизиты, добавленные вами через расширение.
  4. Напишите, отладьте и протестируйте запрос на реальных данных, убедившись в его высокой производительности.
  5. Скопируйте готовый SQL-подобный текст и перенесите его в конфигуратор расширения.

Проблема отсутствия стандартных реквизитов (СКД)

Иногда разработчики сталкиваются с тем, что даже после заимствования некоторых объектов (например, планов счетов, планов видов характеристик или регистров) в расширении все равно остаются невидимыми их важные стандартные реквизиты (такие как Забалансовый, Вид у счетов или Активность у записей регистра).

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

Подведем итоги

Мы рассмотрели особенности работы конструктора запросов при использовании расширений. Подводя итог, дадим несколько рекомендаций:

← На главную