Предопределенные элементы. Добавление в типовую конфигурацию

04 февраля 2013

Файлы для загрузки:

Тестовая база с примером 

Предисловие

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

Был свидетелем того, как в отчетах для получения необходимой цены использовался отбор по виду цены в запросе по ее наименованию (см. следующий скриншот).

Поиск типа цены по наименованию в запросе

В результате мы получаем нестабильный отчет, который перестанет работать при изменении наименования типа цены. Если же привязываться к коду элемента, то всегда присутствует возможность его изменения. Например, из-за нарушения уникальности кодов справочника администратор может запустить перенумерацию объектов, что приведет к изменению кодов элементов и отчет перестанет работать корректно.

К тому же, если привязываться к наименованию или коду элементов справочника, то при получении ссылки на элемент всегда будет осуществляться поиска в таблице справочника. Не смотря на то, что стандартные реквизиты системы индексируются СУБД, поиск по ним в некоторых случаях может занимать значительные ресурсы. К тому же, рациональнее было бы не выполнять поисковой запрос по таблице справочника, если, скажем так, ссылка на элемент и так "заранее известна".

Хранение ссылок на типы цен в константахКак выход, можно хранить ссылку на каждый часто используемый элемент справочника "Типы цен номенклатуры" в отдельных константах и получать из них значения в запросе. Однако, в таком случае разработчику придется добавлять отдельную константу для каждого подобного элемента. Ситуация значительно усложнится, если такие элементы будут не только в справочнике "Типы цен номенклатуры", но и в других справочниках ("Категории объектов", "Качество", "Номенклатура" и другие). Тогда количество констант в системе может увеличиться в несколько раз!

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

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

Универсальное решение

Суть универсального решения будет заключаться в следующем: будет создан справочник, в который разработчиком будут добавляться предопределенные элементы. В справочник добавлен реквизит "Значение", тип которого зависит от значений, для которых будет создаваться соответствие "Предопределенный элемент справочника -> Связанной значение". Структура метаданных справочника выглядит следующем образом (см. следующий скриншот).

Справочник предопределенных элементов с ссылками на обычные элементы

Для получения предопределенного элемента наилучшим вариантом является использование глобального метода "ПредопределенноеЗначение(<Имя>)". В качестве параметра в метод передается полный путь к предопределенному элементу. Синтаксис похож на функцию языка запросов "ЗНАЧЕНИЕ()"

Например, для получения ссылки на предопределенный элемент "ОсобыйТовар" созданного справочника необходимо вызвать метод со следующим параметром:

Получение ссылки на предопределенный элемент

Для удобства разработки рекомендую вынести функцию для получения связанного с предопределенным элементом значения в общий модуль. В тестовой конфигурации,  доступной для скачивания по ссылке в конце статьи, создан общий модуль "ЗначенияПредопределенныхЭлементов" с экспортной функцией "ПолучитьЗначениеПредопределенногоЭлемента(&lt;ИмяПредопределенногоЭлемента&gt;)". Программный код функции получает ссылку на предопределенный элемент, затем запросом получает значений реквизита "Значение". На следующем скриншоте приведен полный листинг функции.

Листинг функции для получения связанного значения предопределенного элемента

Как мы видим, в функции формируется запрос к реквизиту "Значение" переданного в качестве параметра предопределенного элемента. В качестве параметр функции является строка с именем предопределенного элемента.

Настройка справочника предопределенных элементов в пользовательском режиме

Для правильной работы созданного механизма нужно связать в пользовательском режиме предопределенный элемент с обычным элементом справочника, выбрав соответствующий элемент в реквизите "Значение". Перейдем к вопросу влияния на производительность.

Влияние на производительность

Проводил тест на скорость для обоих вариантов поиска: по наименованию и по ссылке из предопределенного элемента. Поиск проходил по справочнику "Товары" с 20000 записей. При проведении тестов на файловой базе были получены следующие результаты:

Тест скорости получения элемента для клиент-серверного варианта

Результаты показали, что для файлового варианта работы использование предопределенных элементов для получения часто используемых элементов других справочников работает медленнее практически в 4 раза!


В клиент-серверном варианте работы результаты тестов показывают совсем другую картину. Скорость получения ссылка на нужный элемент не снизилась значительно (один из тестов показал 0.002 сек. для поиска по наименованию и 0.0008 сек. при работе через предопределенный элемент), однако надежность работы программы увеличилась в разы!

Выводы

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

За время работы с платформой не раз встречался с ситуациям, когда после изменения наименования, например у элемента справочника "ТипыЦенНоменклатуры", слетала работа у большинства не типовых отчетов.

Чем больше алгоритмов связаны с обычными элементами справочников через код или наименование, тем менее устойчива система. 

Кроме того, данный подход позволят не изменять типовые объекты конфигурации, если необходимо добавить в них предопределенный элемент. В дальнейшем это сделает процесс обновления конфигурации несколько проще.


comments powered by Disqus