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

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

Часто в практике разработчика 1С встречается ситуация: вы открываете модуль документа, например, ЗаказКлиента, ставите точку останова в процедуре ПриСозданииНаСервере и видите в отладчике реквизит, которого нет в дереве метаданных основной конфигурации. Это означает, что данный объект был добавлен через расширение. Однако при попытке написать запрос к этому реквизиту с помощью стандартного конструктора, поле просто отсутствует в списке доступных. Разберем детально, почему так происходит и как правильно обращаться к таким данным.

Почему Конструктор запросов не видит реквизиты расширения

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

Для того чтобы Конструктор запросов увидел добавленные поля, необходимо соблюсти одно из условий:

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

Ручное написание запросов и поведение системы

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


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	ЗаказКлиента.Ссылка КАК Ссылка,
    |	ЗаказКлиента.ДополнительныйСтатус КАК ДополнительныйСтатус
    |ИЗ
    |	Документ.ЗаказКлиента КАК ЗаказКлиента";

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

Метод динамического формирования текста запроса

Чтобы избежать визуальных ошибок в конфигураторе и сделать код более гибким (например, на случай, если расширение будет отключено), профессиональным подходом считается использование функций подстановки строк, таких как СтрШаблон или СтрЗаменить. Проанализируем пример кода, который часто встречается в типовых конфигурациях (ERP, УТ 11):


ТекстЗапроса = 
    "ВЫБРАТЬ
    |	ЗаказКлиента.Ссылка КАК Ссылка,
    |	%1 КАК ДопПоле
    |ИЗ
    |	Документ.ЗаказКлиента КАК ЗаказКлиента";

// Проверяем наличие реквизита в метаданных программно
Если Метаданные.Документы.ЗаказКлиента.Реквизиты.Найти("ДополнительныйСтатус") <> Неопределено Тогда
    ПолеИзРасширения = "ЗаказКлиента.ДополнительныйСтатус";
Иначе
    ПолеИзРасширения = "ЗНАЧЕНИЕ(Перечисление.Статусы.ПустаяСсылка)";
КонецЕсли;

Запрос = Новый Запрос(СтрШаблон(ТекстЗапроса, ПолеИзРасширения));

Этот метод позволяет конструктору запросов корректно открывать текст (так как вместо конкретного поля там стоит параметр-заполнитель), а также защищает систему от фатальных ошибок при отсутствии расширения.

Использование консоли запросов в режиме Предприятие

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

Технические нюансы: Хранение данных в СУБД

Важно понимать, как расширения влияют на производительность. В современных версиях платформы 1С:Предприятие 8.3 реквизиты, добавленные через расширение, при включенном свойстве «Используются собственные данные», физически добавляются в ту же таблицу СУБД, что и основные реквизиты. Это означает, что при выполнении запроса не происходит дополнительных соединений (JOIN) с другими таблицами, и выборка данных из расширений происходит так же быстро, как и из основной конфигурации.

Рекомендации по работе

Подведем итог и определим порядок действий при работе с «невидимыми» реквизитами:

  1. Убедитесь в наличии расширения: Проверьте дерево расширений в конфигураторе. Найдите нужный объект и убедитесь, что реквизит добавлен именно там.
  2. Пишите запрос вручную: Если работаете в модуле основной конфигурации, не полагайтесь на конструктор. Пишите текст запроса руками, игнорируя предупреждения синтаксической проверки (если вы уверены в имени поля).
  3. Используйте внешние обработки: Для создания отчетов или обработок, использующих данные расширений, создавайте их как внешние файлы и запускайте в «Предприятии». Для разовой миграции объектов между базами с различающимся набором полей применяется перенос данных между похожими конфигурациями 1С.
  4. Проверяйте свойства расширения: У расширения должно быть активно свойство «Используются собственные данные», иначе созданные реквизиты не будут сохраняться в базе данных.

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

← На главную