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