Универсальный 1С++ класс Faval для организации часто используемых элементов справочников и быстрого интерактивного доступ к ним




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

Установка

  1. Требуется зарегистрированная 1C++ и Miracle (если необходимо создавать кнопки на панелях форм справочника).
  2. Универсальная обработка поиска и отбора http://www.1cpp.ru/forum/YaBB.pl?num=1211491690, если есть желаение ее прикрутить ко всем справочникам.
  3. Регистрируем класс Faval в defcls.prm.
  4. Файлы картинок должны лежать в одной папке с классом.

Подключаем нужные справочники

Создаем экземляр класса Faval. Указываем какие справочники нужно мониторить:

Настройки = СоздатьОбъект(«УправлениеНастройками»); 

Попытка

Настройки.Включить(«ПерехватитьСобытияГК»);

oFavalГМ = СоздатьОбъект(«Faval»);

oFavalГМ.ИмяФайлаPoiskErt = КаталогИБ() + «ExtFormsСлужебныеPoisk.ert»; // Если есть необходимость вынести на панель еще и кнопку быстрого поиска

oFavalГМ.ДобавитьФэйворитДля(«Справочник.Номенклатура», 1); //второй параметр указывает на необходимость создания кнопок на панели инструментов формы списка кнопок после ее открытияя

oFavalГМ.ДобавитьФэйворитДля(«Справочник.Контрагенты»);

oFavalГМ.ДобавитьФэйворитДля(«Справочник.ТорговыеТочки»);

oFavalГМ.ДобавитьФэйворитДля(«Справочник.Отделы»);

oFavalГМ.ДобавитьФэйворитДля(«Справочник.ТоварныеГруппы»);

// Вместо регистрации каждого справочника выборочно можно сделать это для всех справочников конфигурации одним методом вместо пердыдущих строк

// oFavalГМ.ДобавитьФэйворитДляВсехСправочников(Знач аДобавитьКнопкиНаСтандартнуюПанель)

Перехватчик = СоздатьОбъект(«Перехватчик»);

Перехватчик.ПерехватитьСобытияГлобальногоМодуля(oFavalГМ);

Перехватчик.ВключитьРазбиениеДлинныхСтрокДляМетодаСообщить(); //Ликвидация проблем с длинными строками

Исключение

Перехватчик = «»;

Сообщить(«Не удалось инициализировать классы Перехватчик и Faval!», «!»);

КонецПопытки;

Если в конфигурации уже есть ПерехватитьСобытияГлобальногоМодуля, то можно попробовать пронаследовать ваш класс обработчик от Faval и обеспечить вызов его метода СобытиеГМ_СозданиеКонтекста(), если он перекрыт.

Выбор элемента из часто используемых в форме списка справоника

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

В код формы добавляем:

Перем oFaval;

Процедура ПослеОткрытия()

oFaval = СоздатьОбъект(«Faval»);

oFaval.СвязатьКнопкуФэйворитСРеквизитом(Контекст, «кнФэйворит»,, «oFaval», «[Значение], Артикул:[Значение.Артикул]»);

КонецПроцедуры // ПослеОткрытия

Последним параметром в метод СвязатьКнопкуФэйворитСРеквизитом опционально можно передать строку шаблон, которая будет применена для каждого элемента в списке часто используемых. Переменная значение содержит сам элемент.

Выбор элемента из часто используемых в реквизит формы отчета/обработки

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

Перем oFaval;

Процедура ПослеОткрытия()

oFaval = СоздатьОбъект(«Faval»); 

oFaval.СвязатьКнопкуФэйворитСРеквизитом(Контекст, «кнФНоменклатура», «поНоменклатура», «oFaval»);

oFaval.СвязатьКнопкуФэйворитСРеквизитом(Контекст, «кнФКонтрагент», «поКонтрагент», «oFaval»);

КонецПроцедуры // ПослеОткрытия

Использование класса напрямую

  1. Поле МаксДлинаСписка. Количество элементов в списке часто используемых для выбора пользователем. 
  2. Метод ВыбратьЗначение(Знач аФэйворитСписокИД, Знач аШаблонСтрВыбораВМеню = «»). Показывает меню с выбором часто используемых элементов справочника переданного в аФэйворитСписокИД. аШаблонСтрВыбораВМеню опеределяет шаблон каждой строки списка. См. выше.

История версий

2012-12-12
+ Возможность добавления кнопки выбора из списка часто используемых на стандартную панель формы списка справочника без
изменения кода формы справочника. Нужна зарегистрированная ВК Miracle.
+ Возможность добавления кнопки открытия обработки универсального поиска (http://www.1cpp.ru/forum/YaBB.pl?num=1211491690)
и отбора на стандартную панель формы списка справочника без изменения кода формы справочника. Нужна зарегистрированная ВК Miracle.
После создания классу нужно указать, где расположен .ert обработка
oFaval.ИмяФайлаPoiskErt = КаталогИБ() + «ExtFormsСлужебныеPoisk.ert»;
+ Метод .ДобавитьФэйворитДляВсехСправочников(Знач аДобавитьКнопкиНаСтандартнуюПанель) регистрации всех имеющих справочников.
Параметр оперделяет добавлять ли на панели форм списоков кнопки доступа. Иначе будет только формироваться списки часто
используемых элементов.

 

2012-12-06

+ В меню быстрого выбора вынесен отдельно последний использованный элемент.

2012-12-05

+ Возможность включения и отключения отбора в форме списка справочника по часто используемым элементам.
* Если в списке всего один элемент пользователю все равно предоставляется выбор из меню. Раньше происходил выбор элемента.

9 Comments

  1. Ёпрст

    сам список где хоть хранится ?

    Reply
  2. sournk

    Использую ВосстановитьЗначение() при необходимости показать список и СохранитьЗначение() при каждом его изменении. В классе есть ограничение на его максимальную длину. Сейчас 500 элементов, поэтому не думаю, что будут какие-то тормоза из-за такого.

    Reply
  3. Romarius

    Подобный функционал http://infostart.ru/public/104122/

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

    Reply
  4. alyuev

    Интереснее будет другая реализация.

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

    Reply
  5. sournk

    Такой сложный выбор последнего будет не очевиден для пользователя. Лучше вставлю в меню выбора еще один отдельный пункт с последним значением этого вида.

    Reply
  6. alyuev

    У тебя кнопка «Часто используемая номенклатура». У нас вместо неё маленькая с картинкой 15 и стрелкой вниз. Т.е. типа «Последние 15». Но помимо этого возможно сделать просто выбор элемента с нажатой Ctrl и тогда пользователю показывается этот список. Т.к. это работает через перехватчик — то и нет необходимости лепить везде кнопки «15», хотя, конечно, согласен — первоначально это удобно. Для тех, кто не знает еще про Ctrl.

    Reply
  7. rdv

    Объяни почему твой пример не работает, выскакивает сообщение что справочник пуст, да еще и это

    oFaval.СлужебныйВыбор = oFaval.ВыбратьЗначение(«Справочник.Контрагенты», » «); Если ПустоеЗначение(oFaval.СлужебныйВыбор) = 0 Тогда поКА <<?>>= oFaval.СлужебныйВыбор КонецЕсли;

    Ожидается логическое выражение

    Сколько раз надо выбрать елемент для того что бы он стал часто выбирающимся

    Reply
  8. sournk

    (7) Исправил обработку примера. Нельзя давать имена для реквизитов формы служебными словами! Было «поКА», что воспринималось как начало цикла. Неожиданный эффект.

    > Сколько раз надо выбрать елемент для того что бы он стал часто выбирающимся

    Каждому элементу считается количество раз его выбора. А в списке показывается их TOP. По дефолту 50. Можно изменить через поле класса МаксДлинаСписка.

    Reply
  9. rdv

    (8) Что то ты намутил с классом, похоже придется отладчиком воспользоваться, пока кроме что справочник пуст ничего, даже при изменении МаксДлинаСписка (, хотел в фабрику событий встроить, ладно будем ковыряться, если желание не отпадет.

    Итак, с вышенаписанным разобрались, теперь попробуем дальше.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *