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