Как заставить конструктор запросов видеть новые объекты из расширения конфигурации?

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

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

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

Выясняем причину: почему Конфигуратор «слеп» к объектам расширения?

Чтобы понять суть проблемы, проанализируем, как Конфигуратор работает с контекстами данных. В процессе разработки контексты основной конфигурации и расширения изолированы друг от друга:

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

Если мы создаем, например, новый РегистрСведений.НашиНовыеДанные прямо в расширении, а затем пытаемся обратиться к нему через конструктор запросов в схеме компоновки данных (СКД) или в модуле внешней обработки, система выдаст ошибку или просто не покажет таблицу в списке доступных. Это происходит из-за того, что в момент проектирования в Конфигураторе единое пространство имен еще не сформировано.

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

Решение 1. Использование консоли запросов в пользовательском режиме (классический обходной путь)

Самый быстрый и надежный способ обойти ограничения старых версий платформы — перенести процесс проектирования запроса в режим «1С:Предприятие». Разберем этот процесс по шагам:

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

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

Решение 2. Современные возможности платформы (начиная с версии 8.3.23)

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

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

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

Решение 3. Проверка свойства «Назначение» расширения

Иногда даже в пользовательском режиме консоль запросов не видит добавленные объекты. Проанализируем причину этого поведения. Она кроется в настройках самого расширения, а именно в свойстве «Назначение»:

Решение 4. Программная установка текста запроса (для СКД и динамических списков)

Если нам необходимо использовать новый объект расширения в динамическом списке или схеме компоновки данных (СКД), но Конфигуратор упорно выдает ошибки при сохранении формы или схемы, мы можем прибегнуть к программной установке запроса.

Посмотрим на пример обхода ограничения в динамическом списке формы. Вместо настройки запроса в свойствах элемента в Конфигураторе, мы инициализируем его программно при создании формы на сервере:


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

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

Решение 5. Нюанс с заимствованными стандартными реквизитами

Бывает ситуация, когда сам справочник или документ из основной конфигурации мы заимствовали, но конструктор запросов внутри расширения не показывает его стандартные реквизиты (например, ЭтоГруппа, Владелец или Родитель).

Для исправления этой проблемы разберем простое правило контроля свойств:

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

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

← На главную