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