При работе с типовыми конфигурациями «1С:Предприятие 8» (например, «Бухгалтерия предприятия 3.0») разработчики часто сталкиваются с интересной особенностью: в Оборотно-сальдовой ведомости (ОСВ) или других стандартных отчетах пользователи могут легко выбирать дополнительные реквизиты и сведения в качестве группировок, отборов или дополнительных полей. При этом, если мы откроем схему компоновки данных (СКД) этого отчета в Конфигураторе и детально изучим текст запроса, то не обнаружим там никаких упоминаний табличных частей дополнительных реквизитов или регистров сведений со свойствами.
В этой статье мы подробно разберем, как именно устроен этот механизм «под капотом» платформы 1С, как Библиотека стандартных подсистем (БСП) связывает метаданные с Системой компоновки данных и как вы можете применить это решение в своих собственных разработках.
Разберем ситуацию на классическом примере. Мы хотим построить отчет по справочнику Контрагенты или Номенклатура. У этих справочников в режиме «1С:Предприятие» пользователями созданы десятки дополнительных реквизитов (например, «Регион», «Группа надежности», «Важность клиента»).
Если бы мы решали эту задачу «в лоб» традиционными методами программирования, нам пришлось бы:
Однако в типовой ОСВ запрос выглядит абсолютно стандартно. Секрет кроется в том, что платформа «1С:Предприятие» умеет динамически расширять схему компоновки данных на лету. Для этого задействуется специальный платформенный механизм — Характеристики объектов метаданных.
Выясним, где именно в Конфигураторе настраивается эта «магия». Платформа позволяет описать правила получения дополнительных свойств непосредственно у самого объекта метаданных (справочника, документа, характеристики). Это делается один раз в свойствах самого объекта, после чего все механизмы СКД в системе начинают автоматически «видеть» эти свойства.
Чтобы найти эти настройки, выполним следующие шаги в Конфигураторе:
Контрагенты).Именно здесь прописывается связь между объектом и теми таблицами, где физически хранятся дополнительные свойства и их значения.
В конфигурациях, созданных на основе БСП (включая «Бухгалтерию предприятия 3.0»), за ведение дополнительных свойств отвечает специализированная подсистема «Свойства». Настройки характеристик в метаданных справочников выполняются по строго определенному шаблону БСП.
Рассмотрим подробнее структуру этой настройки. Платформе для работы механизма требуются два основных источника данных:
1. Источник видов характеристик (сами свойства):
В качестве этого источника выступает план видов характеристик ДополнительныеРеквизитыИСведения. Платформа обращается к нему, чтобы узнать, какие вообще свойства (характеристики) существуют для данного типа объекта в системе (например, какие дополнительные реквизиты созданы для контрагентов).
2. Источники значений характеристик:
Здесь БСП разделяет хранение на два типа:
Справочник.Контрагенты.ДополнительныеРеквизиты. Связь настраивается по ключевым полям: Ссылка (владелец), Свойство (вид характеристики) и Значение (само значение).ДополнительныеСведения. Связь настраивается аналогично, но поле объекта связывается с измерением Объект регистра.Проанализируем, как система компоновки данных решает, откуда ей брать информацию о характеристиках. У платформы существует четкая иерархия приоритетов:
{ХАРАКТЕРИСТИКИ ...} или заполнить соответствующую вкладку «Характеристики» в конструкторе СКД. В этом случае настройки из метаданных объекта будут полностью проигнорированы. Это полезно, если в конкретном отчете вам нужно переопределить стандартное поведение системы.Именно благодаря второму правилу в ОСВ все работает «из коробки». Поскольку запросы отчета выбирают счета и субконто (которые являются справочниками, например, Контрагенты или Номенклатура), СКД на лету анализирует метаданные этих справочников и добавляет их характеристики в список доступных полей отчета.
Если вы разрабатываете собственный отчет и хотите принудительно зафиксировать механизм характеристик в СКД (например, в самописной конфигурации, где нет глобальных настроек в метаданных), вы можете использовать специальное расширение языка запросов СКД.
Посмотрим на пример такого запроса:
ВЫБРАТЬ
Товары.Ссылка КАК Товар,
Товары.Код КАК Код,
Товары.Наименование КАК Наименование
ИЗ
Справочник.Номенклатура КАК Товары
{ХАРАКТЕРИСТИКИ
ТИП(Справочник.Номенклатура)
ВИДЫХАРАКТЕРИСТИК ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения
ПОЛЕКЛЮЧА Ссылка
ПОЛЕИМЕНИ Наименование
ПОЛЕТИПАЗНАЧЕНИЯ ТипЗначения
ЗНАЧЕНИЯХАРАКТЕРИСТИК Справочник.Номенклатура.ДополнительныеРеквизиты
ПОЛЕОБЪЕКТА Ссылка
ПОЛЕВИДА Свойство
ПОЛЕЗНАЧЕНИЯ Значение }
В данном примере секция {ХАРАКТЕРИСТИКИ ...} указывает СКД, что для типа Справочник.Номенклатура необходимо динамически подтягивать список свойств из указанного плана видов характеристик, а значения брать из его табличной части ДополнительныеРеквизиты.
Важно понимать, что использование динамических характеристик не проходит бесследно для производительности системы. Выясним, как платформа транслирует наши настройки в реальные SQL-запросы к базе данных.
Когда пользователь в режиме «1С:Предприятие» выбирает в ОСВ группировку по дополнительному свойству (например, по региону контрагента) или устанавливает по нему отбор, СУБД выполняет следующие действия:
LEFT JOIN) с таблицей значений характеристик (табличной частью или регистром сведений).Важный нюанс производительности: Если в отчет одновременно выводится, к примеру, 5 различных дополнительных реквизитов, платформа построит 5 отдельных последовательных левых соединений (LEFT JOIN) к одной и той же таблице значений. На больших базах данных при формировании тяжелых отчетов это может приводить к заметному снижению скорости работы. Поэтому, если какое-то свойство становится критически важным для учета и используется постоянно во всех ключевых отчетах, имеет смысл рассмотреть возможность создания реального реквизита в метаданных конфигурации вместо использования механизма дополнительных свойств БСП.
Описанный механизм характеристик в метаданных работает не только для отчетов СКД, но и для обычных динамических списков (например, в формах списков справочников или документов).
Если у динамического списка в свойствах включен флаг Автовыбор свойств (или если основная таблица запроса списка имеет настроенные характеристики в конфигураторе), пользователи могут через стандартное меню «Еще» -> «Изменить форму» выносить дополнительные свойства в виде колонок списка без какого-либо программирования. Платформа сама позаботится о связи таблиц и выводе актуальных данных на экран.