Произвольный отбор при открытии формы любого динамического списка

Опубликовал Sergey Andreev (starik-2005) в раздел Программирование - Практика программирования

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

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

Отчасти с этим помогает справиться параметр "Отбор", передаваемый при открытии формы. Например, так:

  ОткрытьФорму("Документ.ПоступлениеНаРасчетныйСчет.ФормаСписка", Новый Структура("Отбор", Новый Структура("ВидОперации", НужныйВидОперации)), ЭтаФорма, ...);

Но если Вам нужно отбрать по реквизиту табличной части, то такой метод не подходит, ибо в ключе структуры не может быть точки. Соответствие могло бы тут помочь, но 1С не работает с соответствием, поэтому умные разработчики 1С придумали еще один параметр открытия формы - "ФиксированныеНастройки".

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

Функция ПолучитьФиксНастройки()

	Схема = Новый СхемаКомпоновкиДанных;
	
	Источник = Схема.ИсточникиДанных.Добавить();
	Источник.Имя = "Источник1";
	Источник.ТипИсточникаДанных = "local";
	
	Набор = Схема.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных"));
	Набор.Запрос = "ВЫБРАТЬ * ИЗ Документ.ПоступлениеНаРасчетныйСчет КАК ПоступлениеНаРасчетныйСчет";
	Набор.Имя = "Запрос1";
	Набор.ИсточникДанных ="Источник1";
	Набор.АвтоЗаполнениеДоступныхПолей = Истина;

	АдресСхемы = ПоместитьВоВременноеХранилище(Схема, ЭтаФорма.УникальныйИдентификатор);

	КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных;
	КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСхемы));

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

	Возврат КомпоновщикНастроек.ФиксированныеНастройки

КонецФункции

&НаКлиенте
Процедура ОткрытьКом(Команда)

	Фикс = ПолучитьФиксНастройки();
	ОткрытьФорму("Документ.ПоступлениеНаРасчетныйСчет.ФормаСписка", Новый Структура("ФиксированныеНастройки", Фикс), ЭтаФорма)	

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

В данном случае мы откроем только те документы, в реквизите "СпособПогашенияЗадолженности" табличной части "РасшифровкаПлатежа" которых установлено значение "Автоматически".

См. также

Комментарии
1. Вячеслав (slawa) 23 06.12.16 05:46 Сейчас в теме
Для чего Схему помещать во временное хранилище?
2. Sergey Andreev (starik-2005) 860 06.12.16 10:52 Сейчас в теме
(1) в принципе тут схема вообще не нужна - можно создать объект настроек компоновки данных. А помещение в хранилище - дань традициям.
3. Денис Харченко (nomadon) 97 06.12.16 14:10 Сейчас в теме
без помещения интерактивно не работают доступные поля, мож и тут что то не работает
4. Sergey Andreev (starik-2005) 860 06.12.16 14:35 Сейчас в теме
(3) тут все работает, но компоновка тут нужна лишь для получения фиксированных настроек, т.е. фактически весь этот код можно заменить на "ФиксНастройки = Новый НастройкиКомпоновкиДанных".
zqzq; bulpi; +2 Ответить 2
5. Яков Коган (Yashazz) 1987 06.12.16 15:54 Сейчас в теме
Ваще чего-то совсем баян. Из серии "как вывести пользователю сообщение". С чего вдруг столько плюсов?..

Автор, насчёт производительности что-нибудь известно? Или это вариант только для простых списков по основной таблице?
6. Sergey Andreev (starik-2005) 860 06.12.16 16:43 Сейчас в теме
(5) все зависит от того, что открывает пользователь. Если первый вариант отбора позволяет на "Равно" и "ВСписке" отбирать, то второй фактически определяет любой отбор, доступный пользователю в настройке списка, только при этом пользователь не видит отбор из фиксированных настроек. Производительность определяется полями отбора, которые уже будут влиять на план запроса в СУБД. Если по индексированному полю отбор происходит - производительность будет высокая, а если по какому-то ПОДОБНО в реквизите табличной части, то все зависит от размера таблицы. Я как-то руками группировку попытался сделать по весьма небольшому справочнику - пятнадцать минут ждал, пока программа что-то вернет.

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

ЗЫ: Ты до сих пор не знаешь, за что на Инфостарте плюсуют? Могу как-нибудь рассказать...
7. ффф ыыы (zqzq) 15 07.12.16 08:56 Сейчас в теме
(4) Так и надо всю эту воду из статьи убрать и оставить нужное


	ФиксНастройки = Новый НастройкиКомпоновкиДанных;

	ФиксНастройки.ПараметрыДанных.Элементы.Добавить().Параметр = Новый ПараметрКомпоновкиДанных("Период");
	ФиксНастройки.ПараметрыДанных.УстановитьЗначениеПараметра("Период", ПППП);

	УправлениеНебольшойФирмойКлиент.УстановитьЭлементОтбораСписка(ФиксНастройки, "Склад", СССС);

...Показать Скрыть
bow; Новиков; myr4ik07; +3 1 Ответить 1
8. Алексей Новиков (Новиков) 286 07.12.16 10:13 Сейчас в теме
(4)
но компоновка тут нужна лишь для получения фиксированных настроек, т.е. фактически весь этот код можно заменить на "ФиксНастройки = Новый НастройкиКомпоновкиДанных".


Может быть для потомков покажете вторую редакцию готового кода, с замененными фрагментами? Может как-то бы и в статье это отразить?
И не понятно, если при всех одинаковых вводных, можно написать меньше когда, то почему не воспользоваться данной возможностью? :)
9. Митя Макаревич (mitia.mackarevich) 10 07.12.16 10:29 Сейчас в теме
Забавно, а что будет автор если пользовательские настройки будут идти в наложении(Например сохраненные) или пользователь захочет потом сам настроить дин. список? вывалиться ошибка, наложение икс и пользовательских настроек недопустимо.Тогда имеет смыл запретить редактирование настроек при открытии динамического списка.
За труды все равно плюсану.
10. Sergey Andreev (starik-2005) 860 07.12.16 11:07 Сейчас в теме
(8) если потомки не смогут сделать это самостоятельно, то за державу станет обидно )))

11. Sergey Andreev (starik-2005) 860 07.12.16 11:08 Сейчас в теме
(7) ну некоторым интересно полностью поглядеть ))
12. Sergey Andreev (starik-2005) 860 07.12.16 11:09 Сейчас в теме
(9) так можно всегда гипотезу попытаться подтвердить или опровергнуть экспериментом!
13. Алексей Новиков (Новиков) 286 07.12.16 11:47 Сейчас в теме
(10) Так вы для кого статью то писали, для себя или для других? Если для себя - вопросов нет. Если для других, вы зачем-то предложили длинный путь при наличии короткого. Дальше эту статью очевидно будут находить поисковиком и просто копи-пастить, меняя название документа и табличной части на свое. И расползется ваша портянища по многим и многим конфам. Я уверен, даже до комментов основная масса не дойдет, зная что решение - работает.

Дополните статью коротким вариантом, типа "но код можно подсократить, и я покажу как".

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

Спасибо.
14. Sergey Andreev (starik-2005) 860 07.12.16 11:49 Сейчас в теме
(13) как в одном анекдоте про обезьян, прапорщиков, палку и бананы: "что тут думать - прыгать надо!" Отсюда мораль: не стоит упрощать то, что недоступно для понимания масс, чтобы оное оставалось в элитарном сегменте.
Makushimo; +1 Ответить
15. Павел Жихарев (palsergeich) 07.12.16 12:26 Сейчас в теме
Использовать фиксированные настройки не гуд, ибо отбор по полю, на которое наложен уже отбор в фиксированных настройках приведет к ошибке. И часто приводит к тому, что такой список становится нафиг никому не нужен.
Почему не использовать пользовательские настройки с доступностью - недоступный?
16. Павел Жихарев (palsergeich) 07.12.16 12:29 Сейчас в теме
Что то типо такого.
ПараметрыФормы = Новый Структура("ПользовательскиеНастройки", ПользовательскиеНастройки);
ПараметрыФормы.Вставить("СформироватьПриОткрытии" , Истина);

Форма = ОткрытьФорму("Отчет.XXXXX.Форма.ФормаОтчета", ПараметрыФормы, ПараметрыВыполненияКоманды.Источник, ПараметрыВыполненияКоманды.Источник.УникальныйИдентификатор, ПараметрыВыполненияКоманды.Окно);
17. Sergey Andreev (starik-2005) 860 07.12.16 12:44 Сейчас в теме
(16) это для отчетов. В расширении формы динамического нет параметра "ПользовательскиеНастройки". Или есть? Для расширения формы компоновщика настроек есть.
18. Алексей А (alexei366) 07.12.16 12:53 Сейчас в теме
В СП можно ввести "Расширение управляемой формы для динамического списка" и там будут и ФиксированныеНастройки и ПользовательскиеНастройки и КлючПользовательскихНастроек. Так что можно поиграться.
19. Sergey Andreev (starik-2005) 860 07.12.16 13:10 Сейчас в теме
(18) у меня в СП так, пользовательские настройки есть - круто!
Прикрепленные файлы:
20. Алексей А (alexei366) 07.12.16 13:28 Сейчас в теме
(19)Ну славо богу, хоть СП сопали)))
21. Sergey Andreev (starik-2005) 860 07.12.16 13:47 Сейчас в теме
(20) с пользовательскими настройками то плохо, что пользователь их может отрубить. При этом фиксированные он срубить не сможет. С другой стороны, пользователь всегда прав - и если так, то можно и пользовательские настройки передавать.
22. Алексей А (alexei366) 08.12.16 10:08 Сейчас в теме
(21) Надо тестить, ты же их передавать будешь, они может будут замещать пользовательские, плюк ключ пользовательских настроек можно передать какойнить специфический.
23. Павел Романов (Pawlick) 8 09.12.16 01:54 Сейчас в теме
1С не работает с соответствием


С какого числа?

Проверил: Платформа 1С:Предприятие 8.3 (8.3.8.1784)

Соответствие = Новый Соответствие;

Работает!!!

...Фух... Перепугался даже
24. Sergey Andreev (starik-2005) 860 09.12.16 12:37 Сейчас в теме
(23) это если выдирать из контекста, то работает, а если с контекстом - нет )))
25. Максим Кузнецов (Makushimo) 149 23.01.17 05:38 Сейчас в теме
26. Сергей (Sergafan10) 23.01.17 09:56 Сейчас в теме
В своё время изъябывался изменением запроса в ИсточникДанных.