Каждый разработчик, начинающий активно работать с расширениями в платформе «1С:Предприятие 8», неизбежно сталкивается с неприятной особенностью: при попытке открыть конструктор запроса в модуле расширения дерево доступных таблиц оказывается практически пустым. В нем отображаются только те объекты, которые были созданы непосредственно в самом расширении или принудительно в него заимствованы.
В этой статье мы подробно разберем, почему возникает такое поведение системы, рассмотрим штатные инструменты решения проблемы в современных версиях платформы, а также изучим проверенные временем лайфхаки для работы на старых релизах.
Для начала проанализируем ситуацию с точки зрения архитектуры платформы. Расширение конфигурации задумывалось как изолированный программный слой, который должен обладать определенной степенью автономности. Когда вы работаете внутри конфигуратора в контексте расширения, система изолирует метаданные основной конфигурации от метаданных расширения.
Конструктор запроса анализирует только те схемы данных, которые объявлены «видимыми» для текущего контекста. Если объект основной конфигурации (например, справочник Номенклатура или документ РеализацияТоваровУслуг) не был заимствован в расширение, конструктор запроса считает, что этого объекта в вашей рабочей области не существует. При этом в самом коде расширения обращаться к этим таблицам можно без проблем — на этапе выполнения (в режиме 1С:Предприятие) платформе доступно объединенное пространство метаданных, и запрос отработает корректно.
Давайте подробно рассмотрим, как решить эту проблему в зависимости от версии платформы, на которой ведется разработка.
Если вы работаете на современных релизах платформы (начиная с версии 8.3.23 и выше), фирма «1С» наконец-то устранила это неудобство на уровне ядра. Разработчикам больше не нужно использовать обходные пути.
Разберем по шагам, как устроен новый механизм:
Если ваш проект привязан к более старой версии платформы или работает в режиме совместимости, не позволяющем использовать новые функции, лучшим решением будет составление запроса во «внешней среде».
Рассмотрим подробнее данный алгоритм:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПродажиОбороты.Номенклатура КАК Номенклатура,
| ПродажиОбороты.КоличествоОборот КАК Количество,
| ПродажиОбороты.СуммаОборот КАК Сумма
|ИЗ
| РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, Авто, ) КАК ПродажиОбороты";
Важное примечание: Если в дальнейшем вы попытаетесь открыть конструктор запроса непосредственно внутри расширения на этом фрагменте кода, платформа выдаст предупреждение о том, что некоторые таблицы ей неизвестны. Игнорируйте это предупреждение. Сам код в режиме 1С:Предприятие выполнится абсолютно корректно и без ошибок.
Существует еще один изящный способ вызвать полнофункциональный конструктор прямо внутри модуля расширения, минуя ограничения изоляции. Для этого мы можем воспользоваться механизмом быстрых шаблонов конфигуратора.
Выполните следующие действия:
<?"ТекстЗапроса", Запрос>.Когда вы запускаете сеанс пользователя, платформа компилирует финальную структуру метаданных, объединяя основную конфигурацию и все активные расширения. Поэтому в пользовательском режиме никаких барьеров видимости нет.
Для разработки сложных запросов рекомендуем использовать следующий подход:
Иногда разработчики сталкиваются с тем, что даже после заимствования некоторых объектов (например, планов счетов, планов видов характеристик или регистров) в расширении все равно остаются невидимыми их важные стандартные реквизиты (такие как Забалансовый, Вид у счетов или Активность у записей регистра).
Если вы работаете на старой платформе, решить это можно следующим приемом: временно заимствуйте в расширение стандартную форму записи этого регистра или форму элемента плана счетов. Это принудительно заставит платформу подтянуть все связанные стандартные свойства и реквизиты объекта в пространство видимости расширения, после чего они появятся и в конструкторе запросов.
Мы рассмотрели особенности работы конструктора запросов при использовании расширений. Подводя итог, дадим несколько рекомендаций: