1с изменить параметры выбора реквизита программно

Параметры выбора позволяют установить отбор для открываемой формы выбора объекта не изменяя код в самой форме выбора. Например, на форме есть реквизит «ДокументОтгрузки» с типом ДокументСсылка.РеализацияТоваровУслуг. Нам необходимо в этом поле выбрать только тот документ, у которого партнер будет равен какому-то определённому партнеру, и сам документ должен быть проведен. Соответственно, в открываемой форме выбора документов отгрузки должны стоять соответствующие отборы по партнеру и по признаку проведенности документа, но саму форму выбора мы не должны трогать. Для этого, в процедуре ПриСозданииНаСервере в форме, на которой расположено поле «ДокументОтгрузки» прописываем следующий код:

МассивПараметровВыбора = Новый Массив;
МассивПараметровВыбора.Добавить(Новый ПараметрВыбора("Отбор.Партнер", ПартнерДляОтбора));
МассивПараметровВыбора.Добавить(Новый ПараметрВыбора("Отбор.Проведен", Истина));
НовыеПараметрыВыбора =  Новый ФиксированныйМассив(МассивПараметровВыбора);
Элементы.ДокументОтгрузки.ПараметрыВыбора = НовыеПараметрыВыбора;

ПартнерДляОтбора — это тот самый патрнер, по которому нам необходим отбор в открываемой форме выбора. При каждом изменении ПартнераДляОтбора необходимо заново устанавливать параметры выбора, применив вышеуказанный код.

Задача1c-programmnoye-pereopredeleniye-svyazey-parametrov-vybora_0

Необходимо организовать программное переопределить связи параметров выбора по определенному событию

Решение

Для наглядности создадим новую конфигурацию со следующими справочниками:

  1. «Контрагенты»;
  2. «Договоры контрагентов». Подчинен справочнику «Контрагенты»;
  3. «Соглашения». У реквизита «Договор контрагента» установлены параметры связей выбора по реквизитам «Владелец», «Параметр 1» и «Параметр 2».

При такой реализации в соглашении будут доступны договоры указанного контрагента с определенными параметрами.

В качестве события для переопределения связей параметров выбора будем использовать значение реквизита «Позволить выбирать любой договор контрагента». Если признак будет установлен, то позволим выбирать любой договор указанного контрагента.

Собственно код формы элемента справочника «Соглашения» и изображения результата

#Область ОбработчикиСобытийФормы

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	ПереопределитьСвязиПараметровВыбора();
КонецПроцедуры

#КонецОбласти

#Область ОбрабочикиСобытийЭлементовФормы

&НаКлиенте
Процедура ПозволитьВыбиратьЛюбойДоговорКонтрагентаПриИзменении(Элемент)
	ПереопределитьСвязиПараметровВыбора();
КонецПроцедуры

#КонецОбласти

#Область ПрограммныйИнтефейс

&НаСервере
Процедура ПереопределитьСвязиПараметровВыбора()
	
    НовыйМассив = Новый Массив();
    НовыйМассив.Добавить(Новый СвязьПараметраВыбора("Отбор.Владелец", "Объект.Контрагент"));
	
    Если Не Объект.ПозволитьВыбиратьЛюбойДоговорКонтрагента Тогда 
        НовыйМассив.Добавить(Новый СвязьПараметраВыбора("Отбор.Параметр1", "Объект.Параметр1"));
        НовыйМассив.Добавить(Новый СвязьПараметраВыбора("Отбор.Параметр2", "Объект.Параметр2"));
    КонецЕсли;	
	
    НовыеСвязи = Новый ФиксированныйМассив(НовыйМассив);
	
    Элементы.ДоговорКонтрагента.СвязиПараметровВыбора = НовыеСвязи;
	
КонецПроцедуры // ПереопределитьСвязиПараметровВыбора()

#КонецОбласти

Связи параметров выбора Связи параметров выбора Связи параметров выбора

Содержание:

1.      Свойство связи параметров выбора в 1С

2.      Реквизиты объектов метаданных и элементы формы в 1С 8.3. Разница в использовании свойства «Связи параметров выбора»

3.      Как использовать свойства связи параметров выбора в 1С. Пример

4.      Связи параметров выбора в 1С программно  

1.    Свойство связи параметров выбора в 1С

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

Формы прикладных объектов — это именно те элементы интерфейса программы, которые видит и с которыми работает пользователь.

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

И вот начиная с версии платформы 1С 8.3 появилось большое количество настраиваемых свойств у реквизитов объектов метаданных конфигурации, а также реквизитов и элементов управляемых форм.

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

Вот именно одним из таких «фильтров» является свойство «Связи параметров выбора» (Рисунок 1).

Рисунок 1

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

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

2.    Реквизиты объектов метаданных и элементы формы в 1С 8.3. Разница в использовании свойства «Связи параметров выбора»

Следует отметить, что свойство «Связи параметров выбора» есть и у реквизитов объектов метаданных в 1С (Рисунок 2).

Рисунок 2

И у элементов формы в 1С 8.3(Рисунок 3)

Рисунок 3

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

В большинстве случаев с методологической точки зрения корректнее настраивать свойство «Связи параметров выбора» у реквизита объекта метаданных. 

3.    Как использовать свойства связи параметров выбора в 1С. Пример

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

Рассмотрим использование свойства связи параметров выбора в 1С на простейшем примере.

Вот данные справочника «Контрагенты» (Рисунок 4).

Рисунок 4

И соответственно данные справочника «Договоры» (Рисунок 5).

Рисунок 5

При пустом значении свойства «Связи параметров выбора» (Рисунок 6)…

Рисунок 6

…В режиме 1С:Предприятия в документе «Приходная накладная» при выборе договора отображается полный список договоров, по всем контрагентам (Рисунок 7).

Рисунок 7

Теперь установим значение свойства «Связи параметров выбора» (Рисунок 8, Рисунок 9, Рисунок 10).

Рисунок 8

Рисунок 9

Рисунок 10

И вот что получаем (Рисунок 11).

Рисунок 11

Как видно на скрине, после настройки свойства «Связи параметров выбора» список договоров фильтруется по выбранному в документе контрагенту.

При настройке свойства в конфигураторе 1С Связи параметров выбора в форме настройки есть параметр «Режим изменения связанного значения» установленный в значение «Очищать» (Рисунок 12).

Рисунок 12

При таком параметре в случае изменения или очистки значения поля «Контрагент» значение поля «Договор» тоже будет очищено.

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

Значения, указанные в данном свойстве, будут переданы в открываемую форму через структуру Параметры передавая их при вызове метода ОткрытьФорму()  

4.    Связи параметров выбора в 1С программно

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

Если рассматривать пример выше, то фрагмент программного кода будет выглядеть так:

(Рисунок 13)

Рисунок 13

Вызывать процедуру установки связи нужно из процедуры:

Специалист компании ООО «Кодерлайн» 

Александр Арутюнов.

Как пример программного отбора при выборе значения реквизита «тГрузополучатель»:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

НовыйМассив = Новый Массив();

ДоступныеГрузополучатели = ПолучитьДоступныеГрузополучатели();

Для Каждого СтрокаДоступныеГрузополучатели Из ДоступныеГрузополучатели Цикл

НовыйМассив.Добавить(СтрокаДоступныеГрузополучатели);

КонецЦикла;

НовыеЗначения = Новый ФиксированныйМассив(НовыйМассив);

НовыйПараметр = Новый ПараметрВыбора(«Отбор.Ссылка», НовыеЗначения);

НовыйМассив = Новый Массив();

НовыйМассив.Добавить(НовыйПараметр);

НовыеПараметры = Новый ФиксированныйМассив(НовыйМассив);

Элементы.тГрузополучатель.ПараметрыВыбора = НовыеПараметры;



22 ноября, 2021
27 июля, 2022

Сегодня опишу такую вещь как “связи параметров выбора” (СвязиПараметровВыбора). Много раз пользовался этим механизмом в конфигураторе, настраивая связи.

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

Вот простой пример кода который иллюстрирует программное использование:

Если ЗначениеЗаполнено(Объект.Контрагент) Тогда

НоваяСвязь = Новый СвязьПараметраВыбора(«Отбор.Контрагент», «Объект.Контрагент»);

НовыйМассив = Новый Массив();

НовыйМассив.Добавить(НоваяСвязь);

НовыеСвязи = Новый ФиксированныйМассив(НовыйМассив);

Элементы.Маршрут.СвязиПараметровВыбора = НовыеСвязи;

КонецЕсли;

Как видно, ничего сложного в этом коде нет. Главное правильно без ошибок указать имена реквизитов и их путь в конструкторе СвязьПараметраВыбора.

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

Так же можно использовать более сложные конструкции и даже использовать те реквизиты, которые не доступны для выбора в режиме конфигуратора.

Это самый просто пример, но он позволит начать изучение темы.

Совместно с использованием заполнения списка выбора этот код позволяет сделать динамические ограничения ввода и фильтрацию в поле ввода в режиме ввода текста, режиме выбора из списка и выбора в форме выбора.

Рассмотрим различные варианты установки отбора при выборе объекта на документе ДокументОтборПриемаТовара. У документа имеются следующие реквизиты (см. рисунок 1):

  • ПоставщикОтбор (тип СправочникСсылка.Поставщики);
  • ТоварОтбор (тип СправочникСсылка.Товары);
  • ОтветственныйОтбор (тип СправочникСсылка.Ответственный);
  • ПриемТовара (тип ДокументСсылка.ПриемТовара).
Рисунок 1. Структура документа ДокументОтборПриемаТовара

Выбирать будем документ ПриемТовара, а отбор в форме выбора будет устанавливаться по реквизитам с постфиксом Отбор.

Документ ПриемТовара имеет реквизиты (см. рисунок 2):

  • Поставщик (тип СправочникСсылка.Поставщики);
  • Ответственный (тип СправочникСсылка.Ответственный);
  • Комментарий (Тип Строка).

А так же табличную часть Товары, состоящую из реквизитов Товар (тип СправочникСсылка.Товары) и Количество (тип Число).

Рисунок 2. Структура документа ПриемТовара

1. Установка отбора в свойствах реквизита объекта метаданных

Самый простой вариант отбора. Нужно всего лишь в свойствах реквизита «Связи параметров выбора»  и «Параметры выбора» задать параметры выбора. Допустим, при выборе документа ПриемТовара, нужно в форме выбора показывать документы отобранные по поставщику и только проведенные. Для этого в связях параметров выбора задаем отбор по поставщику, а в параметрах выбора отбор только проведенных документов (см. рисунок 3).

Рисунок 3. Отбор в свойствах реквизита объекта метаданных

Больше ничего делать не нужно, платформа сама завернет указанные параметры выбора в структуру (см. рисунок 4) и поместит её в параметр Отбор формы выбора, далее, анализируя данный параметр формы, платформа устанавливает отборы для динамического списка.

Рисунок 6. Значение параметра формы выбора Отбор

2. Установка отбора в свойствах элемента формы

Такой же простой вариант как и первый, только те же самые свойства задаются для элемента формы (см. рисунок 5).

Рисунок 5. Отбор в свойствах элемента формы

Свойства элемента формы имеют приоритет над свойствами реквизита объекта.

3. Установка собственного отбора при создании формы выбора на сервере

Усложним задачу и будем производить отбор документов по табличной части, а конкретно по товару в ней. Для этого в связях параметров выбора зададим связь, где параметр будет Товар (прям ручками пишем), а реквизит ТоварОтбор (см. рисунок 6).

Рисунок 6. Связь параметра Товар с реквизитом ТоварОтбор

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

  
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

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

КонецПроцедуры

4. Программная установка параметров выбора

Так как у элемента формы есть свойства СвязиПараметровВыбора и ПараметрыВыбора, и они доступны не только для чтения, но и на запись, то все что описано выше можно выполнить с помощью программного кода. Для этого в форме документа ДокументОтборПриемаТовара в событии ПриСозданииНаСервере напишем код, который будет формировать массив связей параметров и параметров выбора, и устанавливать их в соответствующие свойства элемента формы ПриемТовара, который связан с реквизитом объекта ПриемТовара:

  
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

// Создаем связи параметров выбора.
МассивСвязей = Новый Массив;
НоваяСвязь = Новый СвязьПараметраВыбора("Отбор.Поставщик", "Объект.ПоставщикОтбор");
МассивСвязей.Добавить(НоваяСвязь);
НоваяСвязь = Новый СвязьПараметраВыбора("Отбор.Ответственный", "Объект.ОтветственныйОтбор");
МассивСвязей.Добавить(НоваяСвязь);
НоваяСвязь = Новый СвязьПараметраВыбора("Товар", "Объект.ТоварОтбор");
МассивСвязей.Добавить(НоваяСвязь);

// Создаем параметры выбора.
МассивПараметров = Новый Массив;
НовыйПараметр = Новый ПараметрВыбора("Отбор.Проведен", Истина);
МассивПараметров.Добавить(НовыйПараметр);

// Устанавливаем связи параметров и параметры выбора для элемента формы.
Элементы.ПриемТовара.СвязиПараметровВыбора = Новый ФиксированныйМассив(МассивСвязей);
Элементы.ПриемТовара.ПараметрыВыбора = Новый ФиксированныйМассив(МассивПараметров);

КонецПроцедуры

Для корректной работы отборов необходимо создать событие ПриСозданииНаСервере с таким же программным кодом как в варианте №3 у формы выбора документа ПриемТовара.

5. Установка параметров выбора в момент начала выбора

Этот вариант позволяет «на лету» устанавливать параметры выбора. Усложним задачу и будем устанавливать отбор только по заполненным реквизитам отбора.
В модуле формы документа ДокументОтборПриемаТовара в событии НачалоВыбора для элемента ПриемТовара, который связан с реквизитом объекта ПриемТовара, напишем код, который будет устанавливать параметры выбора в зависимости от заполненности реквизитов отбора:

  
&НаКлиенте
Процедура ПриемТовараНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)

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

КонецПроцедуры

Для корректной работы отборов необходимо создать событие ПриСозданииНаСервере с таким же программным кодом как в варианте №3 у формы выбора документа ПриемТовара.

6. Открытие формы выбора с установленным параметром формы Отбор в момент начала выбора

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

  
&НаКлиенте
Процедура ПриемТовараНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)

СтандартнаяОбработка = Ложь;

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

КонецПроцедуры

Отборы на динамический список платформа наложит сама, писать дополнительно код больше не нужно, как в варианте №3.

А что будет, если отбор в связях параметров выбора и параметры выбора пересекаются?

Как показал мой эксперимент, страшного ничего не случится, платформа установит отбор по связям параметров выбора.

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

   ЗадатьСвязиПараметровВыбораЭлементов();

КонецПроцедуры

&НаСервере
Процедура ЗадатьСвязиПараметровВыбораЭлементов()

  // Свойство элемента формы СвязиПараметровВыбора
  СвязьПарВыбора = Новый СвязьПараметраВыбора(«Отбор.Номенклатура», «Номенклатура», РежимИзмененияСвязанногоЗначения.Очищать);

  // Если отбор идет по реквизиту объекта (не по реквизиту формы), то указываем:
  // СвязьПарВыбора = Новый СвязьПараметраВыбора(«Отбор.Номенклатура», «Объект.Номенклатура», РежимИзмененияСвязанногоЗначения.Очищать);

  НоваяСвязь = Новый Массив();
  НоваяСвязь.Добавить(СвязьПарВыбора);
  // В массив можно добавлять произвольное число отборов

  НовыеСвязи = Новый ФиксированныйМассив(НоваяСвязь);
  Элементы.ГруппаТоваров.СвязиПараметровВыбора = НовыеСвязи;

КонецПроцедуры

Понравилась статья? Поделить с друзьями:
  • 1с как в расширении добавить реквизит справочника
  • 1с как обратиться к реквизиту параметра в запросе
  • 1с как обратиться к реквизиту регистра накопления
  • 1с как при копировании документа очищать реквизит
  • 1с как проверить есть ли реквизит табличной части