При переходе с конфигурации «1С:Бухгалтерия предприятия» редакции 2.0 на редакцию 3.0 разработчики часто сталкиваются с тем, что внешние отчеты и выборки, использующие свойства номенклатуры или контрагентов, перестают возвращать данные или вызывают ошибки. Разберем, как изменилась архитектура хранения дополнительных свойств объектов в конфигурациях на базе Библиотеки стандартных подсистем (БСП) и как правильно переписать запросы и схемы компоновки данных (СКД).
Проанализируем, как была устроена подсистема свойств в более ранних редакциях («1С:Предприятие 8.1» и «8.2»):
ЗначенияСвойствОбъектов.СвойстваОбъектов.СоставКатегорийОбъектов.В конфигурациях нового поколения на управляемых формах (БП 3.0, УТ 11, ERP 2, КА 2) подсистема свойств была унифицирована по стандартам БСП. Единый механизм был разделен на две независимые концепции, а план видов характеристик получил имя ДополнительныеРеквизитыИСведения:
Номенклатура или Контрагенты). Они хранятся непосредственно в объекте — в его табличной части ДополнительныеРеквизиты. При изменении такого свойства перезаписывается и версионируется сам объект.ДополнительныеСведения.Выясним причину неработоспособности запросов: если в старом коде обращение шло напрямую к регистру сведений РегистрСведений.ЗначенияСвойствОбъектов, такой запрос в БП 3.0 завершится ошибкой отсутствия метаданных.
Рассмотрим, как изменить текст запроса в зависимости от того, как именно создано пользовательское свойство.
Вариант А: Свойство является дополнительным реквизитом
Если свойство хранится в табличной части объекта, выполняем левое соединение с этой табличной частью:
ВЫБРАТЬ
Номенклатура.Ссылка КАК Номенклатура,
Номенклатура.Артикул КАК Артикул,
ДопРеквизиты.Значение КАК ЗначениеСвойства
ИЗ
Справочник.Номенклатура КАК Номенклатура
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура.ДополнительныеРеквизиты КАК ДопРеквизиты
ПО ДопРеквизиты.Ссылка = Номенклатура.Ссылка
И ДопРеквизиты.Свойство = &НужноеСвойство
Вариант Б: Свойство является дополнительным сведением
Если свойство создано как дополнительное сведение, связываем выборку с новым регистром сведений ДополнительныеСведения:
ВЫБРАТЬ
Контрагенты.Ссылка КАК Контрагент,
Контрагенты.ИНН КАК ИНН,
ДопСведения.Значение КАК ЗначениеСведения
ИЗ
Справочник.Контрагенты КАК Контрагенты
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДополнительныеСведения КАК ДопСведения
ПО ДопСведения.Объект = Контрагенты.Ссылка
И ДопСведения.Свойство = &НужноеСвойство
Чтобы отчеты оставались универсальными и пользователи могли гибко выбирать свойства в пользовательских настройках, группировках и отборах без жесткого кодирования запроса, настроим механизм «Характеристики» в схеме компоновки данных.
Разберем по шагам, как описать характеристики в наборе данных СКД:
ХАРАКТЕРИСТИКИ непосредственно в текст запроса).СправочникСсылка.НоменклатураПланВидовХарактеристик.ДополнительныеРеквизитыИСведенияСправочник.Номенклатура.ДополнительныеРеквизитыСсылкаСвойствоЗначениеРегистрСведений.ДополнительныеСведения (где полем объекта выступает измерение Объект).При таком подходе СКД автоматически сгенерирует виртуальные реквизиты, и пользователь сможет обращаться к ним через точку в пользовательском режиме (например, Номенклатура.[Цвет] или Контрагент.[Категория надежности]).
Если требуется получать или записывать свойства в программном коде модулей, рекомендуется избегать прямого чтения табличных частей и регистров. Используем стандартизированные методы общих модулей подсистемы БСП УправлениеСвойствами и УправлениеСвойствамиСервер.
Посмотрим на пример получения значения свойства с помощью штатного API:
// Получение значения дополнительного реквизита или сведения
ЗначениеСвойства = УправлениеСвойствами.ЗначениеСвойства(СсылкаНаОбъект, СсылкаНаСвойство);
Использование официального API БСП гарантирует стабильность работы доработок при последующих обновлениях типовой конфигурации.
Проанализируем особенности производительности при работе со свойствами:
ДополнительныеРеквизиты на больших объемах данных (сотни тысяч элементов) выполняются медленнее, чем по штатным реквизитам шапки, так как в СУБД табличная часть хранится в отдельной физической таблице и не имеет специализированных индексов под каждое конкретное свойство.