Как установить отбор в форме списка справочника? Как открыть форму списка с некоторым отбором? Установка отбора в пользовательском режиме

Как установить отбор в форме списка справочника? Как открыть форму списка с некоторым отбором? Установка отбора в пользовательском режиме

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

Отбор на форме в поле ввода 1С 8.2 с несколькими значениями

В примере выше мы рассмотрели как устанавливать отбор на форме выбора по конкретному значению. Теперь давайте рассмотрим ситуацию когда нужно подставить несколько значений, это может быть например как массив, так и выгрузка из результата запроса. Это отбор в поле ввода 1с с несколькими значениями.

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

Установка отбора в поле ввода на форме в 1С 8.3, событие НачалоВыбора

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

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

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

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

Рассмотрим, как это можно сделать при помощи СКД. Создадим в нашей обработке Макет с типом Схема компоновки данных и заполним его нашим запросом:

На вкладке Настройки добавим новую группировку без детализации и, в нашем примере, поле Контрагент, так как в итоге мы получим все в таблицу значений:

И на вкладке Отбор добавим в отбор Контрагента:

Теперь займемся оформлением формы. Выведем на форму самой обработки Отбор, с которым будет работать пользователь. На форму выведем элемент типа Табличное поле и дадим ему имя Отбор с типом данных Компоновщик.Настройки.Отбор:

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

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

Обработка готова, запустив ее, можно при запуске сразу увидеть в нашем Отборе появившегося Контрагента, у которого можно выбирать любой тип сравнения, а также и добавлять дополнительные строки отбора по реквизитам справочника Контрагенты:

На этом все, надеюсь, данная статья поможет Вам улучшить гибкость отборов в Ваших обработках.

Кононов Сергей

Как открыть форму списка с некоторым отбором?

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

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

В процессе открытия формы будет установлен отбор по указанному полю. Например, в следующем примере открывается список приходных накладных с отбором по полю Номер , равному 333.

ЗначениеОтбора = Новый Структура("Номер", "333");

ПараметрыВыбора = Новый Структура("Отбор", ЗначениеОтбора);

ОткрытьФорму("Документ.ПриходнаяНакладная.ФормаСписка",ПараметрыВыбора);

2. Можно открыть форму списка без параметров:

ОткрытьФорму("Документ.ПриходнаяНакладная.ФормаСписка");

И затем, в обработчике события формы списка приходных накладных ПриСозданииНаСервере написать код, который создает отбор в динамическом списке, являющемся основным реквизитом формы:

&НаСервере

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

ЭлементОтбора = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));

ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Номер");

ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Больше;

ЭлементОтбора.Использование = Истина;

ЭлементОтбора.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;

ЭлементОтбора.ПравоеЗначение = "000000001";

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

Преимущества данного метода в том, что ВидСравнения у отбора можно задавать не только Равно , как в первом случае, а и Больше , Меньше и т.п.

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

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

Для этого в форме списка номенклатуры создадим команду и соответствующую ей кнопку Приходные накладные .

Обработчик выполнения этой команды заполним следующим образом:

&НаКлиенте

Процедура ПриходныеНакладные(Команда)

ФормаСписка = ПолучитьФорму("Документ.ПриходнаяНакладная.ФормаСписка");

ФормаСписка.ФильтрПоТовару = Элементы.Список.ТекущаяСтрока;

ФормаСписка.Открыть();

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

В этом обработчике мы получаем форму списка приходных накладных и передаем в параметр формы ФильтрПоТовару ссылку на текущий элемент в списке номенклатуры и открываем форму с этим параметром.

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

В поле Запрос введем следующий текст запроса:

ВЫБРАТЬ

ДокументПриходнаяНакладная.Номер,

ДокументПриходнаяНакладная.Дата

ИЗ

Документ.ПриходнаяНакладная КАК ДокументПриходнаяНакладная

ГДЕ

ДокументПриходнаяНакладная.Товары.Товар = &Товар

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

&НаКлиенте

Процедура ПриОткрытии(Отказ)

Список.Параметры.УстановитьЗначениеПараметра("Товар", ФильтрПоТовару);

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

Здесь Список.Параметры - это список параметров запроса динамического списка для реквизита Список . Значение параметра Товар устанавливается равным значению параметра формы ФильтрПоТовару .

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

Демонстрационный пример для 3-го варианта находится в каталоге 1CITS/EXE/FAQ/ОткрытьФормуСОтбором.dt. Пример выполнен на версии платформы 8.2.9.356.

И тут шеф говорит – а какая прибыль у нас по северо-западному подразделению?

Вы тут же сформировали отчет. За год. По всем подразделениям транснациональной компании, производящей тысячи товаров. Отчет получится длинный (если не сказать круче). А значит – нужную цифру найти будет сложно.

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

Отбор 1С доступен не только в отчетах, но и в справочниках, в документах – в любых списках.

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

Мы посмотрим сейчас как использовать Отборы в 1С.

Что такое отбор 1С

Данные в отчете и в списках представлены в виде таблицы. У любой таблицы есть колонки. В каждой строке таблицы, в каждой колонке отображено какое-то значение.

Допустим, у нас в таблице есть колонки КОД и НАИМЕНОВАНИЕ. Мы можем установить одно условие:
Код = «2209»

В этом случае будут отображены только те строки, в которых значение в колонке Код такое, как мы указали.

Также мы можем установить несколько условий:
Код = «2209» И Наименование = «Курица»

В этом случае будут отображены только те строки, в которых значение в ОБЕИХ колонках.

Установка таких условий и называют – установить Отбор 1С.

Отбор 1С в толстом клиенте:

На скриншоте изображен справочник. Нажимаем кнопку в панели «Отбор». Открывается окно с вариантами отбора 1С по колонкам. Устанавливаем нужные нам фильтры, нажимаем ОК. Будут показаны только те строки, которые удовлетворяют условиям.

Тонкий клиент:

Отбор 1С можно установить с помощью пункта меню Все действия/Настроить список, закладка Отбор 1С. Действие закладки – аналогичное.

Что такое условие отбора 1С

Каждое условие отбора 1С делается на значение в одной колонке. Соответственно второе – на другую колонку и т.п. У действующих (включенных) условий установлена галочка перед именем.

На этом скриншоте изображен пример установки одного условия: «если значение в колонке равно вот этому».

Слово «равно» специально выделено. Существуют другие варианты. Если подумать, как минимум в головы приходит, что если можно отобрать строки, где значение «равно чему-то», то может понадобиться посмотреть и там, где «не равно».

Разные варианты установки условий зависят от типов значений в этой колонке.

Для числа мы можем сравнить на больше и меньше.

Если значения в колонке – это справочник или документ, то можно указать «В списке» — это значит можно перечислить несколько вариантов значений.

Некоторые справочники имеют группы. Например, справочник «Номенклатура» и «Контрагенты». Для отбора 1С по колонкам, в которых указаны значения таких справочников, Вы можете указать «В группе».

Это значит – проверить — значение, которое указано в этой строке находится внутри группы или нет? Учитываются также вложенные друг в друга группы.

Если же мы хотим указать сразу несколько групп и проверить – входит ли элемент в одну из них – то нужно выбрать «В группе из списка».

Если тип – строка, то можно искать не по полному ее значению, а только по части. Для этого выберите вариант «Содержит».

Базовые отборы 1С документов и отчетов

Как мы уже обсуждали ранее, . Поэтому базовый отбор 1С в любом списке документов – это период.

Для установки требуемого периода нажмите соответствующую кнопку в панели. Период можно установить произвольными датами или как одну из преднастроек – месяц, квартал, год.

В тонком клиенте 1С внешний вид формы для настройки периода немного изменился, но смысл остался тот же.

Отбор 1С в любом списке

Указанные правила действуют для любой таблицы в 1С, где бы она ни была расположена.

Обычно над таблицей находится панель, на которой есть кнопка отбора 1С, такая же, как на указанных выше картинках.

Если такой нет – нажмите правой кнопкой мыши в любое место таблицы. Выберите пункт меню «Установить отбор 1С и сортировку списка».

При работе в тонком клиенте 1С такого пункта меню нет. Аналогичные действия можно выполнить только если у данного списка на форму выведено меню «Все действия». Тогда в нем Вы можете выбрать команду «Настроить список».

Отбор 1С в отчете (для отчетов не СКД)

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

Обычно отборы 1С доступны при нажатии кнопки Настройка в отчете.

В отчетах конфигураций «Бухгалтерия» и «Зарплата» в толстом клиенте (а в этих конфигурациях отчеты выполнены без , отборы 1С открываются по кнопке Настройка. Они находятся во всплывающей панели, чаще всего внизу.

В отчетах конфигураций «Управление торговлей», «УПП» в толстом клиенте (также не СКД), по кнопке «Настройка» открывается окно настройки, в нижней части которого расположены отборы 1С.

Отбор 1С в СКД

В конфигурациях новых версий – на тонком клиенте 1С – все отчеты выполнены в системе СКД. Отборы 1С в них стандартизированы.

Быстрые отборы 1С выведены прямо на панель отчета.

Более детальные отборы 1С можно увидеть нажав кнопку Настройка.

Полностью управлять всем отчетом, в том числе и отборами 1С можно выбрав в меню пункт Все действия/Изменить вариант. На закладке Отбор возможно управлять отборами 1С.

Отбор на управляемых формах в 1С 8.3

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

  • Установка отбора в конфигураторе

Установка отбора в пользовательском режиме

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

Для установки отбора в режиме предприятия необходимо вызвать команду «Настроить список».

Откроется окно.


На вкладке «отбор» представлен список полей, который есть в текущем списке. Выбираем поля списка, по которым будем фильтровать. Сделать это можно двойным кликом или используя drag and drop.


Задаем вид сравнения и значение, жмем «Завершить редактирование», отбор установлен.


При установке отбора в режиме предприятия на форме списка автоматически создаются поля так называемых быстрых отборов.


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


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

Установка отбора в конфигураторе

Работая в конфигураторе, мы можем устанавливать отбор динамического списка двух видов – фиксированный и динамический. Фиксированный отбор настраивается один раз, динамический или программный – можно устанавливать в зависимости от каких-либо данных в системе.

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


Откроется окно.


Отбор задается так же, как в пользовательском режиме.

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


Динамический (программный) отбор

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

Методы

Если в разрабатываемой конфигурации присутствует подсистема БСП «БазоваяФункциональность», программный отбор в динамическом списке можно установить используя типовой метод:

ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка()

Сигнатура данного метода:

ДинамическийСписок Тип: ДинамическийСписок – Список, в котором требуется установить отбор.

ИмяПоля Тип: Строка – Поле, по которому необходимо установить отбор.

ПравоеЗначение Тип: Произвольный – Значение отбора (Необязательный. Значение по умолчанию: Неопределено. Внимание! Если передать Неопределено, то значение не будет изменено).

ВидСравнения Тип: ВидСравненияКомпоновкиДанных – Условие отбора.

Представление Тип: Строка – Представление элемента компоновки данных (Необязательный. Значение по умолчанию: Неопределено. Если указано, то выводится только флажок использования с указанным представлением (значение не выводится). Для очистки, чтобы значение снова выводилось, следует передать пустую строку).

Использование Тип: Булево – Флажок использования этого отбора (Необязательный. Значение по умолчанию: Неопределено).

РежимОтображения Тип: РежимОтображенияЭлементаНастройкиКомпоновкиДанных – Способ отображения этого отбора пользователю. Возможные значения:

  • РежимОтображенияЭлементаНастройкиКомпоновкиДанных.БыстрыйДоступ – В группе быстрых настроек над списком.
  • РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный – В настройка списка (в подменю Еще).
  • РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный – Запретить пользователю менять этот отбор.

ИдентификаторПользовательскойНастройки Тип: Строка – Уникальный идентификатор этого отбора (Используется для связи с пользовательскими настройками).

Для удаления какого-то значения отбора необходимо воспользоваться типовым методом:

ОбщегоНазначенияКлиентСервер. УдалитьЭлементыГруппыОтбораДинамическогоСписка ()

Сигнатура данного метода:

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

ИмяПоля Тип: Строка – имя поля компоновки (не используется для групп).

Представление Тип: Строка – представление поля компоновки.

В случае отсутствие в системе БСП отбор можно установить самостоятельно, используя объект ПолеКомпоновкиДанных.

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

Данный отбор отберет строки, в которых значение «ФИО» = «Иванов».

Для использования логических «И», «ИЛИ», «НЕ» предназначен тип данных ГруппаЭлементовОтбораКомпоновкиДанных

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

Данный отбор отберет строки, в которых значение «ФИО» = «Иванов» или «Петров».

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


Для этого к тексту запроса добавляем условие «ГДЕ Истина»…


Как видно, такой подход более компактный с точки зрения написания кода. Чем сложнее условия отбора в табличной части мы хотим установить, тем более громоздким будет вариант с использованием отбора через ЭлементОтбораКомпоновкиДанных. Однако у примера с изменением текста запроса есть свои недостатки – эта реализация не устойчива к изменениям кода. Например, вы сделали такую реализацию и забыли, но если в будущем вы захотите модифицировать текст запроса, добавив в него какой-либо оператор после ГДЕ (УПОРЯДОЧИТЬ, СГРУППИРОВАТЬ), вам нужно не забыть про то, что в программном коде есть:

Список.ТекстЗапроса = Список.ТекстЗапроса + " И СправочникПользователи.ФИО В(""Иванов"",""Петров"")";

Если этого не учесть будет ошибка, но чтобы этого избежать, можно переделать на другую реализацию. В текс запроса добавляем такое условие:

ГДЕ (НЕ &ОтборУстановлен ИЛИ СправочникПользователи.ФИО В (&РазрешенныеФИО))

Список.Параметры.УстановитьЗначениеПараметра("ОтборУстановлен", ФИО.Количество() > 0); Список.Параметры.УстановитьЗначениеПараметра("РазрешенныеФИО", ФИО);

Тут ФИО – массив.

Ка видно, 2 строчки кода против 10. Какой из способов выбрать, зависит от конкретной прикладной задачи.

просмотров