Как получить реквизиты регистра накопления при использовании виртуальных таблиц в СКД?

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

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

Понимание архитектуры виртуальных таблиц

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

Способ №1: Использование параметров виртуальной таблицы

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

  1. Откройте конструктор запроса в наборе данных СКД.
  2. Перейдите на вкладку Виртуальные таблицы.
  3. Для выбранной таблицы укажите параметры, такие как ПериодНачало, ПериодКонец и, если необходимо, Периодичность.
  4. Установите значение параметра Авто, чтобы платформа самостоятельно определила оптимальный способ получения данных в зависимости от условий отчета.

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

Способ №2: Связь наборов данных в СКД

Это самый профессиональный и гибкий метод. Если вам критически важно вывести реквизиты, вам необходимо использовать механизм Связи наборов данных в СКД. Рассмотрим этот процесс пошагово:

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

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

Пример логики запроса к физической таблице

Чтобы получить данные из физической таблицы в качестве второго набора, используйте конструкцию вида:


ВЫБРАТЬ
    РегистрНакопления.ОстаткиТоваров.Регистратор КАК Регистратор,
    РегистрНакопления.ОстаткиТоваров.ДополнительныйРеквизит КАК Реквизит
ИЗ
    РегистрНакопления.ОстаткиТоваров КАК РегистрНакопления

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

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

← На главную