Как в реквизите 1С хранить тип объекта вместо ссылки на конкретный элемент?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В процессе разработки конфигураций часто возникает задача создать справочник, который должен содержать не ссылку на конкретный документ или элемент, а информацию о «типе» объекта системы. Например, нам нужно выбрать справочник Номенклатура или перечисление Месяцы, чтобы в дальнейшем использовать это знание для программной логики. Давайте разберем, почему стандартные инструменты 1С работают именно так, как они работают, и как правильно реализовать задуманное.

Понимание проблемы: Ссылка против Метаданных

Когда мы устанавливаем для реквизита тип Любая ссылка, мы даем платформе команду: «в этом поле может лежать адрес любого объекта в базе данных». Платформа 1С устроена таким образом, что для неё любая ссылка — это адрес конкретной записи (строки) в таблице базы данных. Именно поэтому, даже если вы выбираете «Тип» в открывшемся окне, 1С ожидает, что вы выберете не просто сущность (справочник или документ), а конкретный экземпляр — например, «Номенклатуру: Холодильник». Если вы не выберете элемент, платформа не считает задачу завершенной или оставляет значение Неопределено.

Способ 1: Использование программной установки пустой ссылки

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

Рассмотрим, как это реализовать в модуле формы:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // Устанавливаем значение по умолчанию при создании нового элемента
    // Замените 'ВашСправочник' на имя вашего объекта
    Объект.ВашРеквизит = Справочники.ВашСправочник.ПустаяСсылка();
КонецПроцедуры

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

Способ 2: Архитектурно верное хранение метаданных (Строковое представление)

Если задача заключается не в навигации по элементам, а именно в хранении «имени» типа, лучше отойти от ссылочных типов. Ссылки созданы для связи данных, а не для хранения описания структуры. Проанализируем более гибкий подход:

  1. Создание справочника метаданных. Вместо использования ссылочных типов создайте отдельный справочник, например, ТипыОбъектовКонфигурации. В этом справочнике вы можете хранить текстовые строки: Справочник.Номенклатура, Документ.РеализацияТоваровУслуг.
  2. Выбор через методы метаданных. Вы можете программно вызывать окно выбора типа данных, чтобы пользователь мог выбрать нужный объект из списка метаданных конфигурации. Для этого используется объект ОписаниеТипов.

Давайте посмотрим, как можно ограничить выбор пользователя, чтобы он выбирал не элементы, а типы:


&НаКлиенте
Процедура ВыбратьТипОбъекта(Команда)
    МассивТипов = Новый Массив;
    МассивТипов.Добавить(Тип("СправочникСсылка.Номенклатура"));
    МассивТипов.Добавить(Тип("СправочникСсылка.Контрагенты"));
    
    ОписаниеТипов = Новый ОписаниеТипов(МассивТипов);
    // Открываем диалог выбора типа
    ВыбранныйТип = ВыбратьТип(ОписаниеТипов);
КонецПроцедуры

Почему это важно?

Попытка заставить реквизит с типом Любая ссылка работать как «выбиратель метаданных» — это путь, который всегда будет натыкаться на ограничения интерфейса платформы. Платформа 1С:Предприятие «заточена» под работу с данными, а не с их описанием.

Подведем итог:

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

← На главную