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