v8: Ссылка на метаданные Ключевые слова: метаданные,ссылка
Иногда нужно в базе хранить ссылку на метаданные.
Примеры использования:
1. Корректировка движений регистра - чтобы знать какой регистр двигать.
2. Документ, который меняет значение периодического реквизита регистра сведений, чтобы сослаться на конкретный реквизит.
3. Универсальный отчет любой, при сохранении настроек нужно знать названия реквизитов. Можно хранить названия, но лучше - метаданные.
Казалось бы можно использовать тип "ОписаниеТипа", но увы, значения этого типа нельзя хранить в базе.
В 8.1 ссылка на метаданные не появилась, так что методика будет еще актуальна долго.
Эмуляция с помощью справочника
Поэтому наиболее разумный выход - использование служебного справочника, назовем его метаданными.
Справочник без кода, в поле наименование хранится полный путь к метаданным, например:
Справочники.Договоры.Реквизиты.Адрес
РегистрыСведений.Сотрудники.Измерения.Сотрудник
Там, где нужно использовать ссылку на метаданные производится вызов фунцкии СсылкаНаМетаданные(МД), которая проверяет, есть ли в справочнике ссылка на такое метаданное. Если ссылки есть, она возвращается, если нет, добавляется новый элемент справочника метаданных, прописывается путь к нему и возвращается ссылка.
Как видно, можно хранить не только ссылку на тип прикладного объекта, но и на конкретный реквизит этого объекта.
Эмуляция с помощью ПВХ
План видов характеристик позволяет хранить типы, т.е. в нем можно сохранять метаданные с точностью до типа.
Эмуляция с помощью строки
acsent: Храним строку - "РегистрыСведений.Сотрудники.Измерения.Сотрудник".
Для Получения используем конструкцию: МетаСсылка = Выполнить(СтрМетаданных);
Гений 1С: Недостатки подхода:
* Строка занимает больше места, чем ссылка, особенно это чувствительно в документах корректировки движений.
* Если переименовать объект метаданного, то все такие строки нужно менять.
Эмуляция с помощью хранилища значения
Neco: Ссылку на объект метаданных и вообще любой объект в конфигурации, будь то таблица значений, файл, список и т.д. можно хранить в реквизите с типом "Хранилище значения". Например:
Элемент.ХранилищеМетаданных = Новый ХранилищеЗначения(Справочники.Сотрудники);
получить менеджер справочника "Сотрудники" мы можем:
СправочникСотрудники = Элемент.ХранилищеМетаданных.Получить();
Этот метод избавлен от недостатков хранения ссылки в виде строки. И даже в случае если меняется наименование объекта метаданных, всеравно будет возвращен нужный объект.
Гений 1С: Недостатки подхода:
* Хранилище возможно занимает больше места, чем ссылка на справочник (актуально для большого количества ссылок на метаданные).
* Два значения типа хранилище нельзя сравнивать между собой, делать отборы и т.п., т.е. это черный ящик.
|