Почему в СКД не выбирается поле Регистратор из виртуальной таблицы ОстаткиИОбороты?

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

При разработке отчетов на базе схемы компоновки данных (СКД) разработчики нередко сталкиваются с ситуацией: в конструкторе запроса при обращении к виртуальной таблице ОстаткиИОбороты регистра накопления поле Регистратор отсутствует в списке доступных полей, а при ручном добавлении текста запроса возникает ошибка о том, что поле не найдено. Разберем, почему платформа ведет себя именно так и как правильно настроить параметры виртуальной таблицы для получения детализации по документам-регистраторам.

Причина поведения платформы

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

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

Пошаговое решение проблемы в конструкторе запроса

Рассмотрим порядок действий для корректного добавления регистратора в запрос СКД:

  1. Откроем схему компоновки данных и перейдем на вкладку Наборы данных.
  2. В окне редактирования запроса нажмем кнопку Конструктор запроса.
  3. На вкладке Таблицы и поля выберем нужную виртуальную таблицу (например, РегистрНакопления.УчетПоПартиям.ОстаткиИОбороты).
  4. Нажмем кнопку Параметры виртуальной таблицы (кнопка расположена над центральным списком выбранных таблиц).
  5. В открывшемся окне найдем параметр Периодичность и выберем значение Авто или Регистратор.
  6. Нажмем ОК. После изменения параметра в левом списке доступных полей таблицы появятся поля Регистратор, ПериодСекунда, ПериодДень и другие периоды.
  7. Перенесем поле Регистратор в список выбранных полей запроса.

Примеры текста запроса

Посмотрим на пример ошибочного запроса, в котором параметр периодичности пропущен:


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

Если в такой запрос вручную дописать УчетПоПартиямОстаткиИОбороты.Регистратор, конструктор выдаст ошибку: Поле не найдено "УчетПоПартиямОстаткиИОбороты.Регистратор".

Теперь разберем правильный вариант с указанием периодичности Авто:


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

Особенности использования периодичности «Авто» в СКД

В схеме компоновки данных рекомендуется указывать именно периодичность Авто, а не фиксированный Регистратор. Проанализируем, почему это важно:

  1. Динамическая оптимизация: При значении Авто компоновщик макета СКД анализирует структуру отчета, сформированную пользователем в пользовательских настройках. Если в группировках или колонках отчета поле Регистратор не выведено, платформа автоматически исключит детализацию до документов и не будет выполнять ресурсоемкий расчет остатка на каждый документ.
  2. Роли полей: На вкладке Наборы данных в колонке Роль для поля Регистратор автоматически проставляется признак периода с указанием порядка и типа. СКД корректно связывает регистратор с датой документа и номером строки для соблюдения хронологии движений.

Рекомендации по производительности

Получение остатков на каждый документ через виртуальную таблицу ОстаткиИОбороты с детализацией до регистратора создает существенную нагрузку на СУБД. При проектировании отчетов обратим внимание на следующие альтернативы:

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