Ничего нового и оригинального не предлагаю, минимум изменений в форму списка общего журнала. Зато пользователям очень удобно: можно открыть общий журнал с отбором по контрагенту, через стандартное меню - второй по складу, третий - по приходным накладным...
Идея такова: Журнал (или любая другая форма) первично открывается из меню. При повторном выборе в меню активизируется уже открытая форма с выполнением процедура модуля формы ПриПовторномОткрытии(). Вот здесь и поработаем...
Процедура ПриПовторномОткрытии() Если ПустоеЗначение(Форма.Параметр)=1 Тогда // это вызов из меню СтатусВозврата(0); // отменяем его ОткрытьФорму("Журнал.ЖурналОбщий.ФормаСписка#"); // и открываем новую форму сами - # Возврат; КонецЕсли; // прочие операторы ПриПовторномОткрытии() КонецПроцедуры
Можно не изменять модуль, изменить настройку меню, см. комментарий 11 от poppy. Кратче и талантливее.
II. "Гибкие" закладки.
Идея, навеянная подсказкой VasilyKushnir и Фокусником: закладки. Можно, не задумываясь, использовать метод "ЗакладкиОтбора()", однако, повторю свое скромное мнение, он не совсем удобен из-за большого количества значений отбора и, соответственно, появляющихся закладок.
В чем заключается идея:
1. Закладки создавать программно.
2. Использовать историю отборов, и, по мере того, как пользователь будет менять вид и значение отбора, создавать закладки.
Собственно, код в форме списка общего журнала ТиС
Перем ЛокЗакладки; // добавленная нами переменная модуля //... далее функции и процедуры общего журнала Процедура ПриУстановкеБыстрогоОтбора() // встроенная процедура, вызывается при смене вида отбора Перем ТекущДок; // добавляем в нее наши новые переменные Перем ТекИмяОтбора; Перем ТекЗначОтбора; Перем ТекЗакладка; Перем ЧтоИщем; // ... операторы процедуры // ... добавляем наши строки кода в конец процедуры ПолучитьОтбор(ТекИмяОтбора,ТекЗначОтбора); // получили отбор Если Форма.ИспользоватьЗакладки() = 0 Тогда // если первое обращение тогда создаем закладки Форма.ИспользоватьЗакладки(1); ЛокЗакладки = СоздатьОбъект("СписокЗначений"); КонецЕсли; ЧтоИщем = "" + ТекИмяОтбора + РазделительСтрок + ЗначениеВСтрокуВнутр(ТекЗначОтбора); ТекЗакладка = ЛокЗакладки.НайтиЗначение(ЧтоИщем); // а может закладка уже создана? Если ТекЗакладка = 0 Тогда // нет, не создана, добавляем новую Форма.Закладки.ДобавитьЗначение(ЗначениеВВидеСтроки); ЛокЗакладки.ДобавитьЗначение(ЧтоИщем,"" + ВидОтбора.ТекущаяСтрока()); ТекЗакладка = Форма.Закладки.РазмерСписка(); КонецЕсли; Форма.Закладки.ТекущаяСтрока(ТекЗакладка); // визуально делаем закладку активной КонецПроцедуры // ПриУстановкеБыстрогоОтбора()
Далее нам нужно обработать выбор закладки с помощью предопределенной процедуры ПриВыбореЗакладки()
Допишем ее в модуль.
Процедура ПриВыбореЗакладки(НомЗакладки,ЗначЗакладки) Перем ТекИмяОтбора; Перем ТекЗначОтбора; Перем ТекВидОтбора; ТекИмяОтбора = ЛокЗакладки.ПолучитьЗначение(НомЗакладки,ТекВидОтбора); ТекЗначОтбора = ЗначениеИзСтрокиВнутр(СтрПолучитьСтроку(ТекИмяОтбора,2)); // получили значение отбора ТекИмяОтбора = СтрПолучитьСтроку(ТекИмяОтбора,1); // получили имя отбора ТекВидОтбора = Число(ТекВидОтбора); // получили номер текущей строки вида отбора ВидОтбора.ТекущаяСтрока(ТекВидОтбора); // устанавливаем вид отбора на форме ЗначениеВВидеСтроки = ЗначЗакладки; // устанавливаем текст отбора на форме // устанавливаем отбор Если ПустоеЗначение(ТекИмяОтбора) = 1 Тогда УстановитьОтбор(""); ИначеЕсли ТипЗначенияСтр(ТекЗначОтбора) = "" Тогда УстановитьОтбор(ТекИмяОтбора,); Иначе УстановитьОтбор(ТекИмяОтбора,ТекЗначОтбора); КонецЕсли; КонецПроцедуры
И наслаждаемся дальше.