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