При проектировании структуры метаданных часто возникает задача привязать к предопределенным элементам справочника дополнительную информацию — например, подробное описание, фиксированные настройки или служебные флаги. Выясним причину платформенных ограничений и подробно разберем практические способы решения этой задачи.
Проанализируем архитектуру платформы «1С:Предприятие». В окне редактирования предопределенных элементов справочника разработчику доступны только три базовых поля: Имя (идентификатор в метаданных), Код и Наименование. Задать значения произвольных реквизитов непосредственно в дереве метаданных невозможно.
Это связано с тем, что значения любых пользовательских реквизитов хранятся не в структуре конфигурации, а в таблицах базы данных. Предопределенные элементы связываются с физическими записями таблиц при обновлении конфигурации базы данных, но сами значения реквизитов инициализируются и изменяются исключительно на уровне данных.
Рассмотрим основные способы реализации поставленной задачи в зависимости от требований к изменяемости данных.
Если описание должно храниться в самом элементе справочника и быть доступным в запросах к таблице, добавим его как стандартный реквизит справочника (например, Описание с типом Строка). Разберем по шагам, как обеспечить его корректное заполнение и защиту от случайного изменения пользователями.
ПередЗаписью.Посмотрим на пример защиты предопределенного элемента от перезаписи служебного реквизита в модуле объекта:
Процедура ПередЗаписью(Отказ)
Если Предопределенный И Не ЭтоНовый() Тогда
СсылкаВБазе = Ссылка.ПолучитьОбъект();
Если СсылкаВБазе <> Неопределено И ЭтотОбъект.Описание <> СсылкаВБазе.Описание Тогда
Отказ = Истина;
ВызватьИсключение "Запрещено изменять описание предопределенного элемента!";
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Рассмотрим альтернативную ситуацию: описание для каждого предопределенного элемента статично, никогда не должно редактироваться пользователями и не требуется для фильтрации в сложных запросах. В этом случае создавать лишнее поле в таблице базы данных необязательно.
Разберем логику: вынесем описание в программный код модуля менеджера справочника. Для получения текста создадим экспортную функцию, которая принимает ссылку на элемент или анализирует свойство ИмяПредопределенныхДанных.
Посмотрим на пример реализации такой функции в модуле менеджера справочника:
Функция ПолучитьОписаниеПредопределенного(ЭлементСправочника) Экспорт
ИмяПредопределенного = ЭлементСправочника.ИмяПредопределенныхДанных;
Если ИмяПредопределенного = "ОсновнойСклад" Тогда
Возврат "Центральный распределительный склад компании.";
ИначеЕсли ИмяПредопределенного = "ТранзитныйСклад" Тогда
Возврат "Склад для временного хранения перемещаемых грузов.";
КонецЕсли;
Возврат "";
КонецФункции
Такой подход полностью исключает появление лишних колонок в СУБД, снимает необходимость в транзакциях записи при первичном заполнении и гарантирует сохранность текста описания при любых действиях пользователей.
Проанализируем еще один вариант, когда требуется хранить расширенную информацию (включая многострочные описания или дополнительные настройки), но структуру самого справочника изменять нежелательно или запрещено правилами поддержки типовой конфигурации.
В такой ситуации создадим независимый непериодический регистр сведений:
Элемент с типом ссылки на наш справочник.Описание с типом Строка неограниченной длины.Таким образом, мы рассмотрели ограничения платформы по настройке предопределенных элементов и выяснили, как с помощью программных методов, модуля менеджера или вспомогательных регистров корректно решить задачу хранения дополнительных данных.