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

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

При разработке в 1С мы часто сталкиваемся с ситуацией, когда нужно получить данные по остаткам и оборотам из регистров накопления. Обычно это простая задача, но иногда конструктор запросов начинает вести себя странно: мы выбираем виртуальную таблицу ОстаткиИОбороты, а поля начального и конечного остатка (например, СуммаНачальныйОстаток) просто отсутствуют в дереве доступных полей. Более того, визуально ломается иерархия — измерения и сама таблица могут отображаться на одном уровне.

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

Проанализируем ситуацию: в чем суть проблемы?

На первый взгляд может показаться, что мы выбрали не ту таблицу или забыли указать параметр Периодичность (например, не установили его в значение Авто). Однако, даже после проверки всех настроек виртуальной таблицы, нужные ресурсы со словом "Остаток" не появляются.

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

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

Выясним причину такого поведения

Разберем по шагам, почему конструктор запросов внутри расширения ломает структуру виртуальной таблицы:

  1. Нехватка связанных метаданных в расширении. Чтобы конструктор запросов корректно отобразил все поля виртуальной таблицы (особенно сложной, такой как ОстаткиИОбороты), ему необходимо понимать типы данных всех измерений. Если мы заимствовали только сам регистр накопления, но не добавили в расширение справочники, документы или перечисления, которые выступают типами его измерений, конструктору не хватает данных для правильного построения дерева полей.
  2. Назначение расширения. Иногда проблема с видимостью объектов в запросах усугубляется, если у расширения установлено назначение «Дополнение», а не «Адаптация».
  3. Особенности конкретных версий платформы. Подобные недоработки (когда измерения и таблица сливаются на один уровень) массово наблюдались на режимах совместимости 8.3.12–8.3.14. В более свежих релизах часть ошибок устранили, но специфика кеширования метаданных в расширениях все равно периодически дает о себе знать.

Рассмотрим рабочие методы решения проблемы

Поскольку проблема кроется в визуальном интерфейсе Конфигуратора, мы можем обойти её несколькими способами. Рассмотрим каждый из них подробнее.

Способ 1: Использование внешних отчетов или консоли запросов (Самый надежный метод)

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

  1. Откроем Конфигуратор и создадим новый Внешний отчет (или внешнюю обработку).
  2. Запустим конструктор запросов или конструктор СКД в этом внешнем отчете. Поскольку внешний отчет работает в контексте всей основной конфигурации, он корректно подтянет все метаданные.
  3. Выберем виртуальную таблицу ОстаткиИОбороты — мы увидим, что все поля (начальные остатки, конечные остатки, обороты) на месте.
  4. Соберем нужный нам запрос визуально.
  5. Скопируем готовый текст запроса (или сохраним XML-схему СКД).
  6. Вернемся в наше расширение и просто вставим скопированный текст.

Способ 2: Ручное написание запроса

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


ВЫБРАТЬ
    ТаблицаРегистраОстаткиИОбороты.Номенклатура КАК Номенклатура,
    ТаблицаРегистраОстаткиИОбороты.КоличествоНачальныйОстаток КАК НачальныйОстаток,
    ТаблицаРегистраОстаткиИОбороты.КоличествоПриход КАК Приход,
    ТаблицаРегистраОстаткиИОбороты.КоличествоРасход КАК Расход,
    ТаблицаРегистраОстаткиИОбороты.КоличествоКонечныйОстаток КАК КонечныйОстаток
ИЗ
    РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, Авто, , ) КАК ТаблицаРегистраОстаткиИОбороты

Платформа успешно воспримет этот текст. Главное — убедитесь, что вы правильно написали системные имена полей (например, СуммаНачальныйОстаток, КоличествоКонечныйОстаток и т.д.). При сохранении модуля и запуске кода в режиме Предприятия все отработает идеально.

Способ 3: Добавление типов измерений в расширение

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

Для этого добавим в расширение все объекты, на которые ссылаются измерения нашего регистра. Проанализируем структуру регистра: если у него есть измерение Номенклатура (тип СправочникСсылка.Номенклатура) и измерение Склад (тип СправочникСсылка.Склады), нам нужно заимствовать оба этих справочника в расширение. Как только конструктор получит доступ к типам измерений и регистраторам, он сможет корректно отрисовать виртуальную таблицу со всеми ресурсами.

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

← На главную