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