Опубликовано ср, 18/04/2012 — 00:07 пользователем guru
1. Создаём Критерий отбора.
2. Выбираем тип данных, по которому будет производиться отбор в списке документов.
3. Выбираем справочники и документы, в которых будет применяться отбор.
4. Создаём новую форму списка копированием.
5. Добавляем реквизит формы с типом данных как и в критерии отбора.
6. Добавляем на форму поле ввода. (Данные – реквизит формы, созданный в п.5. Выбор групп и элементов – Элементы.)
7. Создаём обработчик события ПриИзменении.
//Отбор по номенклатуре
Процедура НоменклатураПриИзменении(Элемент)
Если ЗначениеЗаполнено(Номенклатура) Тогда
Отбор.ОтборПоНоменклатуре.Установить(Номенклатура);
Иначе
Отбор.ОтборПоНоменклатуре.Использование = Ложь;
КонецЕсли;
КонецПроцедуры
8. Устанавливаем созданную форму в качестве основной формы списка.
© При копировании материалов сайта ссылка на оригинал обязательна.
|
|||
bplmeddy
19.07.16 — 13:41 |
Добрый день. |
||
Горогуля
1 — 19.07.16 — 13:42 |
ссылка в списке |
||
bplmeddy
2 — 19.07.16 — 13:44 |
(1) Не очень Вас понял. Если можно — поподробней обьясните пожалуйста. |
||
PR
3 — 19.07.16 — 13:45 |
Вообще-то из коробки уже работает, че вы там городите? |
||
Горогуля
4 — 19.07.16 — 13:45 |
наклади фильтр по ссылке. чтоб она была в заранее подготовленном списке |
||
bplmeddy
5 — 19.07.16 — 13:47 |
(4) Воистину,всё гениальное — просто. Идея насколько простая, настолько и хороша. Спасибо огромное, буду пробовать. |
||
hhhh
6 — 19.07.16 — 13:48 |
критерии отбора покурите |
||
PR
7 — 19.07.16 — 13:49 |
(0) УФ? |
||
bplmeddy
8 — 19.07.16 — 13:50 |
(7) Нет. |
||
bplmeddy
9 — 19.07.16 — 13:53 |
(4) (5) Хотя есть и трудность. Если таких документов 10-15, а вывести надо все? Фильтр то работает по принципу Равно/Неравно, а ссылки уникальны. Вот и загвоздка. |
||
Горогуля
10 — 19.07.16 — 13:54 |
ссылка в списке. в списке ссылка. списке ссылка в. в ссылка списке |
||
hhhh
11 — 19.07.16 — 13:56 |
(9) тогда критерии отбора покурите |
||
bplmeddy
12 — 19.07.16 — 13:56 |
(10) Прошу простить мою «глупость» , но нИпонятнА =( |
||
lera01
13 — 19.07.16 — 13:59 |
(12) Чтобы организовать отбор по всем документам какого-то вида, в табличной части которых есть реквизит с нужным вам значением, нужно написать запрос. По результату запроса сформировать список ссылок на документы и засунуть их в отбор. |
||
Горогуля 14 — 19.07.16 — 13:59 |
(12) Фильтр работает не только по принципу Равно/Неравно |
TurboConf — расширение возможностей Конфигуратора 1С
17 правил для составления оптимального ЗАПРОСа к данным базы 1С 47
Для формирования и выполнения запросов к таблицам базы данных в платформе 1С используется специальный объект языка программирования Запрос . Создается этот объект вызовом конструкции Новый Запрос . Запрос удобно использовать, когда требуется получ
Быстрый отбор в справочнике по первой букве 0
В статье описан способ быстрой организации отбора в списке справочника по первой букве наименования. Механизм легко дотачивается под собственные нужды.
https://helpf.pro/uploads/img/_1-T4ZDj6uNPX.png
// ПРОЦЕДУРЫ И ФУНКЦИИ МОДУЛЯ
НаКлиенте
Ввод записей в журнал расчетов 1
Добавление записи в журнал расчетов:
Метод Новая может быть вызван где угодно, в глобальном модуле, модуле обработок, документов и т.д.
Данный метод проверяет корректность заполненных реквизитов журнала расчетов. При вводе новых записей журнал
Восстановление узла распределенной информационной базы из резервной копии 0
В случае возникновения ситуации, при которой необходимо восстановить резервную копию информационной базы, работающую в рамках распределенной информационной базы, можно воспользоваться следующими рекомендациями.
Процедура восстановления информационно
Выборка (перебор) бизнес-процессов 0
Выбрать( , , , )
отбора
отбора
(необязательный) — Структура. Задает реквизит вида расчета и значение этого реквизита, по которому будет создана выборка. Ключ структуры задает имя реквизита, а значение структуры — значение отбора по этому рекви
Посмотреть все результаты поиска похожих
На днях получил задание реализовать поиск документа по контрагенту, указанному в нем. Все было бы элементарно просто, но структура документа была не совсем обычна. Документ регистрирует продажу долга контрагентов сторонней организации, при этом одним документом может продаваться сразу несколько долгов. Поэтому в документе есть табличная часть, состоящая из двух колонок: Контрагент и СуммаДолга.
Список документов представлен управляемой формой и динамическим списком на ней. И конечно стандартный инструмент Настройка списка дает возможность проводить отбор только по реквизитам документа, но не по реквизитам табличной части.
Рассмотрим причину возникновения этой проблемы. Дело в том, что формирование динамического списка происходит на основе запроса. Этот запрос может быть сформирован как вручную, так и автоматически, если мы указываем Основную таблицу динамического списка. Когда мы создаем форму списка по умолчанию применяется второй способ — автоматическое формирование запроса. При этом в выбираемые поля запроса попадают все реквизиты документа и табличные части. И именно по этим полям потом можно делать отбор. Но табличные части попадают в поле запроса целиком, поэтому сделать отбор по конкретному реквизиту табличной части невозможно.
Решением проблемы может быть изменение стандартного автоматически формируемого запроса. Для этого нужно выполнить следующие действия:
- В свойствах реквизита Список на управляемой форме установим флаг Произвольного запроса и перейдем в Настройку списка. Для наглядности для появившегося запроса можно открыть конструктор запросов.
- В конструкторе запросов необходимо убрать из полей выборки все табличне части. Вместо этого добавим табличную часть, по реквизиту которой необходимо делать отбор, в источники запроса (таблицы).
- Далее левым соединением соединяем табличные части с самим документом.
- И делаем группировку по всем полям (хотя можно и использовать ВЫБРАТЬ РАЗЛИЧНЫЕ).
- На вкладке Компановка данных — Таблицы снимаем флаг Обязательно для табличной части. Это нужно для того, чтобы соединение выполнялось не всегда, а только если используется отбор. Таким образом экономятся ресурсы и ускоряется работа конфигурации.
На вкладке Компановка данных — Условия создаем необходимые условия отбора по необходимым реквизитам табличной части.
- Сохраняем запрос и переходим на вкладку Настройка. Там можно сразу добавить необходимые условия отбора, чтобы пользователям самим не приходилось каждый раз выбирать поля. Не забудьте снять флаги с полей отбора, иначе при открытии формы списка условие отбора будет сразу применено.
Рассмотрим различные варианты установки отбора при выборе объекта на документе ДокументОтборПриемаТовара. У документа имеются следующие реквизиты (см. рисунок 1):
- ПоставщикОтбор (тип СправочникСсылка.Поставщики);
- ТоварОтбор (тип СправочникСсылка.Товары);
- ОтветственныйОтбор (тип СправочникСсылка.Ответственный);
- ПриемТовара (тип ДокументСсылка.ПриемТовара).
Рисунок 1. Структура документа ДокументОтборПриемаТовара |
Выбирать будем документ ПриемТовара, а отбор в форме выбора будет устанавливаться по реквизитам с постфиксом Отбор.
Документ ПриемТовара имеет реквизиты (см. рисунок 2):
- Поставщик (тип СправочникСсылка.Поставщики);
- Ответственный (тип СправочникСсылка.Ответственный);
- Комментарий (Тип Строка).
А так же табличную часть Товары, состоящую из реквизитов Товар (тип СправочникСсылка.Товары) и Количество (тип Число).
Рисунок 2. Структура документа ПриемТовара |
1. Установка отбора в свойствах реквизита объекта метаданных
Самый простой вариант отбора. Нужно всего лишь в свойствах реквизита «Связи параметров выбора» и «Параметры выбора» задать параметры выбора. Допустим, при выборе документа ПриемТовара, нужно в форме выбора показывать документы отобранные по поставщику и только проведенные. Для этого в связях параметров выбора задаем отбор по поставщику, а в параметрах выбора отбор только проведенных документов (см. рисунок 3).
Рисунок 3. Отбор в свойствах реквизита объекта метаданных |
Больше ничего делать не нужно, платформа сама завернет указанные параметры выбора в структуру (см. рисунок 4) и поместит её в параметр Отбор формы выбора, далее, анализируя данный параметр формы, платформа устанавливает отборы для динамического списка.
Рисунок 6. Значение параметра формы выбора Отбор |
2. Установка отбора в свойствах элемента формы
Такой же простой вариант как и первый, только те же самые свойства задаются для элемента формы (см. рисунок 5).
Рисунок 5. Отбор в свойствах элемента формы |
Свойства элемента формы имеют приоритет над свойствами реквизита объекта.
3. Установка собственного отбора при создании формы выбора на сервере
Усложним задачу и будем производить отбор документов по табличной части, а конкретно по товару в ней. Для этого в связях параметров выбора зададим связь, где параметр будет Товар (прям ручками пишем), а реквизит ТоварОтбор (см. рисунок 6).
Рисунок 6. Связь параметра Товар с реквизитом ТоварОтбор |
Именно такую задаем связь, так как более одной точки(.) в колонке Имя при написании параметра мы не можем использовать (платформенное ограничение), то есть написать «Отбор.Товары.Товар» мы не сможем.
Так как имя параметра мы задали вручную, то платформа его не поместит в параметр Отбор формы выбора, поэтому в форме выбора документа ПриемТовара в обработчике события ПриСозданииНаСервере напишем программный код, который будет обрабатывать наш параметр Товар и устанавливать отбор по реквизиту табличной части:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Товар = Неопределено;
ЭтотОбъект.Параметры.Свойство("Товар", Товар);
Если Товар <> Неопределено Тогда
ФиксОтбор = ЭтотОбъект.Список.КомпоновщикНастроек.ФиксированныеНастройки.Отбор;
ЭлементОтбора = ФиксОтбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Товары.Товар");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = Товар;
ЭлементОтбора.Использование = Истина;
КонецЕсли;
КонецПроцедуры
4. Программная установка параметров выбора
Так как у элемента формы есть свойства СвязиПараметровВыбора и ПараметрыВыбора, и они доступны не только для чтения, но и на запись, то все что описано выше можно выполнить с помощью программного кода. Для этого в форме документа ДокументОтборПриемаТовара в событии ПриСозданииНаСервере напишем код, который будет формировать массив связей параметров и параметров выбора, и устанавливать их в соответствующие свойства элемента формы ПриемТовара, который связан с реквизитом объекта ПриемТовара:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Создаем связи параметров выбора.
МассивСвязей = Новый Массив;
НоваяСвязь = Новый СвязьПараметраВыбора("Отбор.Поставщик", "Объект.ПоставщикОтбор");
МассивСвязей.Добавить(НоваяСвязь);
НоваяСвязь = Новый СвязьПараметраВыбора("Отбор.Ответственный", "Объект.ОтветственныйОтбор");
МассивСвязей.Добавить(НоваяСвязь);
НоваяСвязь = Новый СвязьПараметраВыбора("Товар", "Объект.ТоварОтбор");
МассивСвязей.Добавить(НоваяСвязь);
// Создаем параметры выбора.
МассивПараметров = Новый Массив;
НовыйПараметр = Новый ПараметрВыбора("Отбор.Проведен", Истина);
МассивПараметров.Добавить(НовыйПараметр);
// Устанавливаем связи параметров и параметры выбора для элемента формы.
Элементы.ПриемТовара.СвязиПараметровВыбора = Новый ФиксированныйМассив(МассивСвязей);
Элементы.ПриемТовара.ПараметрыВыбора = Новый ФиксированныйМассив(МассивПараметров);
КонецПроцедуры
Для корректной работы отборов необходимо создать событие ПриСозданииНаСервере с таким же программным кодом как в варианте №3 у формы выбора документа ПриемТовара.
5. Установка параметров выбора в момент начала выбора
Этот вариант позволяет «на лету» устанавливать параметры выбора. Усложним задачу и будем устанавливать отбор только по заполненным реквизитам отбора.
В модуле формы документа ДокументОтборПриемаТовара в событии НачалоВыбора для элемента ПриемТовара, который связан с реквизитом объекта ПриемТовара, напишем код, который будет устанавливать параметры выбора в зависимости от заполненности реквизитов отбора:
&НаКлиенте
Процедура ПриемТовараНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
МассивПараметров = Новый Массив;
Если ЗначениеЗаполнено(Объект.ПоставщикОтбор) Тогда
НовыйПараметр = Новый ПараметрВыбора("Отбор.Поставщик", Объект.ПоставщикОтбор);
МассивПараметров.Добавить(НовыйПараметр);
КонецЕсли;
Если ЗначениеЗаполнено(Объект.ОтветственныйОтбор) Тогда
НовыйПараметр = Новый ПараметрВыбора("Отбор.Ответственный", Объект.ОтветственныйОтбор);
МассивПараметров.Добавить(НовыйПараметр);
КонецЕсли;
Если ЗначениеЗаполнено(Объект.ТоварОтбор) Тогда
НовыйПараметр = Новый ПараметрВыбора("Товар", Объект.ТоварОтбор);
МассивПараметров.Добавить(НовыйПараметр);
КонецЕсли;
НовыйПараметр = Новый ПараметрВыбора("Отбор.Проведен", Истина);
МассивПараметров.Добавить(НовыйПараметр);
Элементы.ПриемТовара.ПараметрыВыбора = Новый ФиксированныйМассив(МассивПараметров);
КонецПроцедуры
Для корректной работы отборов необходимо создать событие ПриСозданииНаСервере с таким же программным кодом как в варианте №3 у формы выбора документа ПриемТовара.
6. Открытие формы выбора с установленным параметром формы Отбор в момент начала выбора
Данный способ отличается от предыдущего тем, что мы отменяем стандартную обработку события НачалоВыбора, сами формируем параметр формы Отбор, передаем его в открываемую форму выбора с указанием владельца формы, то есть все делаем за платформу. Обратите внимание, что в данном случае нам не нужно обходить ограничение платформы (больше одной точки в имени параметра), что бы установить отбор по товару в табличной части, достаточно указать параметр отбора Товары типа Структура, в котором ключом будет имя колонки «Товар», а значение ссылка на товар.
&НаКлиенте
Процедура ПриемТовараНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Отбор = Новый Структура;
Если ЗначениеЗаполнено(Объект.ПоставщикОтбор) Тогда
Отбор.Вставить("Поставщик", Объект.ПоставщикОтбор);
КонецЕсли;
Если ЗначениеЗаполнено(Объект.ОтветственныйОтбор) Тогда
Отбор.Вставить("Ответственный", Объект.ОтветственныйОтбор);
КонецЕсли;
Если ЗначениеЗаполнено(Объект.ТоварОтбор) Тогда
Отбор.Вставить("Товары", Новый Структура("Товар", Объект.ТоварОтбор));
КонецЕсли;
Отбор.Вставить("Проведен", Истина);
ПараметрыФормы = Новый Структура("Отбор", Отбор);
ОткрытьФорму("Документ.ПриемТовара.ФормаВыбора", ПараметрыФормы, Элемент);
КонецПроцедуры
Отборы на динамический список платформа наложит сама, писать дополнительно код больше не нужно, как в варианте №3.
А что будет, если отбор в связях параметров выбора и параметры выбора пересекаются?
Как показал мой эксперимент, страшного ничего не случится, платформа установит отбор по связям параметров выбора.
Как сделать отбор по реквизиту формы в управляемой форме???
Автор Viktorka, 06 апр 2012, 10:32
0 Пользователей и 1 гость просматривают эту тему.
У меня есть журнал документов (в него входят 3 документа), создана управляемая форма списка, с реквизитом Ответственный (тип СправочникСсылка.Пользователи), как сделать фильтр по реквизиту Ответственный.
Поиск в форме списка работает как отбор.
Получил помощь — скажи СПАСИБО.
Разобрался сам — расскажи другим.
Можно динамический список сделать.
Я сделала динамический список.
Когда нажимаю отбор — открывается форма редактирования отбора, и слева выводится список Доступных полей. Как мне сделать его невидимым. Моей целью является отбор только по реквизиту «ответственный», и ещё как при нажатии на кнопку «Отбор» (который выводит форму редактирования отбора) данные о старом отборе очищались?????
Динамический список запросом я имел ввиду. И по нажатию кнопки устанавливать параметры. Как-то так. Хотя мож че подзабыл.
Цитата: Viktorka от 06 апр 2012, 14:07
Я сделала динамический список.
Когда нажимаю отбор — открывается форма редактирования отбора, и слева выводится список Доступных полей. Как мне сделать его невидимым. Моей целью является отбор только по реквизиту «ответственный», и ещё как при нажатии на кнопку «Отбор» (который выводит форму редактирования отбора) данные о старом отборе очищались?????
кинуть на форму сверху списка поле для выбора Ответственного и обрабатывать отбор программно, а вышеупомянутую кнопку — спрятать…
Получил помощь — скажи СПАСИБО.
Разобрался сам — расскажи другим.
Цитата: cska-fanat-kz от 06 апр 2012, 14:21
Цитата: Viktorka от 06 апр 2012, 14:07
Я сделала динамический список.
Когда нажимаю отбор — открывается форма редактирования отбора, и слева выводится список Доступных полей. Как мне сделать его невидимым. Моей целью является отбор только по реквизиту «ответственный», и ещё как при нажатии на кнопку «Отбор» (который выводит форму редактирования отбора) данные о старом отборе очищались?????кинуть на форму сверху списка поле для выбора Ответственного и обрабатывать отбор программно, а вышеупомянутую кнопку — спрятать…
Не получается, Это Форма журнала документов, и если «путь к данным» реквизита ответственный выбрать «Элементы.Список.ТекущиеДанные.Ответственный», то в поле отображается ФИО ответственного для выбранной строки табличной части, а выбрать не получается. Свойства тип для реквизитов нет, только путь к данным.
Я поставила «путь к данным» — список.отбор. и всё бы хорошо, только вот убрать бы доступные поля
Получилось!!!
Из-за маленького опыта сразу не сообразила. Когда добавляла реквизит «Ответственный» на форму, выбирала из списка, а следовала просто добавить новый реквизит с типом «СправочникСсылка.Пользователи», кинуть на форму. В молуле формы написать:
&НаКлиенте
Процедура Ответственный2ПриИзменении(Элемент)
ТекОтбор = Список.Отбор.Элементы;
ТекОтбор.Очистить();
УсловиеОтбора = ТекОтбор.Добавить(тип(«ЭлементОтбораКомпоновкиДанных»));
УсловиеОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(«Ответственный»);
УсловиеОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
УсловиеОтбора.ПравоеЗначение = Ответственный2;
КонецПроцедуры
У каждого документа есть список. Его можно отобразить как на форме списка этого документа, так и на любой обработке. Для этого на форму выносится таблица значений (в толстом клиенте), в качестве типа значения выбирается ДокументСписокИмядокумента.
Над списком документов размещаем командную панель (в свойствах ставим галочку «Автозаполнение» и источник – имя таблицы значений). В панели появится кнопка «Отбор». Для отбора доступны поля документа, у которых включена индексация и которые добавлены в таблицу документов.
С помощью отбора возможно ограничить список документов только теми, которые подпадают под установленные ограничения отбора. Установить ограничения можно в частности на «равно» (организация в документе равна организации в отборе, тип сравнения «равно») и на «список» (организация в документе равна одной из организаций в отборе, тип сравнения «в списке»).
Такой отбор возможно установить программно из кода 1С.
Код может быть расположен в любом обработчике, обычно его располагают в обработчике события формы ПередОткрытием() или ПриОткрытии().
В программном коде, для установки отбора с несколькими вариантами значений — используют список значений 1С в качестве отбора на форме списка.
Пример программного кода установки отбора на форме списка с помощью списка значений 1С:
//список значений 1С в качестве отбора на форме списка
//создадим список значений, который содержит "разрешенные" организации
//выберем запросом все организации из справочника
//таким образом запретим к отображению все документы, в которых организация не выбрана (пустая)
//PS. это сделано для примера, проще установить отбор "не равно" пустая организация (т.е. Справочники.Организации.ПустаяСсылка())
Запрос = Новый Запрос("ВЫБРАТЬ Ссылка ИЗ Справочник.Организации");
спОрганизаций = Новый СписокЗначений();
спОрганизаций.ЗагрузитьЗначения(Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка"));
//список значений 1С в качестве отбора на форме списка
//ищем отбор с указанным именем
//аккуратно - в данном случае у реквизита документа "Организация" в свойствах установлено "Индексировать"
//в других случаях отбора с таким именем может не быть, тогда нужно указывать "Если ОрганизацияОтбор <> Неопределено (т.е. отбор с таким именем найден)"
ОрганизацияОтбор = СписокДокументов.Отбор.Найти("Организация");
ОрганизацияОтбор.ВидСравнения = ВидСравнения.ВСписке; //устанавливаем "в списке"
ОрганизацияОтбор.Значение = спОрганизаций; //подставляем нужный список организаций
ОрганизацияОтбор.Использование = Истина; //включаем использование
//здесь мы запретим пользователю изменять наш отбор
ОрганизацияОтбор = ЭлементыФормы.СписокДокументов.НастройкаОтбора.Найти("Организация");
ОрганизацияОтбор.Доступность = Ложь;
Проголосовать за этот пост:
Загрузка…
Posted in Язык 1С