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