Установка параметров выбора и связей параметров выбора для объектов метаданных

#std411

Область применения: управляемое приложение, мобильное приложение, обычное приложение.

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

2. Однако могут встречаться случаи, когда ограничения выбора могут зависеть от конкретного сценария работы. В таких случаях параметры выбора могут быть уточнены по месту, в конкретной форме.

Например, в конфигурации имеются

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

Тогда установка связи для параметра Отбор.Организация в свойствах реквизита Сотрудник документа ПриказОПриеме и связи для параметра Отбор.ВидСотрудника в поле формы документа ПриказОПриеме приведет к тому, что в режиме 1С:Предприятия будут работать обе связи параметра выбора. Таким образом, при выборе сотрудника в форме приказа о приеме отбор в списке сотрудников будет установлен как по организации, заполненной в документе, так и по виду сотрудника, который будет определен на основании функциональной опции.

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

Например, в конфигурации имеются

Тогда установка параметра Отбор.ТипНоменклатуры со значением Товар в свойствах измерения Номенклатура регистра ТоварыНаСкладе сократит список доступных значений в отборе отчета, не позволив выбрать номенклатуру с типом Услуга, которая не может храниться на складе.

4. Не рекомендуется указывать в связях параметров выбора Режим изменения связанного значения = Очищать. Вместо этого необходимо написать программный код, выполняющий условную очистку зависимого значения при несоответствии новым значениям ведущих реквизитов.

При безусловной очистке возможны следующие проблемы:

Например, в конфигурации имеются

Владелец Характеристики должен соответствовать реквизиту ВидНоменклатуры из справочника Номенклатура.

Неправильно:


Правильно:

Пример условной очистки:

&НаКлиенте
Процедура ТоварыНоменклатураПриИзменении(Элемент)
    ТекущаяСтрока = Элементы.Товары.ТекущиеДанные;
    ТекущаяСтрока.Характеристика = ХарактеристикаПоУмолчанию(ТекущаяСтрока.Номенклатура, ТекущаяСтрока.Характеристика);
КонецПроцедуры

// Возвращает характеристику по умолчанию для номенклатуры.
//
// Параметры:
//  Номенклатура    - СправочникСсылка.Номенклатура - номенклатура, для которой необходимо получить характеристику.
//  ТекущееЗначение - СправочникСсылка.ХарактеристикиНоменклатуры - текущее значение характеристики.
// 
// Возвращаемое значение:
//  СправочникСсылка.ХарактеристикиНоменклатуры - подобранное значение: 
//     1. Если текущее значение удовлетворяет условиям, то возвращается текущее значение.
//     2. Если найдено только одно значение, соответствующее условиям, то возвращается оно.
//     3. Если нет подходящих значений, либо значений несколько, то возвращается пустая ссылка.
//
&НаСервереБезКонтекста
Функция ХарактеристикаПоУмолчанию(Номенклатура, ТекущееЗначение)
    
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ ПЕРВЫЕ 2
        |   ХарактеристикаНоменклатуры.Ссылка КАК Ссылка,
        |   ХарактеристикаНоменклатуры.Ссылка = &ТекущееЗначение КАК ЭтоТекущееЗначение
        |ИЗ
        |   Справочник.Номенклатура КАК Номенклатура
        |       ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры
        |       ПО Номенклатура.ВидНоменклатуры = ХарактеристикаНоменклатуры.Владелец
        |ГДЕ
        |   Номенклатура.Ссылка = &Номенклатура
        |
        |УПОРЯДОЧИТЬ ПО
        |   ЭтоТекущееЗначение УБЫВ";
    
    Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
    Запрос.УстановитьПараметр("ТекущееЗначение", ТекущееЗначение);
    
    Выборка = Запрос.Выполнить().Выбрать();
    
    Если Не Выборка.Следующий() Тогда
        // Ни одно значение не подходит
        Возврат Справочники.ХарактеристикаНоменклатуры.ПустаяСсылка();
    ИначеЕсли Выборка.ЭтоТекущееЗначение Или Выборка.Количество() = 1 Тогда
        // Текущее значение подходит или найдено единственное подходящее
        Возврат Выборка.Ссылка;
    Иначе // Значений несколько, невозможно выбрать значение "по умолчанию"
        Возврат Справочники.ХарактеристикаНоменклатуры.ПустаяСсылка();
    КонецЕсли;
    
КонецФункции

4.1. Если повторный выбор значения ведущего реквизита без его фактического изменения невозможен, а также если каждому значению зависимого реквизита соответствует не более одного значения ведущего реквизита, то допустима безусловная очистка (Режим изменения связанного значения = Очищать) связанного реквизита при изменении ведущего реквизита.

Например, в конфигурации имеются

Значение флага ЦенаВключаетНДС элемента справочника «ВидыЦен», выбираемого в зависимом реквизите «ВидЦен» документа «ЗаказПоставщику», должно быть равно значению ведущего реквизита «ЦенаВключаетНДС» документа, так как:

В этом случае, безусловная очистка зависимого реквизита ВидЦены при изменении ведущего флага ЦенаВключаетНДС в документе является допустимой.

5. Для заполнения реквизитов нового объекта, который создается из поля выбора или формы выбора с установленными отборами, рекомендуется добавлять необходимые параметры выбора в структуру Отбор, так как ее свойства и значения передаются в параметр ДанныеЗаполнения процедуры события ОбработкаЗаполнения.

Для этого перед именем параметра нужно добавить префикс «Отбор.».

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