Как открыть форму выбора справочника с отбором на управляемых формах в 1С 8.3?

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

Довольно часто в разработке на платформе 1С:Предприятие 8.3 возникает задача ограничить список элементов при выборе значения. Например, когда в документе или справочнике уже выбрано определенное значение (перечисление или ссылка), и подчиненный справочник в форме выбора должен сразу фильтроваться по этому признаку.

В процессе реализации этой задачи разработчики нередко сталкиваются с ошибками платформы — например, «Ошибка при установке значения атрибута контекста: Несоответствие типов» — либо с тем, что форма выбора открывается, но отбор по факту не накладывается. Разберем по шагам, как правильно настроить программное открытие формы с отбором, почему возникают эти ошибки и как их избежать.

Анализ проблемы: почему возникает ошибка «Несоответствие типов»

Рассмотрим типовой сценарий. В событии НачалоВыбора поля ввода разработчик пытается переопределить стандартное поведение и открыть форму выбора со своей структурой параметров:


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

При выполнении этого кода платформа часто выбрасывает исключение: «Ошибка при установке значения атрибута контекста (ПараметрыВыбора): Несоответствие типов» на строке инициализации переменной.

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

Решить эту проблему можно двумя способами:

  1. Явно объявить локальную переменную: указать Перем ПараметрыВыбора; в самом начале процедуры. В таком случае платформа понимает, что обращение идет к локальной переменной процедуры, а не к свойству контекста формы.
  2. Использовать другое имя переменной: назвать переменную, например, ПараметрыОткрытия, ПараметрыФормы или СтруктураПараметров, чтобы исключить пересечение с системными именами.

Почему отбор не срабатывает при открытии формы?

После устранения конфликта имен разработчики сталкиваются со второй проблемой: форма открывается без ошибок, но список элементов не фильтруется. Проанализируем, из-за чего это происходит:

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

Пошаговое решение: программное открытие с отбором

Разберем готовый и корректный пример программной установки отбора в обработчике события НачалоВыбора:


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

Рассмотрим подробнее особенности работы данного механизма:

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

Альтернативное декларативное решение: «Связи параметров выбора»

Во многих случаях писать код в процедуре НачалоВыбора вообще не требуется. Платформа 1С предоставляет штатный механизм — свойство «Связи параметров выбора» (ChoiceParameterLinks), настраиваемое в конфигураторе без единой строчки программного кода.

Разберем по шагам, как его настроить:

  1. Откроем свойства реквизита в объекте конфигурации или свойства элемента формы (поля ввода).
  2. Найдем свойство Связи параметров выбора и нажмем кнопку открытия настройки.
  3. Добавим новую строку связи: укажем имя отбора (например, Отбор.СпособыРубок) и выберем реквизит текущего объекта (например, Объект.СпособРубки).

Главное преимущество использования «Связей параметров выбора» перед ручным перехватом события НачалоВыбора заключается в том, что отбор применяется не только при интерактивном открытии окна выбора по кнопке, но и при быстром вводе по строке (автоподборе) прямо в поле ввода, сохраняя высокую скорость работы пользователя.

← На главную