Приветствуем вас, уважаемые коллеги! Сегодня мы детально разберем крайне важную архитектурную дилемму, с которой рано или поздно сталкивается любой разработчик на платформе 1С:Предприятие 8. Что выбрать: использовать типовой механизм дополнительных реквизитов и сведений, предоставляемый Библиотекой Стандартных Подсистем (БСП), или же надежнее и проще добавлять поля непосредственно в конфигураторе (либо через расширения)?
На первый взгляд кажется, что дополнительные реквизиты БСП — это идеальное решение, ведь они позволяют добавлять новые свойства объектам прямо в режиме 1С:Предприятие без изменения метаданных. Однако при реальной разработке и написании запросов программисты сталкиваются с лавинообразным ростом сложности кода и падением производительности. Давайте вместе проанализируем эту ситуацию, разберем все «за» и «против», рассмотрим влияние различных подходов на СУБД и найдем оптимальные пути решения.
Для начала выясним причину, почему автор темы на форуме жалуется на усложнение запросов. Механизм дополнительных реквизитов БСП построен на классической схеме Entity-Attribute-Value (Сущность-Атрибут-Значение). Физически в СУБД это означает следующее: значения всех дополнительных реквизитов конкретного объекта (например, справочника Номенклатура) хранятся не в отдельных колонках основной таблицы, а во вложенной табличной части ДополнительныеРеквизиты.
Представим, что нам нужно выбрать из базы данных номенклатуру и вывести три ее дополнительных реквизита: «Цвет» (булево), «Размер» (строка) и «Сезонность» (справочник). Если бы это были обычные реквизиты конфигурации, наш запрос выглядел бы предельно просто:
ВЫБРАТЬ
Номенклатура.Ссылка КАК Товар,
Номенклатура.Цвет КАК Цвет,
Номенклатура.Размер КАК Размер,
Номенклатура.Сезонность КАК Сезонность
ИЗ
Справочник.Номенклатура КАК Номенклатура
Однако для получения тех же данных через механизм БСП нам придется написать огромную «портянку» с множественными левыми соединениями к одной и той же табличной части. Посмотрим на пример такого запроса:
ВЫБРАТЬ
Номенклатура.Ссылка КАК Товар,
ДопРеквизитЦвет.Значение КАК Цвет,
ДопРеквизитРазмер.Значение КАК Размер,
ДопРеквизитСезонность.Значение КАК Сезонность
ИЗ
Справочник.Номенклатура КАК Номенклатура
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура.ДополнительныеРеквизиты КАК ДопРеквизитЦвет
ПО ДопРеквизитЦвет.Ссылка = Номенклатура.Ссылка
И ДопРеквизитЦвет.Свойство = &СвойствоЦвет
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура.ДополнительныеРеквизиты КАК ДопРеквизитРазмер
ПО ДопРеквизитРазмер.Ссылка = Номенклатура.Ссылка
И ДопРеквизитРазмер.Свойство = &СвойствоРазмер
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура.ДополнительныеРеквизиты КАК ДопРеквизитСезонность
ПО ДопРеквизитСезонность.Ссылка = Номенклатура.Ссылка
И ДопРеквизитСезонность.Свойство = &СвойствоСезонность
Как справедливо замечают участники обсуждения, если в запросе соединяются 7-10 основных таблиц базы данных, и к ним требуется пристыковать еще 5 левых соединений ради получения дополнительных реквизитов — это превращается в настоящий кошмар разработчика. Теряется читабельность кода, увеличивается вероятность ошибок, а скорость разработки падает в разы.
Помимо неудобства написания кода, существует гораздо более опасная проблема — производительность СУБД на больших массивах данных. Проанализируем, как ведут себя СУБД (MS SQL Server или PostgreSQL) при выполнении подобных запросов.
В оригинальном обсуждении на форуме авторы противопоставляют только два варианта: доп. реквизиты БСП и прямое изменение конфигурации в конфигураторе (которое усложняет последующие обновления). Однако современным и наиболее правильным стандартом разработки в экосистеме 1С является использование расширений конфигурации.
Рассмотрим преимущества добавления реквизитов через расширение:
Номенклатура.МойРеквизит) в любых запросах.Если вам все же крайне необходимо использовать именно дополнительные реквизиты БСП (например, чтобы пользователи могли сами создавать новые свойства без привлечения программиста), разработчику не обязательно вручную писать сложные левые соединения в запросах для отчетов.
На уровне платформы 1С и Системы компоновки данных (СКД) реализован мощный механизм — «Характеристики». Разберем по шагам, как его задействовать:
Номенклатура) с планом видов характеристик дополнительных реквизитов и таблицей их значений.Номенклатура.[ИмяДопРеквизита]. Платформа сама «под капотом» сгенерирует оптимальный SQL-запрос с необходимыми левыми соединениями.Часто разработчики путают два схожих понятия БСП. Важно понимать их архитектурную разницу, так как она напрямую влияет на бизнес-логику и блокировки данных:
ДополнительныеСведения. Их можно изменять даже у закрытых документов прошлых периодов без перезаписи самого документа, не опасаясь нарушения последовательностей или блокировок со стороны даты запрета.Для того чтобы не загромождать код ручными запросами в тех местах, где нужно просто прочитать значение реквизита в коде (например, при заполнении документов или проверках), настоятельно рекомендуется использовать штатный API БСП из общего модуля УправлениеСвойствами.
Посмотрим на примеры кода. Вместо написания тяжелого запроса для получения одного значения, мы можем использовать следующую конструкцию:
ЗначениеСвойства = УправлениеСвойствами.ЗначениеСвойства(СсылкаНаНоменклатуру, "МойДополнительныйРеквизит");
Если же нам требуется получить сразу все заполненные дополнительные свойства объекта, мы можем прочитать их в удобную таблицу значений одной строкой:
ТаблицаСвойств = УправлениеСвойствами.ЗначенияСвойств(СсылкаНаНоменклатуру);
// На выходе получаем таблицу с колонками "Свойство" и "Значение"
Использование этого готового API значительно повышает читаемость кода, сокращает количество строк и перекладывает задачу оптимизации выборки на плечи проверенных временем механизмов БСП.
Как совершенно верно отметил один из участников форума (Сообщение 8), если вам все же приходится писать запросы к дополнительным реквизитам вручную, крайне рекомендуется использовать временные таблицы.
Вместо того чтобы делать гигантское левое соединение 10 таблиц в одном пакете, разбейте задачу на шаги:
Подведем итог и составим краткое руководство для принятия архитектурных решений при проектировании систем на платформе 1С:
Используйте дополнительные реквизиты БСП, если:
Добавляйте реквизиты через конфигуратор или расширения, если: