Открывать будем форму выбора документа Заявка на расход ДС.
Будем ставить три отбора:
1. Проведен = Истина;
2. Статус В списке "К оплате, согласован"
3. Хозяйственная операция В списке "Оплата поставщику, Возврат оплаты клиенту"
ВАЖНО! Все отборы устанавливаются на динамический список, который называется Список. Будьте внимательны, в некоторых документах он может называться по-другому, например, как на скрине ниже.
Перейдем к рассмотрению вариантов:
1. ПараметрыВыбора. Отбор настраивается заполнением параметров выбора самого поля. Это единственный вариант, где мы не устанавливаем СтандартнаяОбработка = Ложь и сами не открываем форму. Если у вас нет отборов "Не" и вам не нужны группы, то данный вариант подходит на 100%. Форма блокирует окно владельца. Установленные отборы просто так посмотреть не получится.
&НаКлиенте
Процедура ЗаявкаНаРасходованиеСредств1НачалоВыбора(Элемент, ДанныеВыбора, ВыборДобавлением, СтандартнаяОбработка)
// список статусов
СписокСтатусов = Новый СписокЗначений;
СписокСтатусов.Добавить(ПредопределенноеЗначение("Перечисление.СтатусыЗаявокНаРасходованиеДенежныхСредств.КОплате"));
СписокСтатусов.Добавить(ПредопределенноеЗначение("Перечисление.СтатусыЗаявокНаРасходованиеДенежныхСредств.Согласована"));
// список хоз.операций
СписокХЗ = Новый СписокЗначений;
СписокХЗ.Добавить(ПредопределенноеЗначение("Перечисление.ХозяйственныеОперации.ВозвратОплатыКлиенту"));
СписокХЗ.Добавить(ПредопределенноеЗначение("Перечисление.ХозяйственныеОперации.ОплатаПоставщику"));
// вот они все три отбора
НовыйПараметр = Новый ПараметрВыбора("Отбор.Статус", СписокСтатусов);
НовыйПараметр1 = Новый ПараметрВыбора("Отбор.Проведен", Истина);
НовыйПараметр2 = Новый ПараметрВыбора("Отбор.ХозяйственнаяОперация", СписокХЗ);
//
НовыйМассив = Новый Массив();
НовыйМассив.Добавить(НовыйПараметр);
НовыйМассив.Добавить(НовыйПараметр1);
НовыйМассив.Добавить(НовыйПараметр2);
НовыеПараметры = Новый ФиксированныйМассив(НовыйМассив);
Элементы.ЗаявкаНаРасходованиеСредств1.ПараметрыВыбора = НовыеПараметры;
КонецПроцедуры
2. ПараметрыФормы. Самый распространенный вариант, когда мы в параметры формы передаем Структуру одним из элементов которой является "ОТБОР" с типом Структрура. Здесь нам уже приходится установить СтандартнаяОбработка = Ложь и открыть свою форму. Нам уже доступен выбор как открыть форму: Независимо, Блокировать окно владельца, Блокировать весь интерфейс
&НаКлиенте
Процедура ЗаявкаНаРасходованиеСредствНачалоВыбора(Элемент, ДанныеВыбора, ВыборДобавлением, СтандартнаяОбработка)
//
СтандартнаяОбработка = Ложь;
//
СписокСтатусов = Новый СписокЗначений;
СписокСтатусов.Добавить(ПредопределенноеЗначение("Перечисление.СтатусыЗаявокНаРасходованиеДенежныхСредств.КОплате"));
СписокСтатусов.Добавить(ПредопределенноеЗначение("Перечисление.СтатусыЗаявокНаРасходованиеДенежныхСредств.Согласована"));
//
// список хоз.операций
СписокХЗ = Новый СписокЗначений;
СписокХЗ.Добавить(ПредопределенноеЗначение("Перечисление.ХозяйственныеОперации.ВозвратОплатыКлиенту"));
СписокХЗ.Добавить(ПредопределенноеЗначение("Перечисление.ХозяйственныеОперации.ОплатаПоставщику"));
// Структура, которую мы закинем в Отбор
ОтборФ = Новый Структура("Статус,Проведен,ХозяйственнаяОперация",СписокСтатусов,Истина,СписокХЗ);
//
Парам = Новый Структура("Отбор,ЗакрыватьПриЗакрытииВладельца,ТекущаяСтрока",ОтборФ,Истина,ЗаявкаНаРасходованиеСредств);
//
Форма = ОткрытьФорму("Документ.ЗаявкаНаРасходованиеДенежныхСредств.ФормаВыбора",Парам,Элемент,Новый УникальныйИдентификатор,,,,РежимОткрытияОкнаФормы.Независимый);
//
// если до этого пользователь установил Пользовательские настройки, то могжет появится ошибка о том что невозможно установить отбор, поэтому отключим отбор пользователя
ПользовательскийОтбор = Форма.Список.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.Найти(Форма.Список.КомпоновщикНастроек.Настройки.Отбор.ИдентификаторПользовательскойНастройки);
Для Каждого ЭлТа из ПользовательскийОтбор.Элементы Цикл
ЭлТа.Использование = Ложь;
КонецЦикла;
КонецПроцедуры
3. ФиксированныеНастройки. Пожалуй, самый неизвестный и сложный вариант. В этом варианте мы передаем в параметры формы структуру, в которую входит элемент ФиксированныеНастройки с типом НастройкиКомпоновкиДанных. Здесь нам уже доступны различные виды сравнения, которые были не доступны в первых двух вариантах, например часто нужен вид В Иерархии. Здесь так же возможно добавлять Группы в отборы, что отображено в коде. Обработка выбора реализуется с помощью объекта ОписаниеОповещения, что в принципе дает возможность реализовать множественный выбор для каких-то специфических целей. Форма блокирует окно владельца и добиться видимости отборов не получилось.
////////////////////////////////////// НастройкиКомпоновкиДанных /////////////////////////////////////////////
&НаКлиенте
Процедура ЗаявкаНаРасходованиеСредств4НачалоВыбора(Элемент, ДанныеВыбора, ВыборДобавлением, СтандартнаяОбработка)
//
СтандартнаяОбработка = Ложь;
//
СписокСтатусов = Новый СписокЗначений;
СписокСтатусов.Добавить(ПредопределенноеЗначение("Перечисление.СтатусыЗаявокНаРасходованиеДенежныхСредств.КОплате"));
СписокСтатусов.Добавить(ПредопределенноеЗначение("Перечисление.СтатусыЗаявокНаРасходованиеДенежныхСредств.Согласована"));
//
НастройкиКомпоновки = Новый НастройкиКомпоновкиДанных;
///Если хотим несколько условий
ЭлементОтбора = НастройкиКомпоновки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.Использование = Истина;
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Проведен");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = Истина;
//
ЭлементОтбора = НастройкиКомпоновки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.Использование = Истина;
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Статус");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке;
ЭлементОтбора.ПравоеЗначение = СписокСтатусов;
ЭлементОтбора.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный; // строка не имеет значения, отбор не виден и не доступен для редактирования
// группа ИЛИ
ГруппаОтбора = НастройкиКомпоновки.Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
ГруппаОтбора.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИли;
ЭлементОтбора = ГруппаОтбора.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ХозяйственнаяОперация");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.Использование = Истина;
ЭлементОтбора.ПравоеЗначение = ПредопределенноеЗначение("Перечисление.ХозяйственныеОперации.ОплатаПоставщику");
ЭлементОтбора = ГруппаОтбора.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ХозяйственнаяОперация");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.Использование = Истина;
ЭлементОтбора.ПравоеЗначение = ПредопределенноеЗначение("Перечисление.ХозяйственныеОперации.ВозвратОплатыКлиенту");
ПараметрыВыбора = Новый Структура;
ПараметрыВыбора.Вставить("ФиксированныеНастройки", НастройкиКомпоновки);
ПараметрыВыбора.Вставить("РежимВыбора",Истина);
ПараметрыВыбора.Вставить("МножественныйВыбор",Ложь);
ПараметрыВыбора.Вставить("ТекущаяСтрока",ЗаявкаНаРасходованиеСредств);
ОбработкаВыбора = Новый ОписаниеОповещения("ПриЗакрытииФормыВыбора", ЭтаФорма,"Подбор");
Форма = ОткрытьФорму("Документ.ЗаявкаНаРасходованиеДенежныхСредств.ФормаВыбора",ПараметрыВыбора,
Элемент, , , , ОбработкаВыбора);
//
ПользовательскийОтбор = Форма.Список.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.Найти(Форма.Список.КомпоновщикНастроек.Настройки.Отбор.ИдентификаторПользовательскойНастройки);
Для Каждого ЭлТа из ПользовательскийОтбор.Элементы Цикл
ЭлТа.Использование = Ложь;
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура ПриЗакрытииФормыВыбора(Значение,ДопПараметры) Экспорт
//
Если Значение = Неопределено Тогда
Возврат;
КонецЕсли;
ЗаявкаНаРасходованиеСредств = Значение;
КонецПроцедуры
4. ПользовательскиеНастройки. В этом варианте мы уже видим наши отборы в настройках формы, а при желании можем их вывести и в быстрые отборы над списком. Можно добавлять Группы в отборы. Но мне так и не удалось сделать такой отбор недоступным для редактирования. На скрине отбор Статусов реализован через список значений, отбор Проведен добавлен в быстрые отборы, а отбор хоз. операции реализован через группу ИЛИ.
////////////////////////////// Пользовательская настройка группа ИЛИ ///////////////////////////////////////////////////
&НаКлиенте
Процедура ЗаявкаНаРасходованиеСредств3НачалоВыбора(Элемент, ДанныеВыбора, ВыборДобавлением, СтандартнаяОбработка)
//
СтандартнаяОбработка = Ложь;
//
СписокСтатусов = Новый СписокЗначений;
СписокСтатусов.Добавить(ПредопределенноеЗначение("Перечисление.СтатусыЗаявокНаРасходованиеДенежныхСредств.КОплате"));
СписокСтатусов.Добавить(ПредопределенноеЗначение("Перечисление.СтатусыЗаявокНаРасходованиеДенежныхСредств.Согласована"));
//
Парам = Новый Структура("ЗакрыватьПриЗакрытииВладельца,ТекущаяСтрока",Истина,ЗаявкаНаРасходованиеСредств);
Форма = ОткрытьФорму("Документ.ЗаявкаНаРасходованиеДенежныхСредств.ФормаВыбора",Парам,Элемент,Новый УникальныйИдентификатор,,,,РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
//
ПользовательскийОтбор = Форма.Список.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.Найти(Форма.Список.КомпоновщикНастроек.Настройки.Отбор.ИдентификаторПользовательскойНастройки);
ПользовательскийОтбор.Элементы.Очистить(); //Очищаются ранее установленные нстройки
//
ОтборСтатус = ПользовательскийОтбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборСтатус.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке;
ОтборСтатус.Использование = Истина;
ОтборСтатус.ИдентификаторПользовательскойНастройки = "В Списке"; //Произвольный текст
ОтборСтатус.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Статус");
ОтборСтатус.ПравоеЗначение = СписокСтатусов;
ОтборСтатус.РежимОтображения = ?(РазрешеноМенять = 0,РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный,РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный);
//
ОтборПроведен = ПользовательскийОтбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборПроведен.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборПроведен.Использование = Истина;
ОтборПроведен.ИдентификаторПользовательскойНастройки = "Проведен"; //Произвольный текст
ОтборПроведен.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Проведен");
ОтборПроведен.ПравоеЗначение = Истина;
ОтборПроведен.РежимОтображения = ?(РазрешеноМенять = 0,РежимОтображенияЭлементаНастройкиКомпоновкиДанных.БыстрыйДоступ,РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный);
//
ГруппаИли = ПользовательскийОтбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
ГруппаИли.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИли;
//
ОтборХЗ = ГруппаИли.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборХЗ.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборХЗ.Использование = Истина;
ОтборХЗ.ИдентификаторПользовательскойНастройки = "Хоз.операция"; //Произвольный текст
ОтборХЗ.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ХозяйственнаяОперация");
ОтборХЗ.ПравоеЗначение = ПредопределенноеЗначение("Перечисление.ХозяйственныеОперации.ОплатаПоставщику");
ОтборХЗ.РежимОтображения = ?(РазрешеноМенять = 0,РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный,РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный);
//
ОтборХЗ1 = ГруппаИли.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборХЗ1.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборХЗ1.Использование = Истина;
ОтборХЗ1.ИдентификаторПользовательскойНастройки = "Хоз.операция"; //Произвольный текст
ОтборХЗ1.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ХозяйственнаяОперация");
ОтборХЗ1.ПравоеЗначение = ПредопределенноеЗначение("Перечисление.ХозяйственныеОперации.ВозвратОплатыКлиенту");
ОтборХЗ1.РежимОтображения = ?(РазрешеноМенять = 0,РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный,РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный);
//
КонецПроцедуры
5. Используем Общий модуль. Если у вас типовая конфигурация. то возможно в ней есть вот такая процедура ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка. Здесь тоже есть возможность устанавливать отборы с любым видом сравнения. В этом варианте вы можете выбрать будет ли доступен отбор для редактирования пользователем. Но опять мы получаем вариант, когда недоступный отбор и не виден, что не совсем хорошо.
В примере отбор Проведен всегда добавляется в быстрые отборы, а два других обора, либо быстрый доступ , либо недоступный в зависимости от переключателя.
///////////////////////////////////// УстановитьЭлементОтбораДинамическогоСписка //////////////////////////////////////////////
&НаКлиенте
Процедура ЗаявкаНаРасходованиеСредств5НачалоВыбора(Элемент, ДанныеВыбора, ВыборДобавлением, СтандартнаяОбработка)
//
СтандартнаяОбработка = Ложь;
//
СписокСтатусов = Новый СписокЗначений;
СписокСтатусов.Добавить(ПредопределенноеЗначение("Перечисление.СтатусыЗаявокНаРасходованиеДенежныхСредств.КОплате"));
СписокСтатусов.Добавить(ПредопределенноеЗначение("Перечисление.СтатусыЗаявокНаРасходованиеДенежныхСредств.Согласована"));
//
СписокХЗ = Новый СписокЗначений;
СписокХЗ.Добавить(ПредопределенноеЗначение("Перечисление.ХозяйственныеОперации.ВозвратОплатыКлиенту"));
СписокХЗ.Добавить(ПредопределенноеЗначение("Перечисление.ХозяйственныеОперации.ОплатаПоставщику"));
//
Парам = Новый Структура("ЗакрыватьПриЗакрытииВладельца,ТекущаяСтрока",Истина,ЗаявкаНаРасходованиеСредств);
//
Форма = ОткрытьФорму("Документ.ЗаявкаНаРасходованиеДенежныхСредств.ФормаВыбора",Парам,
Элемент);
//
ПользовательскийОтбор = Форма.Список.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.Найти(Форма.Список.КомпоновщикНастроек.Настройки.Отбор.ИдентификаторПользовательскойНастройки);
ПользовательскийОтбор.Элементы.Очистить();
//
ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(Форма.Список,"Статус",СписокСтатусов,ВидСравненияКомпоновкиДанных.ВСписке,,Истина,?(РазрешеноМенять = 0,РежимОтображенияЭлементаНастройкиКомпоновкиДанных.БыстрыйДоступ,РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный),Новый УникальныйИдентификатор);
ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(Форма.Список,"Проведен",Истина,ВидСравненияКомпоновкиДанных.Равно,,Истина,РежимОтображенияЭлементаНастройкиКомпоновкиДанных.БыстрыйДоступ,Новый УникальныйИдентификатор);
ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(Форма.Список,"ХозяйственнаяОперация",СписокХЗ,ВидСравненияКомпоновкиДанных.ВСписке,,Истина,?(РазрешеноМенять = 0,РежимОтображенияЭлементаНастройкиКомпоновкиДанных.БыстрыйДоступ,РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный),Новый УникальныйИдентификатор);
КонецПроцедуры
Пишем комментарии, ругаем, но не сильно, а кому понравилось, - скачиваем файл или просто копируем код.
Добавляем в избранное, чтобы не потерять.
Используется на платформе 8.3.23.2040, ЕРП - 2.5.12.238.
Если понравилось, то ниже еще несколько тем в том же ключе:
1. Выполнение в фоне дополнительной обработки
2. Регламентное задание с настройками
3. Форма списка Заказы поставщикам с выводом состава
4. Товары на складах по срокам хранения
5. Структура подчиненности деревом
6. Загрузка из Excel (любой таблицы) в ТЧ документа
7. Панель функций
8. Анализ номенклатуры для поддержания запаса на складе
9. Ведомость расчетов с поставщиками расширенная
10. Расшифровка отчета. Код, который я использую
11. Прикрепляем файл к новому документу (БСП). Простенькая шпаргалка
12. Создать на основании - своя кнопка (БСП). Проблема двух подменю Создать на основании