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