v8: Универсальные интерактивные команды для ссылочных объектовА иногда так хочется добавить какую-нибудь универсальную команду для всех документов или справочников. Но мысль об увеличении объема работы при обновлении каждый раз останавливает. | | Автор статьи: TormozIT | Редакторы: KAO111 Последняя редакция №65 от 31.08.06 | История URL: http://kb.mista.ru/article.php?id=272 | |
Ключевые слова: универсальные, команды, действия, объекты, ввод на основании, ссылки
Идея проста! Используем ввод на основании.
Разложим все по полочкам. В типовых конфигурациях 90% форм списков и форм объектов ссылочного типа на командной панели в подменю "Ввод на основании" содержат действие "(Ввести на основании)". Это действие в режиме предприятия замещается списком синонимов типов объектов, которые можно вводить на основании текущего объекта. Это обстоятельство предоставляет нам отличную возможность замечательного нецелевого использования этого списка.
Бонус
При обновлении почти никаких забот. Только в случае добавления новых объектов придется доставить для них галочки во вводе на основании.
Для ввода на основании доступны следующие ссылочные типы объектов (в порядке их расположения в списке ввода на основании):
- планы обмена
- справочники
- документы
- планы видов характеристик
- планы счетов
- планы видов расчета
- бизнес-процессы
- задачи
Таким образом, только для этих типов можно будет применять наши команды. Но этого уже вполне достаточно.
Принципиальной разницы нет, какой тип выбрать для объектов-команд.
Я выбрал планы обмена, т.к. они идут первыми в списке, который формирует платформы для ввода на основании. К тому же планы обмена - в общем самый маленький раздел из перечисленных, что добавляет дополнительные удобства. Чтобы легко отличать объекты-команды от обычных объектов конфигурации рекомендую начинать их имена с префиска, скажем "кмд".
Для наглядности возьмем и создадим 2 универсальные команды "Запомнить" и "Использовать". Первая будет сохранять ссылку. Вторая будет ее использовать в форме.
1. Команда "Запомнить".
Итак, создаем новый план обмена. Даем ему имя "кмдЗапомнить", синоним "Запомнить".
Открыв закладку ввода на основании, мы неприятно удивимся, что средств для групповой установки флажков в этом диалоге нет. Здесь нужно каждый флажок установить персонально. Однако есть альтернатива (спасибо KAO111) - в конфигураторе есть возможность сразу выбрать группу объектов для ввода на основании. Для этого необходимо открыть дополнительные свойства объекта конфигурации (Alt+Shift+Enter), перейти на закладку "Ввод на основании" и снять флажок "Только выбранные".
Теперь создаем основную форму объекта (узла обмена). Она будет нужна только для обработки события ПередОткрытием, так что избавляемся от излишеств. Закрываем конструктор. Открываем модуль формы. Ссылка на основание доступна здесь через свойство ПараметрОснование расширения формы. Таким образом, весь функционал можно разместить здесь и не использовать обработку заполнения.
Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
// Чтобы форма не открылась
Отказ = Истина;
// Может, ссылки еще не существует? надо сначала записать объект
Если ЗначениеНеЗаполнено(ПараметрОснование) Тогда
Предупреждение("Сначала запишите объект!");
Возврат;
КонецЕсли;
// Тут удобно передать основание в какой-нибудь отчет или обработку.
// Но в данном случае мы запоминаем его.
СохранитьЗначение("БуферОбмена.Ссылка", ПараметрОснование);
КонецПроцедуры
2. Команда "Использовать".
Аналогично создаем команду "Использовать".
Хотелось бы получить доступ к той форме (в случае формы объекта) или элементу формы (в случае формы списка), откуда вызвали команду. В модуле формы нам предоставляется такая возможность через использование свойства ВладелецФормы.
Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
// Чтобы форма не открылась
Отказ = Истина;
// Может, ссылки еще не существует? надо сначала записать объект
Если ЗначениеНеЗаполнено(ПараметрОснование) Тогда
Предупреждение("Сначала запишите объект!");
Возврат;
КонецЕсли;
лСсылка = ВосстановитьЗначение("БуферОбмена.Ссылка");
<Текст программы с использованием ВладелецФормы, ПараметрОснование и лСсылка>
КонецПроцедуры
Как поступить с теми формами, в которых нет подменю ввода на основании?
В случае, если флажок "Автозаполнение" у нужной командной панели формы отключен и разработчики формы не добавили туда подменю ввода на основании, вы не увидите нужного вам списка в режиме предприятия. В этом случае можно добавить его туда вручную, а можно использовать более элегантный метод, программно добавляющий необходимое подменю в обработчике ПриОткрытии. Так как действие "(Ввести на основании)" является предопределенным, программно его создать, к сожалению, нельзя! Но можно обойти это ограничение. Создадим в одной из форм наших объектов-команд командную панель и добавим туда ввод на основании в режиме конфигуратора. Эта форма все равно никогда не открывается, так что используем ее как шаблон. Перед открытием нужной формы будем проверять наличие в заданной командной панели необходимого подменю, и, если его там не обнаружим, то скопируем его из нашей формы-шаблона.
Пример реализации:
Добавляем в форме объекта "кмдЗапомнить" командную панель "ДействияФормы".
Создаем там подменю с типом "Ввести на основании".
В глобальном модуле размещаем функцию
// Добавляет, если отсутствует, команду ввода на основании в командную панель формы.
//
// Параметры:
// пФорма – Форма - где расположена командная панель, в которую добавляем.
//
Процедура ЛксДобавитьВводНаОснованииВКоманднуюПанель(пФорма)
МассивИменКомандныхПанелей = Новый Массив;
МассивИменКомандныхПанелей.Добавить("ДействияФормы");
МассивИменКомандныхПанелей.Добавить("КоманднаяПанельФормы");
МассивИменКомандныхПанелей.Добавить("ОсновныеДействияФормы");
Для Каждого ИмяКоманднойПанели Из МассивИменКомандныхПанелей Цикл
КоманднаяПанель = пФорма.ЭлементыФормы.Найти(ИмяКоманднойПанели);
Если КоманднаяПанель <> Неопределено Тогда
Прервать;
КонецЕсли;
КонецЦикла;
Если КоманднаяПанель <> Неопределено Тогда
МакетФормы = ПланыОбмена.кмдЗапомнитьВБуфере.ПолучитьФормуНовогоУзла();
КоманднаяПанельМакета = МакетФормы.ЭлементыФормы.ДействияФормы;
КнопкаМакета = КоманднаяПанельМакета.Кнопки[0];
Если НЕ КоманднаяПанель.Автозаполнение Тогда
Кнопки = КоманднаяПанель.Кнопки;
Если КоманднаяПанель.ВыравниваниеКнопок = ВыравниваниеКнопокКоманднойПанели.Право Тогда
Индекс = 0;
Иначе
Индекс = Кнопки.Количество();
КонецЕсли;
Для Каждого КнопкаФормы Из Кнопки Цикл
Если КнопкаФормы.Текст = "На основании" Тогда
Индекс = Неопределено;
Прервать;
//ИначеЕсли КнопкаФормы.Текст = "Скопировать" Тогда
// Индекс = пКоманднаяПанель.Кнопки.Индекс(КнопкаФормы) + 1;
КонецЕсли;
КонецЦикла;
Если Индекс <> Неопределено Тогда
КнопкаВводаНаОсновании = Кнопки.Вставить(Индекс, "ПодменюНаОсновании" );
ЗаполнитьЗначенияСвойств(КнопкаВводаНаОсновании, КнопкаМакета, , "Имя, Действие, ПорядокКнопок");
КнопкаВводаНаОсновании.Кнопки.Добавить("Действие", ТипКнопкиКоманднойПанели.Действие, ,
КнопкаМакета.Кнопки[0].Действие);
КнопкаВводаНаОсновании.ПорядокКнопок = ПорядокКнопокКоманднойПанели.Возр;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецПроцедуры // ЛксДобавитьВводНаОснованииВКоманднуюПанель()
Теперь в теле обработчика ПриОткрытии любой формы можно вызывать эту процедуру. При отсутствии подменю ввода на основании она будет добавлять его в логический (в зависимости от типа выравнивания) конец найденной командной панели, список которых задан в массиве МассивИменКомандныхПанелей в порядке убывания приоритета. Алгоритм конечно предусматривает далеко не все возможные варианты, но на типовых отрабатывает почти всегда.
Итоги.
Полезность описанного метода создания универсальных интерактивных команд трудно переоценить. Пользуюсь этими командами каждый рабочий день! В платформах 8.0 и 8.1 на текущий момент отсутствует какая либо альтернатива этому методу.
Можно развить идею и сделать только один объект-команду. В него поместить все необходимые функции. А пользователю при активации этой команды предоставлять возможность выбора конкретной функции. Получится что то вроде универсального контекстного меню ссылочных объектов.
|