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