1с программно добавить параметры выбора
Свойство элемента формы ‘ПараметрыВыбора’
Очередная полезная заметка в рубрике ‘Джуниор 1с’. Рассмотрим полезное свойство элемента формы ‘ПараметрыВыбора’ (ChoiceParameters), с помощью которого мы можем ограничить список выбираемых элементов по заданному отбору.
Пример работы с данным свойством рассмотрим в конфигурации 1с ‘БитФинанс’. Что бы было понятно и нагляднее напишем простую обработку, с помощью которой уже изучим данное свойство.
И так, создаем новую обработку и добавляем на неё реквизит ‘СтатьяОборотов’ типа ‘СправочникСсылка.бит_СтатьиОборотов’:
У этого элемента справочника есть реквизит ‘ТипСтатьи’ / ‘ПеречислениеСсылка.бит_ТипыСтатейОборотов’:
Так как же сделать что бы при выборе статьи оборотов нам выходил список только с теми элементами, у которых реквизит ‘ТипСтатьи‘ = ‘БДР’? А очень просто, для этого нам нужно свойство элемента формы ‘ПараметрыВыбора’:
Поскольку параметры выбора это у нас ‘ФиксированныйМассив’, то мы можем задавать несколько условие отбора – все отборы будут работать в связке ‘И’:

И теперь выбирать мы сможем в нашей форме только те статьи, которые соответствуют установленному нашему отбору:

Все это можно проделать и программным способом, я считаю его более гибким, так как там можно реализовывать любую логику выбора элементов. Создаем событие у элемента ‘СтатьяОборотовНачалоВыбора’ и прописываем алгоритм заполнения фиксированного массива параметров выбора:
Связи параметров выбора программно
Добрый день, коллеги!
Вопрос по установки связи параметров выбора не в свойствах реквизита, а в коде. Как я делаю, написал процедуру:
И вставляю при открытии формы. Но при открытии он пишет ошибку:
Ошибка при установке значения атрибута контекста (СвязиПараметровВыбора)
Элементы.НоменклатураЗаказаПереработчика.СвязиПараметровВыбора = Новый ФиксированныйМассив(НовыйМассив);
по причине:
Недопустимое значение
В чем может быть проблема?
Заранее спасибо
(5) в серверный модуль. Взял из бп 3.0, увы вызова там нигде нет.
Вот попробовал сперва очистить параметры, а потом добавить как в Вашем примере, вроде установилось
(1) Судя по описанию там «Фиксированный массив из элементов типа СвязьПараметраВыбора.»
(5) в серверный модуль. Взял из бп 3.0, увы вызова там нигде нет.
Вот попробовал сперва очистить параметры, а потом добавить как в Вашем примере, вроде установилось
В ERP ХарактеристикаНоменклатуры может быть подчинена как самой Номенклатуре, так и быть общей для ВидаНоменклатуры, который является реквизитом Номенклатуры. В последнем случае связь с владельцем получается не прямая, и использовать «Отбор.Владелец» не имеет смысла. Попробуйте вместо «Отбор.Владелец» указать «Номенклатура». В этом случае в ФормеВыбора ХаракеристикиНоменклатуры в процедуре ПриСозданииНаСервере выполняется анализ, кто является настоящим владельцем Характеристики и устанавливается соответствующий отбор.
Если Параметры.Отбор.Свойство(«Владелец») Тогда
// Перенесем «стандартный» отбор по владельцу в свойство ПараметрВладелец
Параметры.ПараметрВладелец = Параметры.Отбор.Владелец;
Параметры.Отбор.Удалить(«Владелец»);
КонецЕсли;
Если Параметры.Свойство(«ПараметрВладелец», ВладелецХарактеристик) И ЗначениеЗаполнено(ВладелецХарактеристик) Тогда
ПодборТоваровСервер.УстановитьОтборПоВладельцуХарактеристик(ЭтаФорма);
ИначеЕсли Параметры.Свойство(«Номенклатура», Номенклатура) И ЗначениеЗаполнено(Номенклатура) Тогда
Если Справочники.Номенклатура.ПроверитьИспользованиеХарактеристикИПолучитьВладельцаДляВыбо ра(Номенклатура, ВладелецХарактеристик) Тогда
Если ВладелецХарактеристик = Неопределено Тогда
ТекстИсключения = НСтр(«ru = ‘Для данной номенклатуры характеристики не заданы.'»);
ВызватьИсключение ТекстИсключения;
Иначе
ПодборТоваровСервер.УстановитьОтборПоВладельцуХарактеристик(ЭтаФорма);
КонецЕсли;
Иначе
ТекстИсключения = НСтр(«ru = ‘Для данной номенклатуры отключено использование характеристик.'»);
ВызватьИсключение ТекстИсключения;
КонецЕсли;
КонецЕсли;
Форма выбора (подбор) в управляемых формах
Статья будет состоять из нескольких приведенных примеров кода с описанием того, как прибегнуть к Подбору.
Пример 1.
Простой вызов формы выбора с одним возвращаемым результатом:
Пример 2.
Выбор нескольких значений (документов или справочников) :
В первых 2-х примерах мы использовали обработчик (Событие) формы «ОбработкаВыбора».
Теперь рассмотрим пример с использованием «Обработки оповещения», на мой взгляд более удобно )
Пример 3.
Думаю многие не знают про фишку Оповещением «на Сервере». То есть результат можно вернуть сразу на сервер без дополнительных условий. Работает до 8.3.13.1644, с 8.3.16.1063 этот метод недоступен.
Пример 4.
Мы видим что открывается форма выбора (из списка документов «Реализация товаров и услуг»), но иногда необходимо добавить некий отбор, чтобы при открытии формы не выводить все документы в целом.
Пример 5.
Есть моменты когда не всегда можно обойтись простым отбором, например необходимо открыть форму выбора со списком за определенный период.
Пример 6.
Пример 7.
Как открыть форму выбора с Позиционированием ранее выбранного значения:
Тестировалось на 1С:Предприятие 8.3 (8.3.16.1063) и 1С:Предприятие 8.3 (8.3.13.1644), Спасибо за внимание, возможно, кому-то поможет)
Программирование в 1С для всех
В этой статье я расскажу, что такое параметры выбора и связи параметров выбора в 1С 8.3, и как с их помощью можно сделать работу пользователей более комфортной.
Связи параметров выбора в 1С
Начнем со связей параметров выбора.
Для большей наглядности, реализуем небольшую задачу. Пусть у нас есть два справочника Контрагенты и ДоговорыКонтрагентов.
Причем справочник Контрагенты является владельцем справочника ДоговорыКонтрагентов.
А также, я создам документ Оплата, в котором нужно указывать контрагента, договор контрагента и сумму.
Если с такими настройками, мы попробуем выбрать договор контрагента, то в форме выбора отобразятся все договоры всех контрагентов.
Что, согласитесь может быть неудобно. И гораздо удобнее, чтобы выходили только договоры выбранного контрагента. Для того, чтобы пользователи могли видеть договоры контрагента, который указан в поле Контрагент, необходимо настроить связи параметров выбора. Для этого, нужно зайти в палитру свойств реквизита Договор, в которой интересует свойство Связи параметров выбора. Если нажать на кнопку «…» этого свойства, то откроется окно «Связи параметров выбора». В этом окне можно настраивать различные связи реквизита, палитру свойств которого мы открыли, с остальными реквизитами. Мы настроим связь с реквизитом Контрагент.
После выбора реквизита Контрагент таблица «Параметры» заполнится автоматически.
В результате, свойство реквизита Связи параметров выбора должно быть заполнено следующим образом.
Всё! Теперь, когда мы будем выбирать договоры в документе Оплата, то будут выходить только договоры выбранного контрагента.
Параметры выбора в 1С
Помимо настроек связи параметра выбора со значением другого реквизита, в 1С 8.3. можно настраивать параметры выбора. Например, можно сделать так, чтобы для выбора были доступны только непомеченные на удаление элементы.
К примеру, у нас бывают договоры контрагентов, которые помечены на удаление.
Эти же элементы отображаются в форме выбора договоров в документе Оплата.
Если мы хотим, чтобы в форме выбора договоров контрагента отображались только непомеченные на удаление элементы справочника, то нужно открыть свойство Параметры выбора реквизита Договор. Откроется форма, в которой необходимо настроить параметры выбора. В моем случае, установить, что Пометка на удаление Ложь.
Если всё сделано правильно, то свойство Параметры выбора реквизита документа Договор должно заполниться.
Если сейчас, мы попытаемся выбрать договор контрагента, то откроется форма выбора, в которой будут отсутствовать элементы, помеченные на удаление.
О том, как работать с проверкой заполнения реквизитов объектов, читайте в этой статье:
Более подробно и основательно начальные вопросы программирования в 1С есть вы можете изучить в
Книга «Программировать в 1С за 11 шагов»
Изучайте программирование в 1С в месте с моей книгой «Программировать в 1С за 11 шагов»
Книга написана понятным и простым языком — для новичка.
О том как разрабатывать под управляемым приложением 1С, читайте в книге Книга «Основы разработки в 1С: Такси»
Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.
Промо-код на скидку в 15% — 48PVXHeYu
Эти книги, плюс книга по программированию оперативного учета имеются в едином комплекте: комплект книг по разработке в 1С.
Только для читателей моего блога,
промо-код на скидку в 300 рублей на весь комплект: blog
Если Вам понравился этот урок, был полезен или помог решить какую-нибудь проблему, то Вы можете поддержать мой проект, перечислив любую сумму.
можно оплатить вручную:
Яндекс.Деньги — 410012882996301
Web Money — R955262494655
Работа с данными выбора
ОГЛАВЛЕНИЕ
ВВЕДЕНИЕ
Заполняя форму ввода, мы работаем со связанными данными. Так, выбирая договор контрагента, мы ожидаем увидеть в форме выбора список договоров конкретного контрагента. Пользуясь текстовым поиском в поле реквизита формы, мы также должны увидеть список, удовлетворяющий как критериям введенного поиска, так и ограничениям связей. Так, введя часть номера договора, мы ожидаем увидеть список договоров конкретного контрагента, элементы которого содержат в номере набранный образец поиска. Аналогично система должна контролировать уже введенное значение в поле реквизита формы: значение должно удовлетворять ограничениям связей.
СВЯЗИ ПАРАМЕТРОВ ВЫБОРА
Платформа 1С позволяет описывать связи параметров выбора. По этим связям форма выбора автоматически настраивает фиксированные настройки отбора. Пользователь в форме выбора получает список элементов, соответствующих наложенным ограничениям связей. Аналогично платформа обрабатывает отбор элементов при формировании списка выбора. Когда пользователь вводит в реквизит формы текстовый образец строки поиска, платформа выполняет поиск элементов, соответствующих введенному значению по полям поиска, а также по условиям отбора, соответствующих связям параметров выбора.
Описанное поведение системы вполне нас могло устроить. Однако если, например, нужно настроить отбор по полю реквизита через точку, то такое мы сделать стандартно не сможем. Так же, если ограничение подразумевает использование критериев отбора через поля дополнительных таблиц, соединенных с основной таблицей выбираемого типа, то такой вариант также не предусмотрен платформой. И последнее, в платформе нет средств проверки выбранного значения на соответствие связям параметров выбора.
Однако, об этом мало кто знает, в качестве параметра выбора можно установить фиксированный массив, и тогда отбор будет не на равенство, а на вхождение значения поля основной таблицы в список значений установленного массива. И это полезно знать в рамках представленного решения, чтобы не реализовывать то, что и так поддерживается платформой.
Поясню на конкретных примерах. Представим себе форму, в которой есть два реквизита типа Контрагент. Скажем нужно указать первого контрагента, а потом выбрать второго. Однако второго контрагента можно выбрать только из той же группы контрагентов, в которой находится первый. Здесь условие связи параметров выбора могло бы быть таким: Отбор.Родитель = Контрагент.Родитель. Однако правое выражение через точку не поддерживается платформой и потому такое условие связи ввести нельзя.
Предлагаемое решение как раз снимает указанные ограничения и позволяет использовать связи параметров как с реквизитами основной таблицы, так и с реквизитами связанных таблиц. Данное решение распространяется на все обозначенные сценарии ввода значения реквизита формы:
ПАРАМЕТРЫ ВЫБОРА
При вызове формы выбора или при подборе из списка платформа передает параметры, определенные по связям. Используя переданные параметры можно сформировать свой собственный запрос к данным и подменить выборку данных. Это нам необходимо для того, чтобы обойти ограничения описания условий связей. Перед рассмотрением указанного способа получения выборки давайте ознакомимся с существующими ограничениями платформы при описании связей.
Платформа накладывает следующие ограничения на создание выражений условий связей параметров. Имя параметра должно удовлетворять условиям написания имен (не содержать пробелов, начинаться может с буквы или символа подчеркивание); в имени можно использовать только одну точку или не использовать точку вообще. Значение параметра должно быть значением реквизита формы без использования подчиненных реквизитов, однако можно указать реквизит табличной части в специальном формате через элементы формы: Элементы.Список.ТекущиеДанные.ИмяРеквизита.
ОБХОД ОГРАНИЧЕНИЙ ПАРАМЕТРОВ ВЫБОРА
Практика
На практике мне попадались следующие решения:
Недостатками этих решений являются:
Решение
В рамках наложенных ограничений платформы, недостающие параметры можно передать косвенно через указание реквизита формы. Так, если по приведенному примеру выше, нам нужно указать связь по родителю реквизита Контрагент, то условие связи параметров может быть таким: Отбор.КонтрагентРодителя = Контрагент. Тогда в форму выбора или же в предопределенную процедуру обработки выбора будет передан параметр с именем КонтрагентРодителя и значением реквизита формы Контрагент. Далее нам достаточно отработать условие по этому параметру, а именно использовать этот параметр для получения значения через точку Контрагент.Родитель и уже это, полученное косвенно, значение параметра использовать для установки необходимого отбора по родителю.
Аналогично для второго примера условие связи будет: Отбор.Договор = Договор. Несмотря на то, что условие накладывается на справочник Статьи, в котором отсутствует поле Договор, такое условие в рамках платформы вполне допустимо использовать. В этом случае в форму выбора будет передан параметр Договор со значением из реквизита формы Договор. Далее нам необходимо построить запрос через соединение основной таблицы Статьи с таблицей РегистрСведений.СтатьиДоговора и уже на поле регистра сведений наложить условие отбора по переданному значению договора.
Таким образом можно обойти ограничения платформы и передать в форму выбора необходимые параметры. Далее необходимо исходя из переданных параметров построить текст запроса. Полученный текст запроса можно использовать как в форме выбора, так и в предопределенной процедуре получения данных выбора для формирования списка.
ПОДСИСТЕМА РАБОТА С ДАННЫМИ ВЫБОРА
Рисунок 1. Диаграмма последовательности
Предлагаемая подсистема реализует интерфейс для работы следующих сценариев:
Подключение к подсистеме производится через вставку вызова в форме выбора и добавление предопределенной процедуры менеджера объекта ОбработкаПолученияДанныхВыбора.
Обработка параметров, функция ПолучитьТекстЗапроса
В предлагаемое решение строится вокруг реализации функции ПолучитьТекстЗапроса. Реализация данной функции не является обязательной и нужна только для тех типов данных, выборка которых ограничивается не только по реквизитам основной таблицы.
В следующем листинге демонстрируется пример-заготовка реализации такой функции. Данная реализация основана на использовании объектной модели запроса. Работа с объектной моделью осуществляется с использованием подсистемы «Работа со схемой запроса». С шаблонами построения текста запроса при использовании подсистемы можно подробнее ознакомиться в одноименной статье.
Листинг 1. Общая структура функции ПолучитьТекстЗапроса на примере справочника _ДемоНоменклатура
Динамический список формы выбора
После того, как мы разобрались с механизмом получения текста запроса по переданным параметрам, давайте рассмотрим, как его использовать для формирования динамического списка формы выбора.
Подготовка динамического списка может быть осуществлена в предопределенной процедуре модуля формы: ПриСозданииНаСервере. В этой процедуре доступны параметры выбора, которые необходимо передать в функцию формирования текста запроса. Полученный текст запроса необходимо установить в динамическом списке. Для того, чтобы динамический список работал, необходимо также установить параметры отбора динамического списка (это те параметры, которые нельзя установить в условиях отбора данных основной таблицы, но можно использовать в тексте запроса).
Для работа подсистемы необходимо настроить динамический список формы выбора: установить произвольный запрос и изменить псевдоним основной таблицы на имя «Источник».
Разберемся подробнее с параметрами отбора и установкой отбора в динамическом списке. Стандартным образом отбор в динамическом списке платформа устанавливает по параметрам структуры переданного отбора. В нашем случае в этой структуре могут быть как поля основной таблицы, так и параметры, используемые для получения значения отбора косвенно. Параметры второй категории необходимо установить в процедуре ПриСозданииНаСервере и они же должны быть указаны в тексте запроса, а параметры первой категории оставить в структуре отбора. Тогда платформа получит в качестве отбора поля основной таблицы и стандартным образом настроит элементы фиксированного отбора по переданным значениям после открытия формы выбора.
Таким образом, для работы формы выбора с динамическим списком необходимо разделить переданные параметры на отбор по реквизитам основной таблицы и параметры запроса. Первые должны остаться и будут стандартным образом обработаны системой, а вторые необходимо использовать в тексте запроса динамического списка и установить программно в параметрах динамического списка.
Листинг 2. Демонстрация разделения параметров в функции ПолучитьТекстЗапроса
Листинг 3. Подключение формы выбора к подсистеме
Примечание: подключаемая форма выбора должна содержать произвольный текст запроса основной таблицы, при этом псевдоним основной таблицы должен быть предопределенным «Источник». Этот же псевдоним используется в подсистеме для построения текста запроса путем добавления условия и соединений.
Список данных выбора
Рисунок 2. Список выбора
Механизм получения списка данных выбора аналогичен описанному для динамического списка формы выбора.
Как и для формы выбора здесь при вызове предопределенной процедуры ОбработкаДанныхВыбора будут переданы параметры, в том числе и параметры связей выбора. Далее необходимо получить текст запроса и установить значения переданных параметров в запрос программно. К полученному запросу необходимо применить отбор по условию вхождения переданного образца в строке поиска в значения по полям поиска.
После выполнения полученного запроса в процедуре формируется список, который используется платформой для вывода на экран списка выбора.
Листинг 4. Подключение процедуры к подсистеме
Проверка на соответствие условиям параметров выбора. Заполнение по-умолчанию.
Теперь, когда мы умеем формировать текст запроса по условиям связей, мы можем также проверить текущее значение реквизита на соответствие условиям связей. Это может быть полезным, когда меняются связи (топология), либо меняются значения связей, либо производится выбор значения из истории списка.
Если в выборке по условиям связей мы получим единственное значение, то его можно использовать для заполнения реквизита по-умолчанию. В этом случае пользователя не обязательно заставлять сделать выбор, когда выбора то и нет.
Листинг 5. Проверка соответствия переменной СсылкаНаЗначение переданным параметрам выбора из структуры Параметры
СТЕНД «РАБОТА С ДАННЫМИ ВЫБОРА»
Рисунок 3. Форма обработки стенда
Для демонстрации работы подсистемы выбран справочник _ДемоНоменклатура из демо-конфигурации БСП. С помощью расширения конфигурации в справочнике доработан менеджер объекта и форма выбора. В модуль менеджера добавлена функция ПолучитьТекстЗапроса и предопределенная процедура ОбработкаДанныхВыбора. В форме выбора добавлен вызов процедуры ЗаполнитьТекстЗапросаДинамическогоСписка.
В функции ПолучитьТекстЗапроса реализована обработка дополнительных параметров:
В процедуре используются приемы по формированию текста запроса в объектной модели с использованием подсистемы РаботаСоСхемойЗапроса. Более подробно читайте здесь.

















