Как ограничить тип элементов в списке значений только определенным справочником?

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

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

Способ 1. Ограничение типа через палитру свойств реквизита формы

Рассмотрим самый быстрый способ настройки, если список значений уже создан как реквизит формы или объекта в конфигураторе. Проанализируем действия по шагам:

  1. Откроем нужную форму в конфигураторе и перейдем на вкладку Реквизиты.
  2. Выделим нужный реквизит с типом СписокЗначений и откроем его палитру свойств (сочетание клавиш Alt + Enter).
  3. Найдем свойство Тип значения. По умолчанию там установлен признак составного типа данных со всеми доступными типами метаданных.
  4. Снимем флажки со всех типов и установим ровно один флажок напротив нужного ссылочного типа: СправочникСсылка.Пользователи.

После этой настройки при интерактивном добавлении строки в таблицу списка значений платформа перестанет запрашивать тип и сразу откроет форму выбора справочника пользователей.

Способ 2. Программная установка свойства ТипЗначения

Выясним причину частых ошибок при попытке программно присвоить тип свойству ТипЗначения. Свойство ТипЗначения у объекта СписокЗначений ожидает не результат системной функции Тип() или ТипЗнч(), а объект типа ОписаниеТипов. Если передать туда неподходящее значение, платформа выдаст ошибку несоответствия типов.

Посмотрим на пример правильного программного назначения типа:


// Вариант с указанием строкового имени типа
СписокПользователей = Новый СписокЗначений;
СписокПользователей.ТипЗначения = Новый ОписаниеТипов("СправочникСсылка.Пользователи");

Разберем вариант, когда для создания описателя типов используется массив типов:


МассивТипов = Новый Массив;
МассивТипов.Добавить(Тип("СправочникСсылка.Пользователи"));

Описание = Новый ОписаниеТипов(МассивТипов);
СписокПользователей.ТипЗначения = Описание;

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

Способ 3. Настройка элемента управления на управляемой форме

Если реквизит создается динамически или требуется дополнительно отсечь выбор групп (папок) справочника, настроим свойства поля ввода, привязанного к колонке «Значение» списка.

  1. В дереве элементов формы найдем поле ввода колонки значения списка.
  2. В свойстве ОграничениеТипа зададим требуемый тип данных. Программно это выполняется так:
    
    Элементы.СписокЗначенийЗначение.ОграничениеТипа = Новый ОписаниеТипов("СправочникСсылка.Пользователи");
    
  3. В свойстве ВыборГруппИЭлементов (или свойстве ВыборГруппИЭлементов поля формы) установим значение ИспользованиеГруппИЭлементов.Элементы, чтобы пользователь не мог выбрать группу пользователей вместо конкретного элемента справочника.

Способ 4. Программный перехват начала выбора

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


&НаКлиенте
Процедура СписокЗначенийЗначениеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    
    // Отключаем стандартный диалог выбора
    СтандартнаяОбработка = Ложь;
    
    // Формируем параметры открытия формы
    ПараметрыФормы = Новый Структура;
    ПараметрыФормы.Вставить("ЗакрыватьПриВыборе", Истина);
    
    // Открываем форму выбора справочника пользователей
    ОткрытьФорму("Справочник.Пользователи.ФормаВыбора", ПараметрыФормы, Элемент);
    
КонецПроцедуры

Использование свойства ТипЗначения в связке с правильной настройкой элементов формы гарантирует целостность данных в списке значений и избавляет пользователя от лишних действий при заполнении реквизитов.

← На главную