При разработке отчетов и обработок в расширениях конфигурации 1С:Предприятие 8.3, особенно для крупных систем вроде 1С:ERP Управление предприятием, программисты часто сталкиваются с тем, что конструктор запроса ведет себя не так, как в основной конфигурации. Типичная ситуация: мы добавляем виртуальную таблицу (например, Обороты регистра накопления ВыручкаИСебестоимостьПродаж), выбираем периодичность Регистратор, но при попытке развернуть поле Регистратор для получения реквизитов конкретного документа (например, РеализацияТоваровУслуг), нужный тип просто отсутствует в списке.
Разберем подробно причины этого поведения и пошагово рассмотрим способы решения данной проблемы, чтобы ваша работа с расширениями стала предсказуемой и эффективной.
Первым делом проанализируем настройки самого конструктора запроса в контексте расширения. Платформа 1С разделяет объекты, которые физически находятся в расширении (собственные или заимствованные), и объекты основной конфигурации, которые в расширение еще не добавлены.
В окне конструктора запроса существует специальный механизм фильтрации метаданных. Рассмотрим, как это работает:
Регистратор может отображаться не полностью, если типы, входящие в этот составной тип, «не знакомы» расширению.Для решения этой проблемы попробуем переключить режим отображения, чтобы конструктор «увидел» метаданные основной базы. Однако помните, что простое отображение в конструкторе не всегда гарантирует корректную работу обращения «через точку» в расширении без заимствования типа.
Выясним важную техническую особенность: как платформа 1С обрабатывает составные типы в расширениях. Поле Регистратор является составным типом, включающим в себя десятки видов документов (особенно в ERP). Когда мы работаем в расширении, платформа создает свою «карту» метаданных.
Если нам нужно не просто вывести ссылку на регистратор, а обратиться к его реквизитам в запросе (например, Регистратор.Склад), конструктор должен четко понимать, к какой именно таблице обращаться. Если вид документа РеализацияТоваровУслуг не заимствован в расширение, платформа может исключить его из доступных типов для поля Регистратор в целях оптимизации и обеспечения целостности метаданных расширения.
Рассмотрим алгоритм действий:
РеализацияТоваровУслуг).После этого вернемся в конструктор запроса. Теперь, при развертывании поля Регистратор, нужный документ должен появиться в списке, так как связь между регистром и регистратором теперь подтверждена в пространстве имен расширения.
Проанализируем свойство расширения «Назначение» (Purpose). Это свойство определяет роль расширения и доступ к определенным инструментам разработки.
Если вы столкнулись с проблемой отсутствия документов в конструкторе, проверим, не установлено ли назначение Исправление. Если это так, попробуем изменить его на Адаптация, что может мгновенно решить проблему видимости таблиц в визуальных инструментах.
Иногда корень проблемы кроется не в логике метаданных, а в технических сбоях кэширования. Платформа 1С хранит локальный кэш метаданных для ускорения работы конфигуратора. При интенсивной работе с расширениями (добавлении/удалении объектов) этот кэш может стать неактуальным.
Посмотрим, как очистить кэш, если конструктор продолжает «упорствовать»:
%LOCALAPPDATA%\1C\1Cv8\.Config внутри них).Также стоит обратить внимание на версию платформы. В версиях платформы 8.3.15–8.3.20 наблюдались задокументированные ошибки работы конструктора запросов именно внутри расширений. Если есть возможность, обновим платформу до актуального релиза. Как показывает практика (и сообщение автора темы), на «свежих» файлах платформы многие подобные «глюки» исчезают сами собой.
Если время поджимает, а конструктор в расширении все равно не отображает нужные поля, разберем обходной путь (Workaround), который часто используют опытные разработчики:
.epf).Несмотря на то, что конструктор в расширении может «ругаться» на такой текст или не отображать поля визуально, программно запрос будет успешно выполняться, если все задействованные объекты физически доступны в базе. Посмотрим на пример кода, который можно использовать для отладки такого запроса:
ТекстЗапроса =
"ВЫБРАТЬ
| ВыручкаИСебестоимостьОбороты.Регистратор КАК Регистратор,
| ВЫРАЗИТЬ(ВыручкаИСебестоимостьОбороты.Регистратор КАК Документ.РеализацияТоваровУслуг).Склад КАК Склад,
| ВыручкаИСебестоимостьОбороты.СуммаВыручкиОборот КАК Выручка
|ИЗ
| РегистрНакопления.ВыручкаИСебестоимостьПродаж.Обороты(,, Регистратор, ) КАК ВыручкаИСебестоимостьОбороты
|ГДЕ
| ВыручкаИСебестоимостьОбороты.Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг";
Запрос = Новый Запрос(ТекстЗапроса);
Результат = Запрос.Выполнить();
Обратите внимание на использование оператора ВЫРАЗИТЬ. Это хороший тон при работе с составными типами (каким является Регистратор). Это не только помогает конструктору запроса понять тип данных, но и существенно ускоряет выполнение запроса в СУБД, так как платформа сразу обращается к конкретной таблице документа, минуя цепочку левых соединений со всеми возможными таблицами-регистраторами.
Подводя итог, если конструктор запроса в расширении «потерял» документ:
Применяя эти шаги системно, мы сможем решить проблему и продолжить разработку качественных отчетов в ERP.