Как задать тип элементов для списка значений на управляемой форме 1С?

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

При разработке внешних обработок и отчетов разработчики часто сталкиваются с ситуацией: на форму выносится реквизит объекта с типом СписокЗначений, однако при интерактивном добавлении каждого нового элемента платформа 1С открывает модальное окно с требованием выбрать тип данных (число, строка, ссылка на справочник и т. д.). Это сильно замедляет работу пользователя. Разберем, почему возникает такое поведение платформы и как правильно ограничить доступные типы данных для списка значений.

Выясняем причину проблемы

Проанализируем архитектуру платформы 1С:Предприятие 8.3, чтобы понять корни такого поведения:

  1. Ограничение метаданных реквизита объекта: Если мы создаем реквизит у обработки или отчета в конфигураторе и задаем ему тип СписокЗначений, платформа не позволяет в палитре свойств указать, элементы какого именно типа будут храниться внутри этого списка. Коллекция создается абсолютно универсальной и содержит неограниченный состав типов.
  2. Ошибочное обращение к свойствам элемента формы: На форме список отображается элементом ПолеФормы с видом ПолеВвода. Разработчики нередко пытаются обращаться к свойству ДоступныеТипы, однако у элемента формы такого свойства нет — вместо него используется ОграничениеТипа.
  3. Правило пересечения типов: При интерактивном редактировании списка на управляемой форме платформа вычисляет доступные типы как логическое пересечение свойства ТипЗначения самого списка значений и свойства ОграничениеТипа элемента формы. Если в результате пересечения остается только один тип и свойство элемента ВыбиратьТип установлено в значение Ложь, выбор типа не запрашивается.

Способ 1. Установка свойства «ТипЗначения» у самого списка (рекомендуемый)

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

Откроем модуль формы и в обработчике события ПриСозданииНаСервере пропишем следующий код:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Задаем допустимый тип для коллекции списка значений
    Объект.СписокПоставщиков.ТипЗначения = Новый ОписаниеТипов("СправочникСсылка.Партнеры");
    
КонецПроцедуры

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

Способ 2. Ограничение типа через элемент управления формы

Разберем программную настройку визуального элемента формы. Если по каким-либо причинам требуется управлять ограничением на уровне интерфейса, используем свойства ОграничениеТипа и ВыбиратьТип элемента управления:


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

Обратите внимание на точное имя свойства: именно ОграничениеТипа, а не ДоступныеТипы. Установка флага ВыбиратьТип = Ложь гарантирует отключение диалога, если в ограничении остался единственный тип.

Способ 3. Перенос списка в реквизиты формы

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

  1. Откроем редактор формы обработки на вкладке Реквизиты.
  2. Создадим новый реквизит формы с типом СписокЗначений.
  3. В палитре свойств реквизита формы (в отличие от реквизита объекта обработки) платформа позволяет развернуть свойство Тип значения и флажками отметить конкретные справочники или документы без написания программного кода.

Важные нюансы и ограничения платформы

Посмотрим на практические особенности работы со списками значений, о которых важно помнить:

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

Альтернативные решения задачи

Если требуется предоставить пользователю удобный ввод перечня значений, можно рассмотреть альтернативные подходы:

  1. Использование таблицы значений на форме: Создадим реквизит формы типа ТаблицаЗначений с одной колонкой нужного ссылочного типа. В отличие от поля ввода списка, таблица на форме выглядит более наглядно, поддерживает стандартные механизмы сортировки, поиска и множественного выбора.
  2. Переопределение события «НачалоВыбора»: Для поля списка значений можно назначить обработчик НачалоВыбора, отключить стандартную обработку и открыть стандартную форму выбора справочника с включенным режимом множественного выбора. Полученные выбранные значения затем программно добавляются в список.
← На главную