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