Почему в конструкторе запроса в расширении не отображается нужный вид документа в виртуальной таблице?

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

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

Разберем подробно причины этого поведения и пошагово рассмотрим способы решения данной проблемы, чтобы ваша работа с расширениями стала предсказуемой и эффективной.

Причина 1. Режим отображения объектов основной конфигурации

Первым делом проанализируем настройки самого конструктора запроса в контексте расширения. Платформа 1С разделяет объекты, которые физически находятся в расширении (собственные или заимствованные), и объекты основной конфигурации, которые в расширение еще не добавлены.

В окне конструктора запроса существует специальный механизм фильтрации метаданных. Рассмотрим, как это работает:

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

Для решения этой проблемы попробуем переключить режим отображения, чтобы конструктор «увидел» метаданные основной базы. Однако помните, что простое отображение в конструкторе не всегда гарантирует корректную работу обращения «через точку» в расширении без заимствования типа.

Причина 2. Обязательное заимствование типов для типизации полей

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

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

Рассмотрим алгоритм действий:

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

После этого вернемся в конструктор запроса. Теперь, при развертывании поля Регистратор, нужный документ должен появиться в списке, так как связь между регистром и регистратором теперь подтверждена в пространстве имен расширения.

Причина 3. Назначение расширения и его влияние на конструктор

Проанализируем свойство расширения «Назначение» (Purpose). Это свойство определяет роль расширения и доступ к определенным инструментам разработки.

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

Причина 4. Кэш конфигуратора и версии платформы

Иногда корень проблемы кроется не в логике метаданных, а в технических сбоях кэширования. Платформа 1С хранит локальный кэш метаданных для ускорения работы конфигуратора. При интенсивной работе с расширениями (добавлении/удалении объектов) этот кэш может стать неактуальным.

Посмотрим, как очистить кэш, если конструктор продолжает «упорствовать»:

  1. Закроем Конфигуратор.
  2. Перейдем в каталог %LOCALAPPDATA%\1C\1Cv8\.
  3. Найдем папки с длинными буквенно-цифровыми именами (UID базы) и удалим их (или просто папку Config внутри них).
  4. Запустим Конфигуратор снова.

Также стоит обратить внимание на версию платформы. В версиях платформы 8.3.15–8.3.20 наблюдались задокументированные ошибки работы конструктора запросов именно внутри расширений. Если есть возможность, обновим платформу до актуального релиза. Как показывает практика (и сообщение автора темы), на «свежих» файлах платформы многие подобные «глюки» исчезают сами собой.

Практический прием: Использование внешних инструментов

Если время поджимает, а конструктор в расширении все равно не отображает нужные поля, разберем обходной путь (Workaround), который часто используют опытные разработчики:

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

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


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

Запрос = Новый Запрос(ТекстЗапроса);
Результат = Запрос.Выполнить();

Обратите внимание на использование оператора ВЫРАЗИТЬ. Это хороший тон при работе с составными типами (каким является Регистратор). Это не только помогает конструктору запроса понять тип данных, но и существенно ускоряет выполнение запроса в СУБД, так как платформа сразу обращается к конкретной таблице документа, минуя цепочку левых соединений со всеми возможными таблицами-регистраторами.

Резюме

Подводя итог, если конструктор запроса в расширении «потерял» документ:

Применяя эти шаги системно, мы сможем решить проблему и продолжить разработку качественных отчетов в ERP.

← На главную